確保所有抽象類的名稱都帶有前綴「Abstract」的好習慣嗎?我應該命名我的所有抽象類AbstractFoo
回答
你可以但我傾向於不這樣做,因爲它是一個實現細節。
我不喜歡在類型名稱和標識符中添加實現細節信息,因爲這類信息將來可能會發生變化。在我看來,最好把事情說出來,而不是如何實施。
這取決於你的編碼習慣。
你也可以稱它們爲FooBase,或者只是Foo,如果你還沒有接口Foo的話。
FooBase是一個有吸引力的選擇 –
如果你考慮它是如何在.NET框架中,沒有。以例如抽象的Stream類爲例。類名中沒有任何內容表明它實際上是抽象的。
我覺得用這種方式命名類很有用。它發送一條消息,表明它們打算被分類;沒有實例化;包含子類通用的代碼等。
雖然這並不總是必要的。大多數程序員可能會將「Shape」標識爲抽象類,將「Square」,「Circle」等標識爲具體標識。但如果它不是很清楚,這是一個有用的提示。
你也應該遵循當地的編程習慣和風格指南。
我認爲這部分取決於你將如何使用這個類。如果僅用於強制派生類符合接口的內部使用,那麼在它之前添加Abstract可能不是一個壞主意。但是,如果您提供的Foo工廠將提供實際上爲SpecializedFoo1或SpecializedFoo2的Foo實例,那麼返回AbstractFoo實例似乎很尷尬。
我認爲這個命名約定只是因爲它很難拿出另一個好名字而被使用。如果您已經有一個名爲「List」的接口,那麼將如何命名「AbstractList」類?這更多的是避免名稱衝突,然後告訴實施細節。
這是一個經常被忽略的話題,也許是最重要的一點。此外,它導致了一個猶豫不決的時刻:有時,你可以爲超級抽象類提供一個很好的替代名稱。其他時候,你不能。你在同一個項目範圍內混合風格嗎? – crush
有點難以解釋,但我只用它來避免在功能類中複製/粘貼相同的代碼,而不是像域對象。
- AbstractServiceTestCase - >摘要前綴,似乎有幫助
- AbstractAnimal - >似乎不可思議的和無益的
你應該ofcourse自己決定,只要相同的約定之後在整個項目。
到目前爲止的答案是非常有用的,並顯示負責任的傳播傳播。我傾向於同意名稱不應該指示實現(Foo
可能是後來移動到接口的抽象類)。然而,對於編碼具有需要爲派生類提供方法的視覺線索時,它非常有用。
作爲一個例子,我現在有一個hieararchy(不要詢問名稱的基本原理,但它們在上下文中是有意義的,並映射到XML元素名稱上)。我使用Java,但我想大多數語言與此類似:
public abstract class Marker {...}
public class Template extends Marker {...}
public class Regex extends Marker {...}
我現在趨向於:
public abstract class Marker {...}
public class TemplateMarker extends Marker {...}
public class RegexMarker extends Marker {...}
而不是
public abstract class AbstractMarker {...}
public class Template extends AbstractMarker {...}
public class Regex extends AbstractMarker {...}
或
public abstract class AbstractMarker {...}
public class TemplateMarker extends AbstractMarker {...}
public class RegexMarker extends AbstractMarker {...}
我個人可以記住Marker
是一個抽象的功能概念,並且子類是具體的實現。
我不會把抽象類摘要,原因如下:
每矩形是形狀。在任何你可以使用Shape的地方,你都可以使用Rectangle。與矩形(但也可以處理圈子)交易代碼可能看起來像:
Shape s = .....;
s.drawTo(myGraphicsContext);
使用對象(如矩形)的任何地方,你可以用它的推廣(如形狀)是重要的部分面向對象的概念,並且被稱爲Liskov Substitution Principle。 (也很明顯:什麼樣的句子或邏輯會形成關於形狀的陳述,但是不適用於矩形?)
如果您將泛化名稱命名爲AbstractShape,則違反此原則。矩形不是AbstractShape。如果有的話,它是一個「具體形狀」!矩形不是抽象的(「我不知道這是什麼類型的形狀,可以是矩形,也可以是其他任何形狀。」)。代碼中使用AbstractShape然後讀取錯誤:
AbstractShape s = new Rectangle(...);
我的博客上就這一議題here更多的心思。
ShapeShape將是一個接口,而AbstractShape將是抽象類。 '類Rectangle擴展AbstractShape'和'類AbstractShape實現Shape';或'類Rectangle擴展AbstractShape實現Shape';最適合你的場景。 – crush
- 1. 我應該真的抽象一切
- 2. 我們應該擴展抽象類的JavaDoc類嗎?
- 3. 抽象類命名約定
- 4. 我應該使用抽象類還是使用類?
- 5. 抽象類是否應該至少有一個抽象方法?
- 6. 我應該如何命名我的CSS類?
- 7. 我應該如何在CakePHP中命名我的表/類
- 8. 我應該怎樣命名我的PHP類文件?
- 9. 我應該密封所有我認爲不應該用作基類的類嗎?
- 10. 我應該在抽象類實現接口時創建抽象方法嗎?
- 11. 我應該在哪裏測試抽象類的方法?
- 12. 我該如何繼承我的抽象類?
- 13. 我應該如何用Moq嘲笑這個抽象類?
- 14. 我應該如何使用Parcelable進行抽象類?
- 15. 我應該創建靜態方法還是抽象超類
- 16. 我應該使用什麼接口或抽象類?
- 17. 接口中的方法命名應該具體還是抽象?
- 18. 抽象類的命名約定?
- 19. 命名 - 我應該避免給對象同名嗎?
- 20. 我應該如何抽象另一個對象擁有的對象的集合?
- 21. 在我上有一個抽象類的現有庫擴展一個抽象類
- 22. 類命名,我應該命名一個類,並將屬性或將該屬性放入類名
- 23. 當我有多個Unit-Of-Work實現時,我應該如何抽象出我的業務級別類?
- 24. 「不能實例化抽象類......與抽象方法」的類不應該有任何抽象方法
- 25. 我應該命名「makefile」還是「Makefile」?
- 26. 命名的PHP 5.3接口/抽象類(使用命名空間)
- 27. 我們所有的模型類應該是案例類嗎?
- 28. 在WebStorm 2016年,我該如何重新命名命名在所有文件中
- 29. 我應該如何命名一個「可重用」對象?
- 30. 我應該使所有類型的通用接口的類,我依靠嗎?
這一點是在像書籍Clean Code,我傾向於同意。 –