1

更新:私の最初の質問は明確ではありませんでした。以下の例のようなコードが違反している原則の名前を探しています。

(私が話しているシナリオによりよく似るようにコード例を更新しました。私が含めた元のコード例は一番下にあります。任意の「深さ」レベルのサブメンバーであり、さらに構成とはほとんど関係がありませんでした。これは、私が質問するつもりだったものです.)


これには用語があると確信していますが、それを考えるのに苦労しています。

悪いコードの例:

public interface IJumper
{
    void Jump();
}

public class Creature
{
    public IJumper Jumper;
}

var c = new Creature();
c.Jumper.Jump();

より良いコードの例:

public class Creature : IJumper
{
    private IJumper _jumper;

    public void Jump()
    {
        _jumper.Jump();
    }
}

var c = new Creature();
c.Jump();

[ここに原則の名前を挿入] のために、これ (メンバーオブジェクトを直接公開して、そのすべてのプロパティ/メソッドにパブリックにアクセスできるようにすること) が悪いこととして説明されていることを聞いたことがあると確信しています。私が探している言葉は何ですか?

(なぜこれが悪いことなのか/悪いことなのかを尋ねているわけではないことに注意してください。私は単に用語を探しているだけで、私の人生では覚えていません。)


元の (悪い) コード例:

public class Person
{
    public Person Child;
    // ...
}

Person p = new Person("Philip J. Fry");

// what is the term for this?
Person greatGrandchild = p.Child.Child.Child;
4

4 に答える 4

3

この例に適用できる原則は次のとおりです。

情報の隠蔽: 変更される可能性があるコード内の設計の詳細を分離します。プログラムの残りの部分を実装から保護する安定したインターフェースを作成します。

カプセル化: 構造と動作を構成する抽象化の要素を区画化します。抽象化の契約上のインターフェースをその実装から分離します。標準言語メカニズムを使用して、データをインターフェースにバンドルします。

私が示した情報の隠蔽とカプセル化の定義は非常に似ており、さまざまな人がこれらの意味について独自の定義を持っていることに注意してください。これらはウィキペディアから引っ張ってきました。

インターフェイス分離の原則: あるクラスから別のクラスへの依存関係は、可能な限り最小のインターフェイスに依存する必要があります。

Child決定しなければならない問題は、それ自体がインターフェースの一部であるこの方法でクラスを作成することが、クライアントが依存する安定した最小限のインターフェースであるかどうかです。ほとんどの場合、オブジェクト指向プログラマーは、データ メンバーを自由に変更できるように、データ メンバーではなく明示的なメソッド セットをインターフェイスとして使用することを好みます。その手法を口実として推奨する人もいます。あなたのケースには当てはまるかもしれませんし、当てはまらないかもしれません。

あなたの例に当てはまるかもしれないし、当てはまらないかもしれない別の原則があります:

デメテルの法則: 直接の友達とだけ話せ。

デメテルの法則は、p.Child.Child.Child のような深いアクセス階層を思いとどまらせます。なんで?クライアントは、話している対象についての深い構造的知識を前提としており、クライアントとそれらの対象の間の結合が増加するためです。そうは言っても、この結合が受け入れられる例は世界中にたくさんあると思います。あなたの場合にも当てはまるかどうかを判断する必要があります。

編集:あなたの改訂された例では、デメテルの法則はあなたが探しているものにずっと近く見えます。

于 2010-06-20T16:55:52.543 に答える
2

Message Chains、Middle Man、Indecent Exposure、そしておそらく Feature Envy など、いくつかの資格があるようです。 http://www.codinghorror.com/blog/2006/05/code-smells.html

そのパターンが頻繁に使用される場合は、内部で検索する GreatGrandChild というプロパティが必要になる可能性があります。

于 2010-06-20T16:27:20.017 に答える
2

これはメソッド チェーンと呼ばれます(この例では、プロパティ チェーンである可能性があります)。フルエントインターフェースと強く結びついています。

これらのいずれかが、探している用語である必要があります。

于 2010-06-20T16:46:27.570 に答える
0

カプセル化に違反していますか?

于 2010-06-20T16:55:14.463 に答える