2013-05-11 89 views
0

如果這個地方不是合適的地方,請指出我在哪裏可以討論/解決我的疑問,然後再解決問題。什麼是更實用,兩個屬性或一個對象與上述屬性?

這是我在腦海中想到的一點點東西。在Java中,也許其他OOP語言,這將是更好的,有...

class Entity { 
    [final] int xPos; 
    [final] int yPos; 

    // ... 
} 

或者說...

class Entity { 
    Position p; 

    // ... 
} 

class Position { 
    [final] int x; 
    [final] int y; 
} 

哪些優點和這樣做的利弊?對我來說,第二種方法似乎更實際一些,特別是當你需要輸入兩個屬性作爲方法參數或返回值時,但我也在考慮這是否會產生太多不必要的過程(爲次要事情創建新對象) ...

回答

1

也沒有。最好的設計是以下幾點:

class Position { 
    final int x; 
    final int y; 
} 

interface Positionable { 
    Position getPosition(); 
} 

class Entity implements Positionable { 
    private Position p; 
    public Position getPosition() { 
     return position; 
    } 
} 

推理:

  • 允許Position演變 - 也許你想添加一個z協調
  • 允許Position爲不可變的
  • 允許Position到被傳遞而沒有包含在較重物體中的行李
  • 允許你可以自由添加方法Position,如float distanceFrom (Position p)
  • 允許Position活得比對象它描述
  • 可以輕鬆地給予其他類別Position
  • 解耦儘可能種種顧慮

請注意,Point是可變的,所以使用它或擴展它是不好的,因爲不變性對於這樣的類似乎是明智的選擇(它被認爲是一個錯誤,因爲Point是可變的 - 對於java中的其他「錯誤」,se e this answer

+0

這對於存儲一對整數來說似乎有點複雜。如果Position是獨立的,並且有很大的自身發展機會,並且將被用於不同目的,那麼我只能走這條路。但是如果你只需要獲得實體的X位置或實體的Y位置,你是否真的需要一個接口和2個額外的類? – Brandon 2013-05-11 22:27:36

+0

@Brandon我最近剛剛做了一次地理聯賽(對於lat/long有兩次雙打),它的表現非常好。我會再做一次。 – Bohemian 2013-05-11 23:51:54

2

或者您可以不寫一個自定義類並使用Point。真的,這取決於你。如果您需要執行涉及座標的計算,或者需要傳遞對象的座標,那麼最好將它們包裝在一個對象中以使代碼更簡單。如果他們是恆定的,並且永遠不會改變(你永遠不會知道),那麼你可以將它們保持爲int的值。

+0

我正在考慮在畫布上繪圖,因此'Entity'將由兩個'int'或'float'數字,座標'x'和'y'表示。 考慮到這一點,我認爲他們的'位置'會改變,但'位置'本身的值(即'p'會改變,'x'和'y'不會改變)。另外,如果'Position'的兩個屬性都是final的,那麼JVM是否足夠智能以便爲同一個引用分配兩個不同的'New Position(x,y)'? – Alxe 2013-05-11 15:20:06

2

如果它只表示具有獨立目的的東西,那麼您真的只需要一個單獨的類定義 - 將來可能需要其他地方或包含獨立功能(責任分工)。正如克里斯提到你的例子直接與Point類相關,所以後者更合適。

+0

爲了保持對兩組座標的可訪問性,你需要兩個引用,引用是一個奇點,所以不能保存兩個內存位置,它需要以這種或那種方式進行包裝。實體類中的2個引用對於initialLocation和1個對於latestLocation而言,將第二個引用留空,直到它發生更改,並將其使用的任何要求放入一個函數中,該函數檢查第二個參數中是否存在實際引用,如果返回null – 2013-05-11 15:32:24

+0

不要忘記,如果您需要添加自定義功能,您可以隨時擴展Point類 – 2013-05-11 15:39:58

相關問題