5

私は試験のために勉強していて、この質問を理解しようとしています。具体的な質問は「継承とオブジェクトコンポジションの両方がコードの再利用を促進する(T / F)」ですが、質問の継承部分は理解していると思います。

同様のメソッドを複数の子クラス内で同じように実装する必要がないように、同様のメソッドを抽象基本クラスに配置できるため、継承によってコードの再利用が促進されると思います。たとえば、3種類の図形があり、各図形のメソッド「getName」がデータメンバー「_name」を返すだけの場合、抽象ベースに1回実装できるのに、このメソッドを各子クラスに再実装するのはなぜですか。クラス「形状」。

ただし、オブジェクト構成についての私の最も良い理解は、オブジェクト/クラス間の「has-a」関係です。たとえば、生徒には学校があり、学校には多数の生徒がいます。これは、お互いがなければ実際には存在できないため、オブジェクトコンポジションと見なすことができます(生徒がいない学校は、正確には学校ではありませんか?など)。しかし、これら2つのオブジェクトがデータメンバーとして相互に「持つ」ことで、コードの再利用が促進されるとは思えません。

何か助けはありますか?ありがとう!

4

5 に答える 5

5

実装を別のクラスに委譲し、そのクラスをメンバーとして含めることができるため、オブジェクト合成によりコードの再利用が促進されます。

すべてのコードを最も外側のクラスのメソッドに入れる代わりに、スコープが小さい小さなクラスと小さなメソッドを作成し、それらのクラス/メソッドをコード全体で再利用できます。

class Inner
{
public:
    void DoSomething();
};

class Outer1
{
public:
    void DoSomethingBig()
    {
        // We delegate part of the call to inner, allowing us to reuse its code
        inner.DoSomething();
        // Todo: Do something else interesting here
    }

private:
    Inner inner;
};

class Outer2
{
public:
    void DoSomethingElseThatIsBig()
    {
        // We used the implementation twice in different classes,
        // without copying and pasting the code.

        // This is the most basic possible case of reuse

        inner.DoSomething();

        // Todo: Do something else interesting here
    }


private:
    Inner inner;
};

質問で述べたように、これは「has-a Relationship」と呼ばれる 2 つの最も基本的なオブジェクト指向プログラミング プリンシパルの 1 つです。継承はもう一方の関係であり、「is-a relationship」と呼ばれます。

継承と構成を非常に便利な方法で組み合わせることもできます。これにより、コード (および設計) の再利用の可能性が高まることがよくあります。現実世界の適切に設計されたアプリケーションは、常にこれらの両方の概念を組み合わせて、可能な限り再利用できるようにします。これについては、デザイン パターンについて学習するとわかります。

編集:

コメントでのマイクのリクエストによると、抽象度の低い例:

// Assume the person class exists

#include<list>

class Bus
{
public:
    void Board(Person newOccupant);
    std::list<Person>& GetOccupants();

private:
    std::list<Person> occupants;
};

この例では、リンクされたリスト構造を再実装する代わりに、それをリスト クラスに委任しています。そのリスト クラスを使用するたびに、リストを実装するコードを再利用しています。

実際、リストのセマンティクスは非常に一般的であるため、C++ 標準ライブラリが を提供std::listし、それを再利用する必要がありました。

于 2011-08-02T01:37:11.107 に答える
3

1)生徒は学校について知っていますが、これは実際にはHAS-Aの関係ではありません。生徒がどの学校に通っているのかを追跡したい場合でも、その学校を生徒の一部であると説明するのは論理的ではありません。

2)学生だけでなく多くの人が学校を占拠している。そこで再利用が始まります。新しいタイプの学校の出席者について説明するたびに、学校を構成するものを再定義する必要はありません。

于 2011-08-02T01:34:15.553 に答える
3

@Karl Knechtelに同意する必要があります-これはかなり悪い質問です。彼が言ったように、理由を説明するのは難しいですが、試してみます。

最初の問題は、用語を定義せずに使用していることです。「コードの再利用」は、人によって意味が異なります。一部の人々にとって、切り取りと貼り付けはコードの再利用と見なされます。私はそれが好きではありませんが、少なくともある程度は彼らに同意する必要があります. 他の人は、切り取りと貼り付けをコードの再利用 (同じコードを再利用するのではなく、同じコードの別のコピーを別のコードとして分類する) として除外する方法で cod の再利用を定義します。その観点もわかりますが、私は彼らの定義が本当に意味があるというよりも、特定の目的を果たすことを意図していると考える傾向があります (つまり、「コードの再利用」-> 良い、「カット アンド ペースト」-> 悪い、したがって、"カット アンド ペースト"!="コードの再利用")。残念ながら、ここで見ているのは境界線上です。

