2013-03-14 57 views
3

比方說,我有一個List<Apple>對象,每個蘋果都有一個顏色。Java OO - 提供與其他對象交互的新方法的對象?

我實現了用輸入構建蘋果對象列表的另一個對象。我可能會在這個對象上實現功能,例如「讓我知道綠蘋果的數量」,並且我可以在不知道該對象的內部表示的情況下調用它。

你會說這個人嗎?它看起來像基本的面向對象,但是我在考慮描述性名稱時遇到了麻煩。

+2

什麼_is_這個'Ob​​ject'?如果是籃子,那麼籃子就可以。如果你有一個'SchoolChild'並且你有一個容器用於'Collection ''那麼也許'School'。選擇描述「對象」角色的內容。 – 2013-03-14 18:08:25

+0

AppleSupervisor?園丁? AppleOverseer?史蒂夫喬布斯曾經? – ghdalum 2013-03-14 18:09:11

+2

我會叫它喬治 – radai 2013-03-14 18:10:16

回答

0

既然你正在談論一個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不負責維護計數,也不能被監聽。 「蘋果列表」也不是負責維護計數的工具,而通用列表通常呈現錯誤的傾聽界面。

不幸的是,當一個人獲得面向工具的時候,他們通常會嘗試通過添加更多的實用方法來解決問題。這最終可能意味着具體的問題(管理蘋果羣的人)可以在許多公用事業中分發,而不需要任何公用事業單獨負責任。每個實用程序只提供一些可按需計算的「功能」。

計算需求的特點,在某些情況下,可能會依賴上點播功能等計算,這樣你會得到兩個(即使不是直接的代碼耦合)之間的功能耦合。這種有效的耦合意味着如果您未能按順序調用某些實用程序,或者省略了所需的實用程序調用,則代碼會中斷。一個極端的例子是,對象最終失去行爲的程度成爲數據結構,或者缺乏通常與對象關聯的行爲。它是一種面向對象設計的反模式,被稱爲「貧血對象」。