2009-09-15 75 views

回答

8

你可以但我傾向於不這樣做,因爲它是一個實現細節。

我不喜歡在類型名稱和標識符中添加實現細節信息,因爲這類信息將來可能會發生變化。在我看來,最好把事情說出來,而不是如何實施。

+0

這一點是在像書籍Clean Code,我傾向於同意。 –

3

這取決於你的編碼習慣。

你也可以稱它們爲FooBase,或者只是Foo,如果你還沒有接口Foo的話。

+0

FooBase是一個有吸引力的選擇 –

1

如果你考慮它是如何在.NET框架中,沒有。以例如抽象的Stream類爲例。類名中沒有任何內容表明它實際上是抽象的。

0

我覺得用這種方式命名類很有用。它發送一條消息,表明它們打算被分類;沒有實例化;包含子類通用的代碼等。

雖然這並不總是必要的。大多數程序員可能會將「Shape」標識爲抽象類,將「Square」,「Circle」等標識爲具體標識。但如果它不是很清楚,這是一個有用的提示。

你也應該遵循當地的編程習慣和風格指南。

0

我認爲這部分取決於你將如何使用這個類。如果僅用於強制派生類符合接口的內部使用,那麼在它之前添加Abstract可能不是一個壞主意。但是,如果您提供的Foo工廠將提供實際上爲SpecializedFoo1或SpecializedFoo2的Foo實例,那麼返回AbstractFoo實例似乎很尷尬。

4

我認爲這個命名約定只是因爲它很難拿出另一個好名字而被使用。如果您已經有一個名爲「List」的接口,那麼將如何命名「AbstractList」類?這更多的是避免名稱衝突,然後告訴實施細節。

+0

這是一個經常被忽略的話題,也許是最重要的一點。此外,它導致了一個猶豫不決的時刻:有時,你可以爲超級抽象類提供一個很好的替代名稱。其他時候,你不能。你在同一個項目範圍內混合風格嗎? – crush

1

有點難以解釋,但我只用它來避免在功能類中複製/粘貼相同的代碼,而不是像域對象。

  • AbstractServiceTestCase - >摘要前綴,似乎有幫助
  • AbstractAnimal - >似乎不可思議的和無益的

你應該ofcourse自己決定,只要相同的約定之後在整個項目。

0

到目前爲止的答案是非常有用的,並顯示負責任的傳播傳播。我傾向於同意名稱不應該指示實現(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是一個抽象的功能概念,並且子類是具體的實現。

1

我不會把抽象類摘要,原因如下:

矩形形狀。在任何你可以使用Shape的地方,你都可以使用Rectangle。與矩形(但也可以處理圈子)交易代碼可能看起來像:

Shape s = .....; 
s.drawTo(myGraphicsContext); 

使用對象(如矩形)的任何地方,你可以用它的推廣(如形狀)是重要的部分面向對象的概念,並且被稱爲Liskov Substitution Principle。 (也很明顯:什麼樣的句子或邏輯會形成關於形狀的陳述,但是不適用於矩形?)

如果您將泛化名稱命名爲AbstractShape,則違反此原則。矩形不是AbstractShape。如果有的話,它是一個「具體形狀」!矩形不是抽象的(「我不知道這是什麼類型的形狀,可以是矩形,也可以是其他任何形狀。」)。代碼中使用AbstractShape然後讀取錯誤:

AbstractShape s = new Rectangle(...); 

我的博客上就這一議題here更多的心思。

+0

ShapeShape將是一個接口,而AbstractShape將是抽象類。 '類Rectangle擴展AbstractShape'和'類AbstractShape實現Shape';或'類Rectangle擴展AbstractShape實現Shape';最適合你的場景。 – crush

相關問題