教授が使用する定義は、OOP に対する彼の熱意の程度に大きく依存する可能性があります。特に、OOP が主流になりつつあった 90 年代 (またはその前後) には、多くの人が、OOP のみを含む方法で定義することを選択しました。クールな新しい OOP「もの」。コード再利用の涅槃を達成するには、彼らの OOP 宗教にサインアップするだけでなく、それを本当に信じなければなりません! 構成のようなありふれたものは、おそらく資格を得ることができませんでした.

2 つ目の重要なポイントとして、何十年にもわたって OOP を使用した後、何人かの人々が、どのコードが再利用され、どのコードが再利用されなかったかについて、かなり慎重な調査を行いました。私が見たもののほとんどは、かなり単純な結論に達しています。つまり、コーディング スタイルと再利用を関連付けるのは非常に難しい (つまり、本質的に不可能です) ということです。コードの再利用が発生するかどうかについて作成しようとするほぼすべてのルールは、定期的に違反される可能性があります。

第三に、私が思うに多くの人々の頭の中で最も重要な傾向があるのは、質問をすること自体が典型的なコーダーに影響を与える可能性がある/影響を与えるものであるかのように聞こえるという事実です。 「コードの再利用を促進する」に基づいた継承(たとえば)、またはその順序の何か。現実には、(ほんの一例として)主に、解決しようとしている問題をより正確にモデル化するものと、その問題の解決に役立つものとに基づいて、構成と継承のどちらかを選択する必要があります。

この主張を裏付ける本格的な研究はありませんが、そのコードが再利用される可能性は、ほとんどの研究ではめったに考慮されていないいくつかの要因に大きく依存すると思います。そうでなければ解決する必要があり、2) 新しいコードを書くよりもあなたのコードを彼らの問題に適応させる方が簡単だと彼らが信じているかどうか。

私が見たいくつかの調査では、コードの再利用に影響を与えると思われる要因が見つかったこと付け加えておきます。私の記憶の限りでは、最も重要/重要なものとして際立っていたのは、コード自体ではなく、そのコードで利用可能なドキュメントでし。基本的にリバース エンジニアリングを行わずにコードを使用できるため、コードの再利用に大きく貢献します。2 つ目のポイントは、単純にコードの品質でした。多くの調査は、コードの再利用を促進しようとしている場所や状況で行われました。かなりの数のケースで、人々は試しました実際よりもかなり多くのコードを再利用する必要がありましたが、単にコードが十分ではなかったという理由だけでそれをあきらめなければなりませんでした。

概要: コードの再利用は、少なくとも過去 20 年間で、ソフトウェア エンジニアリングにおいておそらく最も過大評価され、十分に実現されていない約束であったと記録に残します。せいぜい、コードの再利用はかなりとらえどころのない目標のままです。2 つの要素に基づいて真/偽の質問として扱うところまで単純化しようとすると、質問が単純化しすぎて、無意味であるだけでなく、まったくばかげています。それは、ソフトウェア エンジニアリングの実践のほぼ全体を矮小化し、侮辱しているように見えます。

于 2011-08-02T04:52:41.617 に答える
2

私はオブジェクトCarとオブジェクトEngineを持っています:

class Engine {
     int horsepower;
}

class Car {
     string make;
     Engine cars_engine;
}

車にはエンジンがあります。これが作曲です。ただし、エンジンを車に搭載するためにエンジンを再定義する必要はありません。単に、車にはエンジンがあると言います。したがって、構成は実際にコードの再利用を促進します。

于 2011-08-02T01:31:57.643 に答える
2

オブジェクト合成は、コードの再利用を促進します。オブジェクト構成がなければ、あなたの定義を正しく理解していれば、すべてのクラスはプリミティブ データ メンバーしか持つことができず、これはひどいものではありません。

クラスを検討する

class Vector3
{
    double x, y, z;
    double vectorNorm;
}

class Object
{

    Vector3 position;
    Vector3 velocity;
    Vector3 acceleration;
 }

オブジェクト構成がなければ、次のようなものを持たなければなりません

class Object
{

    double positionX, positionY, positionZ, positionVectorNorm;
    double velocityX, velocityY, velocityZ, velocityVectorNorm;
    double accelerationX, accelerationY, accelerationZ, accelerationVectorNorm;
 }

これは非常に単純な例にすぎませんが、最も基本的なオブジェクトの構成でさえコードの再利用を促進することがわかると思います。ここで、Vector3 に 30 個のデータ メンバーが含まれているとどうなるかを考えてみてください。これはあなたの質問に答えていますか?

于 2011-08-02T01:38:34.200 に答える