比方說,我有一個List<Apple>
對象,每個蘋果都有一個顏色。Java OO - 提供與其他對象交互的新方法的對象?
我實現了用輸入構建蘋果對象列表的另一個對象。我可能會在這個對象上實現功能,例如「讓我知道綠蘋果的數量」,並且我可以在不知道該對象的內部表示的情況下調用它。
你會說這個人嗎?它看起來像基本的面向對象,但是我在考慮描述性名稱時遇到了麻煩。
比方說,我有一個List<Apple>
對象,每個蘋果都有一個顏色。Java OO - 提供與其他對象交互的新方法的對象?
我實現了用輸入構建蘋果對象列表的另一個對象。我可能會在這個對象上實現功能,例如「讓我知道綠蘋果的數量」,並且我可以在不知道該對象的內部表示的情況下調用它。
你會說這個人嗎?它看起來像基本的面向對象,但是我在考慮描述性名稱時遇到了麻煩。
既然你正在談論一個List<Apple>
的可能性是你也在談論Collection<Apple>
(列表繼承集合)。
如果你想強調「收藏」,那麼我會命名爲「收藏」。傳統上蘋果是以布什爾的名義出售的,但你不關心測量,所以我會用更通用的(不是尺寸相關的)術語「籃子」。
public class Basket {
private int greenCount;
public void addApple(Apple apple) {
if (apple.isGreen()) {
greenCount++;
}
}
public int getGreenAppleCount() {
return greenCount;
}
}
這適當地捕捉了計算籃子內青蘋果的責任。
另一方面,實用程序似乎將任務的責任與特定類型綁定的對象分離。例如,我們來看一個假設的AppleCounterUtil
。
public class AppleCounterUtil {
public int getCount(Collection<Apple> apples, AppleCondition condition) {
int count = 0;
for (Apple apple : apples) {
if (condition.isSatisfied(apple)) {
count++;
}
}
}
}
,現在我們有一個很好的工具,它真的不保持計數,但每次從蘋果可能不同的名單還需要時間重新計算計數。
關鍵是後面的例子是不是面向對象的因爲沒有概念對象。說明沒有任何對象的理由是因爲包含效用的類缺乏狀態。對象是數據集合和密切相關的代碼。當你只有代碼時,可以有一個合理的說法,即你有一個名字空間函數而不是一個對象。
爲了再次看到差異,我們來比較兩個代碼片段。使用我們的第一個「籃子」的做法:
...
int greenOnes = basket.getGreenAppleCount();
basket.addApple(new GreenApple());
greenOnes = basket.getGreenAppleCount();
...
變得非常笨重,但是因爲我們是面向對象,我們可以很容易地添加一個Basket Listener
接口的Basket
public class Basket {
public void addListener(BasketListner listener) {
...
}
public void addApple(Apple apple) {
...
for (BasketListnener listner : listeners) {
listener.appleAdded(this);
}
}
}
... some other class ... implements BasketListener {
int greenOnes = 0;
...
public void appleAdded(Basket basket) {
greenOnes = basket.getGreenAppleCount();
}
}
,同時與實用爲導向技術
...
int greenOnes = AppleCounterUtil.getCount(apples, new GreenCountCondition());
apples.addApple(new GreenApple());
greenOnes = AppleCounterUtil.getCount(apples, new GreenCountCondition());
...
表面看起來很相似,直到您嘗試添加mo重新功能。在嘗試添加「蘋果列表監聽器」時,您很快意識到AppleCounterUtil
不負責維護計數,也不能被監聽。 「蘋果列表」也不是負責維護計數的工具,而通用列表通常呈現錯誤的傾聽界面。
不幸的是,當一個人獲得面向工具的時候,他們通常會嘗試通過添加更多的實用方法來解決問題。這最終可能意味着具體的問題(管理蘋果羣的人)可以在許多公用事業中分發,而不需要任何公用事業單獨負責任。每個實用程序只提供一些可按需計算的「功能」。
計算需求的特點,在某些情況下,可能會依賴上點播功能等計算,這樣你會得到兩個(即使不是直接的代碼耦合)之間的功能耦合。這種有效的耦合意味着如果您未能按順序調用某些實用程序,或者省略了所需的實用程序調用,則代碼會中斷。一個極端的例子是,對象最終失去行爲的程度成爲數據結構,或者缺乏通常與對象關聯的行爲。它是一種面向對象設計的反模式,被稱爲「貧血對象」。
什麼_is_這個'Object'?如果是籃子,那麼籃子就可以。如果你有一個'SchoolChild'並且你有一個容器用於'Collection''那麼也許'School'。選擇描述「對象」角色的內容。 –
2013-03-14 18:08:25
AppleSupervisor?園丁? AppleOverseer?史蒂夫喬布斯曾經? – ghdalum 2013-03-14 18:09:11
我會叫它喬治 – radai 2013-03-14 18:10:16