7

コードレビュー中に次のコードを見つけました。

私の直感は、これが適切な OOP に従っていないことを示しています。

LoadObject メソッドは、渡されたオブジェクトを変更するのではなく、新しい SomeObject オブジェクトを返す必要があると考えています。なぜこれが優れているのかについての適切な説明を実際に見つけることはできませんが。

私のソリューションはより良いですか?もしそうなら、なぜですか?具体的には、特定のコード例で破られている OOP の原則または標準は何ですか (ある場合)。

   public void someMethod()
    {
        ...
        var someObject = new SomeObject();
        LoadSomeObject(reader,someObject);
    }

    private void LoadSomeObject(SqlDataReader reader, SomeObject someObject)
    {
       someObject.Id = reader.GetGuid(0);
    }
4

6 に答える 6

8

someObject のプロパティを変更するだけなので、コードの記述方法に問題はありません。

ただし、LoadSomeObject 内で someObject を作成して返すことも同様に正しいでしょう。

この時点で、どちらの選択も同じように正しいです。

于 2010-08-11T20:46:55.133 に答える
2

私は OO の第一人者ではないので、これらを一粒の塩で受け取ってください。

  1. オブジェクトは、可能な限り自分で管理/動作を定義する必要があります。この背後にある理論的根拠は、疎結合の頭に浮かんだことがあれば明らかです。LoadSomeObject詳細を SomeObject の実装に移すのがより良い設計上の決定である可能性は非常に高いですが、そのような一般的な例について議論するのは困難です。

  2. 可変状態は、命令型コード (オブジェクト指向コードを含む) ではまったく問題ありません。これは、これらのパラダイムの中核となる「機能」です。OTOH、不変の状態には定義できない利点があり (ここでそのトピックについていくつか質問があると思います。それ以外の場合は FP 支持者に尋ねてください)、いくつかの不変オブジェクトを持つことは特にオブジェクト指向ではありません。

編集:リーダーを SomeObject のコンストラクターに渡すこともできます。

于 2010-08-11T20:49:48.690 に答える
1

そのようなコードと競合する普遍的なオブジェクト指向の概念はありません。しかし後で、いくつかの設計原則に従わなければ、 SomeObject インスタンスを操作する方法を収集して理解するのが難しいことに気付くでしょう。おそらく、スターターにとって最も簡単な方法は、2 つの主要な種類の手順を分離することです。

  • 機能的 - 新しいインスタンスを作成し、他のオブジェクトを変更しないように設計されています。
  • Methodic - ホスト インスタンスの状態を変更するように設計されています。

ここで良いアイデアです。 SomeObject 操作ロジックを分離したい場合は、 SomeObjectBuilder タイプを作成することです

 public void loadFromReader( SqlDataReader reader )

メソッドと

public SomeObject getValue()

財産

于 2010-08-12T00:36:24.497 に答える
0

どちらの方法も完全に受け入れられますが、特定の状況にどちらが適しているかを決定する際には、返されたオブジェクトで何をしたいのかを考慮する必要があります。不変性、つまりすべての操作で新しいインスタンスを作成することは、.NET での文字列の処理方法です。

copy メソッドは明らかにコピーを返す必要があります。たとえば、グローバル参照によって保持されているシングルトンオブジェクトで機能するメソッドは、変更が失われる可能性があるため、新しいオブジェクトを返すのに適していません。

于 2010-08-11T20:55:34.113 に答える
0

LoadSomeObjectが new を返す場合はSomeObject、混乱を避けるためにメソッド名を変更することをお勧めします。多分にNewAndLoadSomeObject

于 2010-08-11T21:06:42.547 に答える
0

ほとんどの場合、少しずれているように感じるというあなたの直感に同意します。何かが変更されていることがより明確になるため、何かを返す方が良いことに同意します。戻り値が使用されているのを見ると、何が起こっているのかがすぐにわかります。

ただし、これはまだ少し気分が良いと思います(とにかくほとんどの場合):

public void someMethod()
{
    ...
    var someObject = new SomeObject();
    someObject.Load(reader);
}

そして、明らかにSomeObjectクラスでは、

public void Load(SqlDataReader reader)
{
   this.Id = reader.GetGuid(0);
}

アイデアは、静的メソッドよりもインスタンス メソッドを優先することです。オブジェクトを独自のデータで操作できるのに、わざわざオブジェクトを作成してそのデータを渡したりする必要はありません。

于 2010-08-12T00:07:27.010 に答える