同じタイプのオブジェクトをそれら自体の中で宣言することは受け入れられますか?


8

以下の例のように、同じオブジェクト内から新しいオブジェクトを宣言(およびそれらを返す)することは許容されますか?

または、あるhandlerクラスに移動した方がよいですか?

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    //Gets a list of persons
    public List<Person> GetPersons()
    {
        List<Person> _listPersons = new List<Person>();

        Person _person = new Person();
        _person.Name = "FooFii"; 
        _person.Age = 50;
        _listPersons.Add(_person); 

        return _listPersons; 
    }
}

6
言語によっては、GetPersons静的であるかPersonのメンバーでないことをお勧めします。現在、Person電話をかける必要がありますGetPersons
Caleth

もちろん、Java Objectクラス(クラス階層のルート)clone()は、オブジェクトのコピーを提供するためのメソッドを明示的に要求します。
TMN

回答:


9

一般的には、大丈夫です。一般に、クラスのコンストラクターは、そのクラスが機能するために必要なすべての設定が行われる場所です。多くの場合、そのセットアップの一部はコードの他の領域に抽象化されています。たとえば、ファクトリパターンは、初期設定の多くを別のクラスに移動するため、設定がロジックから明確に分離されます。

あなたの具体的な例では、それは大丈夫ではありません。おそらくあなたの例は構築されているが、データとロジックを融合しているためです。あなたは人がどのように見えるかを宣言し、特定の人を獲得する方法を私に教えています。単一責任原則を検討する価値があります。あなたの例では、Personのデータ型を定義する単純なクラスが1つあります。これは、人を取得するリポジトリと、人をリポジトリから取り出し、データを処理する(つまり、電子メールで送信する)クラスです。


5

はい、適切な条件下で。

一般的な例は、フィルター構成の例です。ここでは、古いフィルターのメソッドを呼び出して新しいフィルターを作成します。

考案された例:

class Filter {
    public function where(string field_name, object value) {
        filters = (clone)this->filters;
        filters.setitem(field_name, value);
        return Filter(filters);
    }
}

これにより、次のような使用が可能になります

query = Filter()
    .where("username", "nobody")
    .where("password", "should be salted and hashed")
;
user = User.get(filter);

これは、jQueryセレクターのチェーンが機能する方法と、Djangoクエリセットが機能する方法です。


3

このようにする代わりに、よりカプセル化されたバージョンのファクトリー・パターンのようなものを実装しようとします。代わりにリストを作成する別のオブジェクトを用意してください。Factory(オブジェクト指向プログラミング)を参照してください。

のリストを返すときは、基本的に既にファクトリーパターンを実行していますPersonが、代わりに2つの別個のクラスが必要になる場合があります。ファクトリ製品から分離した場合、の実装Personは、リストを作成するクラス(つまりPersonFactory)に関連付けられません。

上記のリンクが表示されている場合は、実際の名前のセクションの下に、実際の例と同様の例が投稿されていることがわかります。ただし、上記の理由により、私はこの方法ではそれを行いません。カプセル化のセクションを参照してください(リンクにも含まれています)。


1

例を挙げれば、同じ型内の同じ型オブジェクトを返すことは間違いありません。

このことを考慮。

class Employee {}

class Manager : Employee 
{
    List<Employee> Employees { get; set;}
    Manager ReportsTo { get; set; }
}

懸念の分離または混合の間には細い線があります。その行の反対側にいる場合は、manager / handler / ...オブジェクトを使用できます。

class Organization 
{
    Employee FindEmployeeByName (string name) {}
    Employee FindManagerOf (Employee emp) {}
    List<Employees> TeamOf (Employee manager)
    ...
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.