2016-12-17 70 views
0

這是一個問題,我一直有,但現在是解決這個問題的時候:面向對象編程和對象組合,如何把組合屬性?

我試圖實現使用的公共屬性,如對象的組成:

Person { 
public Car car; 
} 

Owner { 
    public Person person; 
    public Car car; 
} 

Car { 
    public Person person; 
} 

真是我的問題是:將公共或私人設置的組合屬性是一種很好的做法嗎?

的區別:

一)公共:做公益,存取速度快,並不複雜,因爲我只需要直接使用類似實例引用屬性:

$instancePerson.car.getNumberOfGearsGood() 

的問題:汽車性能可以被任何人從任何地方修改。

B)私人:做私人的訪問,如果緩慢,需要使用方法來獲得這些屬性,如:

$instancePerson.getCar().getNumberOfGearsGood() 

當我說慢,是因爲你需要做的一個方法二法呼叫,而在公共解決方案中,只有你需要做一個。

我知道很多開發人員和軟件工程師會更喜歡私人解決方案,但是您能解釋一下那裏的性能嗎?

+1

不清楚你使用的是什麼語言,你寫的東西看起來不像java或C++。使用getter的目的是允許您在不修改調用者的情況下更改屬性的內部表示並防止意外修改該屬性。 – pvg

+0

語言不重要(以它爲例),是的,我知道你寫了什麼,但我的問題是關於性能比Person.car更快做Person.getCar()... obviusly ... –

+2

它是沒有具體細節就沒有意義或可回答的問題,因此根本不是一個具體的編程問題。在某些語言和運行時中,這可能會對其他語言產生性能影響,這可能不是由於優化。您需要提出一個更具體的問題,或者將其交給軟件工程堆棧交換。 – pvg

回答

-1

簡短的回答是,除極少數情況外,您希望這些變量是私有的,並且JVM中的技術通常會使訪問速度比您想象的要快(有時甚至比C/C++更快)。
對於更詳細的回答:

主要問題是:誰應該能夠修改這些變量?例如,您可能希望創建CarPerson傳遞給其構造函數,並且決不允許人員更改(在沒有二手車市場的情況下)。在這種情況下,如果該字段是公開的,則另一個對象可以修改它並更改汽車的擁有者。但是,如果您將該字段設置爲私有,並提供方法,則無人可以對其進行修改。如果get方法爲final,因此無法在子類中重寫,則JVM甚至可能在內部轉換x.getOwner()的相當於x.owner的任何調用。在你的例子中,不可能在構造函數中傳遞所有元素,因爲它們互相引用。事實上,在我看來,你的模型有太多類。讓我們嘗試不同的看法寫了一下:

Person { 
public Car car; 
} 

Car { 
    public Person owner; 
} 

現在,假設每一輛都有一個所有者,而每個人擁有自己的汽車,這種模式是危險的,因爲你可以做這樣的事情:

Person p = new Person() 
Car c = new Car(); 
p.car = c; 

正如你所看到的,我忘了設置c.owner = p

讓我們看看如何解決此問題:

Person { 
    private Car car; 
    public void setCar(Car c) { 
    if (car == c) 
     return; 
    car = c; 
    c.setOwner(this); 
    } 
} 

Car { 
    private Person owner; 
    public void setOwner(Person o) { 
    if (o == owner) 
     return; 
    owner = o; 
    o.setCar(this); 
    } 
} 

我現在可以做的:

Person p = new Person(); 
Car c = new Car(); 
p.setCar(c); 

Person p = new Person(); 
Car c = new Car(); 
c.setOwner(p); 

和無論哪種方式都關係將得到正確設置。

換句話說,被迫訪問訪問器允許設置的不僅僅是一個簡單的字段,這對於在關係中涉及的模型元素之間建立一致的狀態很有用。

0

如果您正在做OO,那麼不應該有「公共」屬性這樣的事情。所有屬性都是對象的實現細節,因此對每個人都是隱藏的。只有與對象責任相關的方法是公開的。

因此,要回答這個問題:

  • 所有「屬性」應該是私人
  • 應該有一個私人屬性

是沒有消氣,不應該有

person.getCar().getNumberOfGears(); 

這有時是calle d Law of Demeter。這個人應該有一些方法來完成與Person類職責相關的任務,因此訪問屬性沒有任何性能損失,因爲這種訪問總是在類內部直接進行。