2014-01-29 54 views
1

維基百科:單一責任原則如何與貓狗相關?

馬丁界定責任的理由去改變,並得出結論 一個類或模塊應該有一個,且只有一個理由 變化。

但是,每次你看到一個面向對象的比喻時,他們指的貓狗,他們怎麼會有像這樣的屬性和方法:

class Dog extends Animal{ 
    public breed; 
    public dogYears; 

    public function bark(); 
    public function move(); 
    public function sleep(); 
    etc, etc... 
} 

我找到實現樹皮更好的辦法,所以我這樣做。我看到狗不能正常移動,所以我解決了這個問題。等等。改變班級的原因不止一個。

那麼,爲什麼這個比喻總是被使用?遵守SRP會是更好的方式嗎?

回答

4

不要直截了當地說。

在你的例子中,狗是負責執行現實生活中的「狗的行爲」,如吠叫,移動和睡覺。您可以將此視爲一個責任。 SRP聲明Dog不應該負責執行任何非狗動作,例如記錄他的動作。

如果您決定更改日誌記錄機制,這可以防止您必須更改Dog類 - 因爲執行「狗操作」和日誌記錄是兩個完全不同的職責。

+2

確實。否則,每一個動作都應該被提取到它自己的類中。想要增量變量?創建VariableIncrementor實例:) –

+0

謝謝。如果我想讓'狗'和'貓'一起玩? 「Dog」類內部和「Cat」類內部的方法是否可行 - 或者是否應該爲這個操作提供一個'class Interact',與兩個類分開? – tgun926

+0

@ tgun926這真的取決於你想要建模的東西,在做出明智的決定之前,我需要更大的圖片。但通常情況下,我不希望'Dog'與「Cat」耦合。如果有的話,我會讓它與抽象的「動物」交互。 – dcastro