單一職責原則(single responsibility principle)
簡稱SRP。There should never be more than one reason for a class to change.僅有一種原因引起類的改變。一個類只負責一個職責。
單一職責原則 這地址講的很好,但不是用python語言實現的,在這裏我用python語言實現一下。
問題由來:類A負責職責1和職責2,在正常運行中沒有出現任何問題,但當職責1改變時,需要修改類A,可能引起正常運行的職責2發生問題
解決方案:遵循單一職責原則,分別創建類A和類B來負責職責1和職責2。這樣設計當修改其一,並不會影響其二工作
在工程實踐中,隨着項目修改的變更或者其他原因,經常會出現職責擴散,比如類A原本負責職責1,但由於需求的變更,職責1被細分爲職責11和職責12,導致類A無法正常工作
實例代碼python實現
class Animal(object):
def __init__(self):
pass
def breathe(self, name):
print('%s 呼吸空氣' %name)
# caller
class Client(object):
def __init__(self):
pass
def work(self):
animal = Animal()
animal.breathe('牛')
animal.breathe('羊')
animal.breathe('豬')
if __name__ == '__main__':
client = Client()
client.work()
結果
牛 呼吸空氣
羊 呼吸空氣
豬 呼吸空氣
上述代碼實現了一個類Animal,僅僅實現了一個職責---------------breathe。客戶端調用後得到上面的結果。
但如果又增加了一種動物-----------魚,很明顯魚是不能呼吸空氣得的,因此要對類Animal進行修改,或者把類直接拆分爲兩個類分別實現水生動物的breathe和陸生動物的breathe.
改進1:類Animal中增加一個新的方法breathe1
class Animal(object):
def __init__(self):
pass
def breathe(self, name):
print('%s 呼吸空氣' %name)
def breathe1(self, name):
print('%s 呼吸水' %name)
# caller
class Client(object):
def __init__(self):
pass
def work(self):
animal = Animal()
animal.breathe('牛')
animal.breathe('羊')
animal.breathe('豬')
animal.breathe1('魚')
if __name__ == '__main__':
client = Client()
client.work()
結果
牛 呼吸空氣
羊 呼吸空氣
豬 呼吸空氣
魚 呼吸水
改進2:把類Animal拆分爲兩個類分別負責陸生動物呼吸和水生動物呼吸
代碼入下:
class Terrestrialanimal(object):
def __init__(self):
pass
def breathe(self, name):
print('%s 呼吸空氣' %name)
class Aquatic(object):
def __init__(self):
pass
def breathe(self, name):
print('%s 呼吸水' %name)
# caller
class Client(object):
def __init__(self):
pass
def work(self):
terrestrialanimal = Terrestrialanimal()
terrestrialanimal.breathe('牛')
terrestrialanimal.breathe('羊')
terrestrialanimal.breathe('豬')
aquatic = Aquatic()
aquatic.breathe('魚')
if __name__ == '__main__':
client = Client()
client.work()
結果
牛 呼吸空氣
羊 呼吸空氣
豬 呼吸空氣
魚 呼吸水