あらかじめ定義された (既定の) 値を持つ複雑な DTO オブジェクトを作成する必要があるとします。このオブジェクトはシリアル化に使用され、シリアライザーにはパラメーターなしのコンストラクターが必要です。そのために静的ファクトリ メソッドを使用したいのですが、このアプローチの適切な使用方法について疑問があります。
次の 2 つの例を考えてみてください。
public class Foo
{
public void DoSomething()
{
// the first way of creating the object
var addressDtoFirstWay = AddressDtoFirstWay
.CreateWithPredefinedValues();
addressDtoFirstWay.StreetName = "Street";
addressDtoFirstWay.HouseNumber = 100;
addressDtoFirstWay.PostalCode = "1000";
// the second way of creating the object
var addressDtoSecondWay = AddressDtoSecondWay
.CreateWithPredefinedValues("Street", 100, null, "1000");
}
}
public class AddressDtoFirstWay
{
public string RecipientName { get; set; }
public string StreetName { get; set; }
public int HouseNumber { get; set; }
public int? FlatNumber { get; set; }
public string PostalCode { get; set; }
public string City { get; set; }
public string CountryName { get; set; }
public static AddressDtoFirstWay CreateWithPredefinedValues()
{
return new AddressDtoFirstWay
{
RecipientName = "John Doe",
City = "City",
CountryName = "Country"
};
}
}
public class AddressDtoSecondWay
{
public string RecipientName { get; set; }
public string StreetName { get; set; }
public int HouseNumber { get; set; }
public int? FlatNumber { get; set; }
public string PostalCode { get; set; }
public string City { get; set; }
public string CountryName { get; set; }
public static AddressDtoSecondWay CreateWithPredefinedValues(
string streetName,
int houseNumber,
int? flatNumber,
string postalCode)
{
return new AddressDtoSecondWay
{
RecipientName = "John Doe",
StreetName = streetName,
HouseNumber = houseNumber,
FlatNumber = flatNumber,
PostalCode = postalCode,
City = "City",
CountryName = "Country"
};
}
}
最初の例では、ファクトリ メソッドは事前定義されたフィールドのみを初期化します。ユーザーは、オブジェクトの作成後に残りのフィールドを初期化する必要があります。2 番目の例では、事前定義されたフィールドと必須フィールドを初期化しますが、欠点として、ユーザーは null 許容 (この場合は必須ではありませんが、他のフィールドでは必須) フィールドに入力する必要がありますflatNumber
。
これら 2 つのソリューションの長所と短所の両方を理解していますが、どちらがより好ましいか、またその理由を検討しています。たぶん、他のアプローチがさらに良いでしょう。私はどんな提案も受け入れますが、ビルダーパターンが適用される問題はそれほど複雑ではないことに注意してください。