乙個類只負責乙個功能領域中的相應職責,或者可以定義為:就乙個類而言,應該只有乙個引起它變化的原因。例如,搓衣板,既可以用來跪,也可以用來洗衣服。而在單一職責原理下,搓衣板的兩個功能就是引起這個類變化的兩個原因,就應該寫成兩個類
""
" 單一職責原則 "
""class person(object):
""" 人類 "
"" def duty(self, one):
""" coder 的職責是寫** ,農民就負責鬥地主,其餘的學習 "
""return one is "coder" and "coding" or one is "farmer" and "chinese poker" or "studying"
if __name__ ==
'__main__'
: p = person(
) print(p.duty(
"coder"
))
此時如果細分責任到每乙個人,豈不是一堆的判斷,肯定不科學,所以盡量讓乙個類或者乙個模組做一件事
""
" 單一職責原則 "
""class person(object):
""" 人類 "
"" def duty(self, one):
""" coder 的職責是寫** ,農民就負責鬥地主,其餘的學習 "
""return one is "coder" and "coding" or one is "farmer" and "chinese poker" or "studying"
class coder(person):
""" 農民 "
"" def duty(self):
""" coder 的職責是寫** "
""return
"coding"
class farmer(person):
""" 程式設計師 "
"" def duty(self):
""" 農民就負責鬥地主 "
""return
"chinese poker"
if __name__ ==
'__main__'
: c = coder(
) print(c.duty(
)) f = farmer(
) print(f.duty(
))
任何基類可以出現的地方,子類一定可以出現。 lsp是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為
# -*- coding: utf-8 -*-
import abc
import
time
""" 黎克特制替換原則 "
""hour = 3600
class person(object):
""" 人類 "
"" @abc.abstractmethod
def duty(self):
""" 職責 "
"" pass
class coder(person):
""" 程式設計師 "
"" def duty(self):
""" coder 的職責是寫** "
""return
"coding"
def sleep(self):
""" 有時睡5小時 "
"" time.sleep(5*hour)
class farmer(person):
""" 程式設計師 "
"" def duty(self):
""" 農民就負責鬥地主 "
""return
"chinese poker"
def sleep(self):
""" 農民可以睡八小時 "
"" time.sleep(8*hour)
介面隔離原則表明客戶端不應該被強迫實現一些他們不會使用的介面,應該把胖介面中的方法分組,然後用多個介面代替他,每乙個介面服務與乙個子模組(與單一職責原則有類似的思想)
通過使用介面隔離原則,本例項重構後的結構如圖2所示
實現開放-封閉原則的核心思想是對抽象程式設計,而不對具體程式設計,因為抽象相對穩定。讓類依賴於固定的抽象,這樣的修改是封閉的;而通過物件導向的繼承和多型機制,可以實現對抽象體的繼承,通過覆寫其方法來改變固有行為,實現新的拓展方法,所以對於拓展是開放的。
""
"開放封閉原則"""
import abc
"""定義乙個抽象的介面(介面是開放的)"
""class process(metaclass=abc.abcmeta):
@abc.abstractmethod
def process(self):
"""必須實現乙個功能"
"" pass
"""實現對介面的拓展"
""""
"解碼功能"
""class playerencode(process):
def process(self):
return
"encoding..."
"""輸出流功能"
""class playeroutput(process):
def process(self):
return
"ouputing..."
"""定義執行緒排程管理類"
""class playprocess(object):
def __init__(self):
self.message = none
"""判斷某個物件或類是否繼承於某個類"
"" def ischildof(self,obj, cls):
try:
for i in obj.__bases__:
if i is cls or isinstance(i, cls):
return true
for i in obj.__bases__:
if self.ischildof(i, cls):
return true
except attributeerror: #當是物件時捕獲的異常
return self.ischildof(obj.__class__, cls)
return false
def callback(self,event):
self.message = event.click(
)if self.ischildof(self.message,process):
return self.message.process()""
"實現乙個mp4產品(產品功能是封閉的)"
""class mp4(object):
def work(self):
playprocessojb = playprocess(
) print(playprocessojb.callback(event(
"encode")))
print(playprocessojb.callback(event(
"output")))
"""工廠類"
""class event(object):
def __init__(self,msg):
self.__m = msg
def click(self):
if self.__m ==
"encode"
:return playerencode(
)elif self.__m ==
"output"
:return playeroutput(
)mp4 = mp4(
)mp4.work(
)
每個介面中不存在子類用不到卻必須實現的方法,如果不然就要將介面拆分,使用多個隔離的介面,比使用單個介面(多個介面方法集合到乙個介面)。低耦合,高內聚。無論是面向過程程式設計還是物件導向程式設計,只有使各個模組之間的耦合盡量的低,才能提高**的復用率。低耦合的優點不言而喻,要做到低耦合,正是迪公尺特法則要去完成的。 設計模式六大原則
0.05 設計模式 設計模式 規範 筆記 大話設計模式 物件導向的關鍵在於封裝,封裝好了才能很好的復用,達到單一職責和開放擴充套件 封閉更改的效果。1 單一職責原則 就乙個類而言,應該僅有乙個引起它變化的原因.增加功能不應該修改已有的 避免修改出錯及重複測試.如果你能夠想到多於乙個的動機去改變乙個類...
設計模式六大原則
0.05 設計模式 設計模式 規範 筆記 大話設計模式 物件導向的關鍵在於封裝,封裝好了才能很好的復用,達到單一職責和開放擴充套件 封閉更改的效果。1 單一職責原則 就乙個類而言,應該僅有乙個引起它變化的原因.增加功能不應該修改已有的 避免修改出錯及重複測試.如果你能夠想到多於乙個的動機去改變乙個類...
設計模式六大原則
參考文章 單一職責原則 single responsibility principle,srp 乙個類只負責乙個功能領域中的相應職責,或者可以定義為 就乙個類而言,應該只有乙個引起它變化的原因。開閉原則 open closed principle,ocp 乙個軟體實體應當對擴充套件開放,對修改關閉。...