29

ここでベストプラクティスについて疑問に思っています。ファクトリ メソッドが何も作成できない場合に null を返すのは良い習慣ですか? 次に例を示します。

ICommand command = CommandFactory.CreateCommand(args);
if (command != null)
    command.Execute();
else
    // do something else if there is no command

別の方法は a または何かを返すことNullCommandだと思いますが、ベストプラクティスは何ですか?

4

4 に答える 4

34

場合によっては、ファクトリ メソッドが null を返すことは合理的である可能性があると思いますが、それが呼び出されたメソッドである場合はそうではありませんCreateCommandGetCommandまたはの場合FetchCommand、それで問題ないかもしれませんが、Createメソッドは失敗時に例外をスローする必要があることをお勧めします。

もちろん、この状況で本当に戻ってきてほしいかどうかはnull、全体像によって異なります。(たとえば、代わりに返すことができる合理的な null オブジェクトの実装はありますか?)

于 2012-06-20T17:04:59.253 に答える
2

この場合に戻るnullと、メソッドが使いにくくなります。クライアントは、暗黙の障害状態を認識している必要があります。代わりに、例外をスローします。クライアントがこの条件をテストするための別のメソッドを提供することもできます。

if (CommandFactory.CanCreate(args)) {
  ICommand command = CommandFactory.Create(args);
  command.Execute();
}

または、ファクトリをインスタンス化可能にします。前処理が必要な場合はどちらが良いでしょうargs

CommandFactory factory = new CommandFactory(args);
if (factory.IsValid()) {
  ICommand command = factory.Create();
  command.Execute();
}

ファクトリのインターフェイスにより、作成が失敗する可能性があることが明確かつ明示的になりましたが、それでもクライアントはチェックメソッドを使用する必要があります。別のオプションはこれです:

ICommand command;
if (CommandFactory.TryCreate(args, out command)) {
  // creation succeeded ...
}
于 2012-06-20T17:19:41.793 に答える
2

ジョン・スキートに同意します。CreateCommand明らかに構築を意味します。

をスローしない場合Exception、そのシナリオではNullCommand、すべてのコンシューマーでの条件ステートメントとNullReferenceExceptionエラーの可能性を回避するために、私は個人的に実装を行います。

于 2012-06-20T17:11:30.100 に答える
0

ユーザーが Create を呼び出すたびに null をチェックする必要ある理由がある場合にのみ、Null を返すのが理にかなっています。通常、次の使用パターンは完全に有効であると考えられます。

var obj = MyFactory.CreateThing();
obj.DoSomething();

しかし、あなたが提案しているのは、次の使用パターンを強制することです:

var obj = MyFactory.CreateThing();
if (obj == Null) {
    // Handle null condition
} else {
    obj.DoSomething();
}

通常、Nullシナリオは何らかの障害を意味しますが、その場合、おそらく例外が最も理にかなっています。しかし、最終的にはあなたがここで音楽を作る側になり、あなたが構築している世界で何が賢明かを判断しなければなりません。

于 2012-06-20T17:20:27.903 に答える