web-dev-qa-db-ja.com

コンストラクターに0(リテラル)を渡す

主にの値を持つ整数IDをコンストラクターに渡すことにより、新しいオブジェクトを作成する関数があります。この関数は、(編集ではなく)新しく作成されたレコードを保存するときに呼び出されます。

enter image description here

public class RecordController
{
    private int _recordId;
    private int _subRecordId;
    private string _xmlData;

    private SubRecordA CreateSubRecordA()
    {
        _xmlData = LoadXmlData();
        ParseXmlData();

        return new SubRecordA(
            SubRecordTypeId.A  // leaky DAL abstraction
            0,
            0,
            _xmlData);
    }
}

ただし、2つの0パラメーターは、Init()メソッドで0に既に初期化されているプラ​​イベートフィールドと一致します

private void Init()
{
    _recordId = 0;
    _subRecordId = 0;
}

代わりに、これらのゼロ値フィールドをSubRecordA'sコンストラクターに明示的に渡す方がよいかどうかわかりませんか?

        return new SubRecordA(
            SubRecordTypeId.A  // leaky DAL abstraction
            _recordId,
            _subRecordId,
            _xmlData);

リテラル0を渡すと、意図がより明確になりますが、フローからこれらのフィールドを除外することでロジックが弱くなるようです(たとえば、_recordId-1将来のある時点で)。


更新

Robert Harveyの提案を使用して、デフォルトのコンストラクターでプロパティ/フィールドをゼロにすることで、必要なパラメーターのみを受け取り、: this()を呼び出す明示的なコンストラクターを作成しました。

public class SubRecordA : SubRecord
{
    public override int SubRecordTypeId { get {return (int)SubRecordTypeId.A; } }
    public int ParentRecordId { get; set; }
    public int RecordId { get; set; }
    public string XmlData { get; set; }

    public SubRecordA(string xmlData) : this()
    {
        //SubRecordTypeId = SubRecordTypeId.A;
        XmlData = xmlData;
    }
}
1
samis

根本的な問題は、0がIDの値が正しくないことです。

理想的にはそれらをGUIDに変更しますが、次善の策はそれらをnull許容のuintに変更することです。

これにより、オブジェクトが永続化されて実際のIDが取得されるまで、それらをnullに設定できます。

1
Ewan