13

CallRate 型を定義するクラスがあります。ファイルからデータを読み取って、クラスの複数のインスタンスを作成する機能を追加する必要があります。

を返す静的メソッドをクラス CallRate に追加しましたList<CallRate>。クラスが独自のコンストラクターの 1 つを呼び出して、それ自体の新しいインスタンスを生成することは問題ありませんか? それは機能しますが、それが適切なことなのかどうか疑問に思っています。

List<CallRates> cr = CallRates.ProcessCallsFile(file);
4

12 に答える 12

20

静的メソッドから独自のオブジェクトを取得することはまったく問題ありません。

例えば

ドット ネット ライブラリの 1 つは、あなたと同じことを行います。

XmlReadrer reader = XmlReader.Create(filepathString);
于 2008-11-02T00:21:31.647 に答える
5

確かにそれは問題ありません。場合によっては奨励されることさえあります。オブジェクトの作成を扱う設計パターンがいくつかあり、そのうちのいくつかはまさにあなたが説明していることを行います。

于 2008-11-02T00:24:52.233 に答える
3

パラメータの有効性を確認する必要がある場合、このパターンをよく使用します。コンストラクターから例外をスローしないことを強くお勧めします。ファクトリ メソッドからそれほど悪くはないか、null を返すことを選択できます。

于 2008-11-02T18:28:27.833 に答える
2

私には問題ないようです。他の言語では、おそらく関数を記述しますが、C# のような言語では、静的メソッドがその役割を果たします。

于 2008-11-02T00:25:18.800 に答える
1

「独自のコンストラクターの1つを呼び出すことによってそれ自体の新しいインスタンスを生成する」ことを指摘するのと同じように

コンストラクターからではなく、静的メソッドからのものです。

于 2008-11-02T02:14:43.527 に答える
1

コンストラクターのオーバーロードの代わりに public static メソッドを使用することがあります。

特に、どのような種類のオブジェクト構築が意図されているかを示すためにパラメーターの型だけに依存するのは好ましくない状況では。

于 2008-11-02T00:50:43.787 に答える
1

上記で何度も示唆されているように、私は静的メソッドがインスタンスを返すことのファンです。

@Paul:上記のコメントにチェックを入れることを忘れないでください。これが最良の答えです。

于 2008-11-02T00:55:14.200 に答える
1

大丈夫です。作成したのは、単純なファクトリ メソッドのようなものです。型の有効なインスタンスを作成する静的メソッドがあります。実際、メソッドは静的である必要さえなく、有効なコードを持っています。既存のオブジェクトから新しい有効なオブジェクトを作成するデザイン パターン (Prototype) があります。http://www.dofactory.com/Patterns/PatternPrototype.aspxで詳細を参照してください。

于 2008-11-02T00:27:03.057 に答える
1

確かに、単純な解析 (または同様の) シナリオの場合、実際にはファクトリ メソッドをクラスの一部にすることを好みます。はい - それはSRPを壊しますが、 KISSを満たします - だから私はそれを純勝利と呼んでいます。大規模なアプリ、またはより複雑な解析ルーチンの場合は、外部ファクトリ クラスにする方が理にかなっています。

あなたの特定のケースでは、おそらくファイル名の代わりに IEnumerable<string> を取ったメソッドを好むでしょう-それでも解析ロジックを提供しますが、簡単な単体テストと「再利用」を可能にします。呼び出し元は、ファイルを IEnumerable に簡単にラップできます。

于 2008-11-02T00:29:20.960 に答える
1

多くの場合、ファクトリ メソッドは適切な設計です。それらを C# で記述するときは、それらを「New」と呼ぶので、次のようになります。

new MyClass()

になる

MyClass.New()

自明なことに、次のように実装されています。

class MyClass
{
    public static MyClass New()
    {
        return new MyClass();
    }
}

ほとんどの場合、実際にクラスを作成するか、単に return を作成するnullか、または returnMyClassまたはそれから派生したものを作成するかについて、追加の条件がある場合にこれを行います。

于 2008-11-02T00:38:09.197 に答える
1

私は通常、クラスの即時実装が必要なときにこれを使用します。例えば

    public class Car
    {
        public static Car RedExpensiveCar = new Car("Red", 250000);

        public Car()
        {

        }

        public Car(string color, int price)
        {
            Color = color;
            Price = price;
        }

        public string Color { get; set; }
        public int Price { get; set; }
    }

これにより、コンストラクターのパラメーターを覚えたり、コードに記述したりする必要がなくなります。

Car car = Car.RedExpensiveCar;
于 2008-11-02T11:09:30.747 に答える
0

これを行うことは完全に受け入れられます。私がそうするとき、私は通常、クラスの実際のコンストラクターをプライベートにして、インスタンスを構築する唯一の方法が静的メソッドを使用することであることを明確にします。

これは、「構築」が常に新しいインスタンスを返すとは限らない場合に非常に役立ちます。たとえば、代わりに以前にキャッシュされたオブジェクトを返したい場合があります。

于 2009-01-14T19:49:17.733 に答える