コンストラクターに対して静的オブジェクト作成メソッドを使用することの長所と短所は何ですか?
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
私が考えることができることはほとんどありません:
長所:
- 例外をスローする代わりにnullを返します(名前を付けます
TryCreate)。これにより、クライアント側でコードがより簡潔でクリーンになります。クライアントがコンストラクターの失敗を期待することはほとんどありません。 - 明確なセマンティクスでさまざまな種類のオブジェクトを作成します。たとえば
CreatFromName(String name)、CreateFromCsvLine(String csvLine) - 必要に応じて、キャッシュされたオブジェクト、または派生した実装を返すことができます。
短所:
- 発見しにくく、コードのスキミングがより困難です。
- シリアル化やリフレクションなどの一部のパターンはより困難です(例
Activator<Foo>.CreateInstance())
1
遅いです。とにかくヌル参照を処理する必要があります。
—
アミールRezaei
@Amir Handling nullは(
—
dbkk
Foo x = Foo.TryCreate(); if (x == null) { ... })です。ctor例外の処理は(Foo x; try { x = new Foo(); } catch (SomeException e) { ... })です。通常のメソッドを呼び出すとき、エラーコードよりも例外を好みますが、オブジェクトの作成でTryCreateはクリーンに見えます。
検証で型チェックを行いますか?
—
アミールRezaei
2番目のProの「明確なセマンティクスでさまざまな種類のオブジェクトを作成します。たとえば、CreatFromName(String name)とCreateFromCsvLine(String csvLine)」では、メソッド名で要件を表現するよりも、作成
—
ベンタイロルク
NameしてCsvLineタイプする方がよい場合があります。これにより、Createをオーバーロードできます。両方に文字列を使用することは、「原始的な強迫観念」とみなすことができます(既知のパフォーマンス上の理由でこの選択を行わなかったと仮定)。これを探る楽しい方法については、Object Calisthenicsをご覧ください。