2016-09-12 10 views
5

私は、関係、集約、構成と継承の違いを説明したStackoverflowの記事をたくさん見てきました。しかし、私はこれらのアプローチのそれぞれの賛否両論について、さらに手近な課題に対して最も効果的なアプローチがあると、より具体的に混乱しています。これは私が本当に良い答えを見つけることができなかったものです。アソシエーション、アグリゲーション、コンポジション、および継承をいつ使用しますか?

フォーラムのガイドラインに沿って、私はではありません。では、なぜ人々が個人的には合成よりも継承を好むかもしれないのかを尋ねています。私は特に、各アプローチの客観的なメリット/弱点に強く関心があります。私。 1つのアプローチは他のものよりも読みやすいコードを作成するか、実行時の効率などが向上しますか?

理想的には、これらのアプローチが成功したか失敗したか、 非常に私の開発に役立ちます、そして、私は、他の知識を願っています。

実践的な基礎を築くために、私はPython 2のそれぞれの関係の例を取り上げました。これらの関係についての私の理解が事実でない場合は、混乱を避けるべきです。それはaddAllNums方法でAから特定の属性を使用するように

協会

クラスB、クラスAと週間の対応関係を有しています。しかし、それは関係の程度です。

class A(object): 
    def __init__(self, a, b, c): 
     self.a = a 
     self.b = b 
     self.c = c 

    def addNums(): 
     self.b + self.c 

class B(object): 
    def __init__(self, d, e): 
     self.d = d 
     self.e = e 

    def addAllNums(self, Ab, Ac): 
     x = self.d + self.e + Ab + Ac 
     return x 

ting = A("yo", 2, 6) 
ling = B(5, 9) 

print ling.addAllNums(ting.b, ting.c) 

アグリゲーション

その属性の一つとして、初期化時に独立したオブジェクトを参照するように、クラスB、クラスAとの集約関係を形成します。 BオブジェクトがAに依存している一方、それはB.

class A(object): 
    def __init__(self, a, b, c): 
     self.a = a 
     self.b = b 
     self.c = c 

    def addNums(): 
     self.b + self.c 

class B(object): 
    def __init__(self, d, e, A): 
     self.d = d 
     self.e = e 
     self.A = A 

    def addAllNums(self): 
     x = self.d + self.e + self.A.b + self.A.c 
     return x 

ting = A("yo", 2, 6) 
ling = B(5, 9, ting) 

print ling.addAllNums() 

組成

凝集など多く、しかしよりもむしろ参照とは無関係であるように、Bの破壊の場合には、Aは、存在し続けます独立したオブジェクトであるBは、それ自身のコンストラクタ内のAのインスタンスを実際に属性として初期化します。 Bオブジェクトが破棄された場合、Aオブジェクトも破棄されます。これは構成がそのような強い関係である理由です。私はそれに完全に満足しているよう

class A(object): 
    def __init__(self, a, b, c): 
     self.a = a 
     self.b = b 
     self.c = c 

    def addNums(): 
     self.b + self.c 

class B(object): 
    def __init__(self, d, e): 
     self.d = d 
     self.e = e 
     self.A = A("yo", 2, 6) 

    def addAllNums(self): 
     x = self.d + self.e + self.A.b + self.A.c 
     return x 

ling = B(5, 9) 

print ling.addAllNums() 

は、私は、継承の例を含めないことを決定した、と私はそのインクルージョンは接線のビットで疑問点をオフに投げることを感じています。

上記の例と継承の賛否両論は(相互に比較して)何であるかとは関係ありません。

ありがとうございました。

答えて

0

私の個人的な意見は、具体的な現実世界の問題を解決するのに役立つ方法で実世界のデータをモデル化する方法についてまず考えなければならないということです。クラスに物を割り当てること、クラスやインスタンス間の関係を記述すること、物のプロパティを記述することなどは難しい部分です:この権利を取得し、コード内のパターン(継承、集約、サブクラス化など)は簡単になります。例:

正方形と長方形の関係はどうですか? 可逆行列は正方行列のサブクラスですか? 死んだ牛は哺乳動物ですか? 学生は人のサブクラスですか?先生はサブクラスですか? TAについてはどうですか?

+0

は、私が思う数として名を保存する必要があります問題は私が現実世界の物体を本当に扱っていないときに起こります。例えば。車の販売代理店で働いていた場合、車は車の外には存在しないため、ステアリングホイール、タイヤなどとの構成関係があります。結局のところ、誰かに新しい車を売ることはできませんが、排気を維持することを決めます。同様に、私がガレージで働いていた場合、私は車を分解して破壊することができましたが、排出ガスは依然として独立して存在していました。関係集約を行う。しかし、私が概念的なオブジェクトを扱っているとき、物事はあまり明確でないようです... – daydreamingwill

1

wikipediaのような経験則は、時間の経過と共に、またはコンセプトモデルがますます詳細になり、つまりコンポジションがアグリゲーションになり、アグリゲーションがアソシエーションになるように関係が柔らかくなることです。たとえば、エンジンは、機能を追加すると、エンジンを1台の車から別の車に転送して、それを集約することができます。

だからそれぞれの方法の長所と短所のあなたの質問に答えるために、それはより多くのあなたがモデリングしている関係の問題だ、質問と同様に、私は、文字列または

関連する問題