2016-12-17 1 views
0

これは私が常に持っていた質問ですが、今それを解決するための時間です:オブジェクト指向のプログラミングとオブジェクトの構成、どのように構成プロパティを配置する?

私のようなパブリック属性使用してオブジェクトの構成を実装しようとしています:

Person { 
public Car car; 
} 

Owner { 
    public Person person; 
    public Car car; 
} 

Car { 
    public Person person; 
} 

を本当に私の質問は次のとおりです。そのコンポジションプロパティを公開または非公開に設定するのがよい方法ですか?

$instancePerson.car.getNumberOfGearsGood() 

違い:

A)公開:私だけのようにインスタンスにプロパティを直接参照する必要があるためやっ公共、アクセスは、高速かつ複雑ではありません問題:車のプロパティはどこからでも誰でも変更できるようになっています。

B)プライベート:アクセスが遅い場合は、プライベートをやっなど、これらのプロパティを取得するメソッドを使用する必要がある:私はあなたがメソッド2つのメソッドを実行する必要があるため、低速であると言うとき

$instancePerson.getCar().getNumberOfGearsGood() 

公共のソリューションでは、あなただけが行う必要があります。

多くの開発者やソフトウェアエンジニアがプライベートソリューションを好むことは知っていますが、そこでのパフォーマンスについて説明できますか?

+1

あなたが使っている言語が明確ではなく、あなたが書いたものはjavaやC++のようには見えません。 getterを使用する目的は、呼び出し元を変更せずにプロパティの内部表現を変更し、プロパティの意図しない変更を防ぐことです。 – pvg

+0

言語は重要ではありません(例として取る)とはい私はあなたが書いたことを知っていますが、私の質問はPerson.carよりもPerson.carを実行する方がパフォーマンスが最速であるということですobviusly ... –

+2

具体的なプログラミングの質問ではなく、意味のある、答えることのできる質問ではありません。いくつかの言語とランタイムでは、これは他の言語でパフォーマンスに影響を与える可能性があります。最適化のためではありません。より具体的な質問を出すか、またはこれをソフトウェアエンジニアリングスタック交換に持ち込む必要があります。 – pvg

答えて

-1

非常に少数のケースを除いて、これらの変数をプライベートにしたいと思うことがあります.JVMのテクノロジーは、思ったより速くアクセスします(C/C++ )。
もう少し詳細な回答は

主な質問は次のとおりです。これらの変数を変更できるのは誰ですか?例えばを作成してPersonをコンストラクタに渡して、その人が(中古車の市場が存在しない世界では)変更を許可しないようにすることができます。この場合、フィールドがパブリックであれば、別のオブジェクトがそれを修正して車の所有者を変更することができます。しかし、フィールドを非公開にしてgetOwner()メソッドを提供する場合、誰もそれを変更することはできません。 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を実行している場合は、「パブリック」属性のようなものはありません。すべての属性はオブジェクトの実装の詳細なので、すべての人から隠されています。オブジェクトの責任に関連するメソッドだけがpublicです。

  • すべて
  • プライベートでなければならず、はい、いいえがなければならないプライベート属性に

何ゲッターがあってはならない「属性」:だから、質問に答えるために

person.getCar().getNumberOfGears(); 

時にはcalle d Law of Demeter。その人は、Personクラスの責任に関連するメソッドを持つ必要があります。したがって、このアクセスは常にクラスとダイレクトの内部にあるため、属性にアクセスする際のパフォーマンス上のペナルティはありません。

関連する問題