web-dev-qa-db-ja.com

関連付け、集約、構成、継承をいつ使用するのですか?

Stackoverflowには、関係、関連、集約、構成、継承の違いを例を挙げて説明するたくさんの投稿を見てきました。ただし、これらのアプローチのそれぞれの長所と短所について、そして1つのアプローチが手元のタスクに最も効果的である場合について、私はより具体的に混乱しています。これは私が本当に良い答えを見つけることができなかったものです。

フォーラムのガイドラインに沿って、私はnotです。たとえば、人々が個人的に構成より継承を使用することを好む理由を尋ねています。私は特に、各アプローチの客観的な利点/弱点に興味を持っています。つまりあるアプローチが別のアプローチよりも読みやすいコードを作成しますか、それとも実行時の効率が向上しますか?.

理想的には、これらのアプローチが成功または失敗した実際の例を誰かが私に教えてくれれば、それは非常に私や他の知識の開発に役立ちます。

確実に機能する基盤を確保するために、各関係の例をPython 2に含めました。これらの関係を理解し​​ていない場合は、これにより混乱を避けることができます。実際には正しい。

関連付け

クラスBは、addAllNumsメソッドでAの特定の属性を使用するため、クラス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オブジェクトをその属性の1つとして参照するため、クラスAとの集約関係を形成します。 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オブジェクトも破壊されます。これが作曲がとても強い関係である理由です。

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() 

私は完全に満足しているので、継承の例を含めないことにしました。それを含めると、質問の要点が少し離れる可能性があると感じています。

いずれにしても、上記の例と継承の長所と短所は何ですか(互いに比較して)。

ありがとう。

11
daydreamingwill

wikipedia による経験則は、関係が時間の経過とともに、または概念モデルの詳細の増加に伴って和らげることです。元々は車でしたが、機能を追加すると、エンジンが1つの車から別の車に転送されて集約されます。

したがって、各方法の長所と短所の質問に答えるには、モデル化している関係の質問であり、名前を文字列または数値として保存するかどうかの質問に似ています

1
Harlekuin

私の個人的な見解では、最初に特定の現実世界の問題を解決するのに役立つ方法で現実世界のデータをモデル化する方法について考える必要があります。クラスへの物事の割り当て、クラスやインスタンス間の関係の説明、物事のプロパティの説明などは難しい部分です。これを正しく行うと、コードのパターン(継承、集約、サブクラス化など)が簡単になります。例えば:

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

0
MMN