コンストラクタのオーバーロードが複数ある場合のメンバーの初期化について
意見交換したいこと
C# や Java などの言語では、引数付きコンストラクタが複数定義されることがあります。
いわゆるコンストラクタのオーバーロードです。
その際フィールドやプロパティの初期化をする場合に、どのコンストラクタに書くべきか迷うことがあります。
可読性、保守性、拡張性などの観点から皆様のご意見を伺いたいです。
少ない方に合わせる
既存のコンストラクタを変更しなくて済むので、仕様追加などで後から引数の多いコンストラクタを追加した場合などはよくこっちの書き方をします。
ただ、こちらのケースだと、後から追加したフィールドやプロパティのデフォルト値を宣言時に定義する必要があります。(既存コンストラクタで初期化されないため。)
こっちの書き方は Java ではあまり見ない気もします。
Objetive-C はこちらのケースで書くことが多かった記憶があるようなないような。
(swift はちゃんと使ったことがないのでよくわかりません)
public Person(string name, int age)
{
Name = name;
Age = age;
}
public Person(string name, int age, EmployeeType type) : this(name, age)
{
EmployeeType = type;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name, int age, EmployeeType type) {
this(name, age);
this.employeeType = type;
}
多い方に合わせる
最初から複数定義する想定であれば、だいたいこっちで書きます。
どのコンストラクタでも全てのメンバーが初期化される一方で、コンストラクタを追加する場合に既存のコンストラクタにも手を入れる必要があります。(=変更量が多い)
メンバーの初期化処理が1つのコンストラクタに集中するので、管理はこちらの方がしやすいと思います。
Java はこっちの方が多い印象。
public Person(string name, int age) : this(name, age, EmployeeType.Normal)
{
}
public Person(string name, int age, EmployeeType type)
{
Name = name;
Age = age;
EmployeeType = type;
}
public Person(String name, int age) {
this(name, age, EmployeeType.NORMAL);
}
public Person(String name, int age, EmployeeType type) {
this.name = name;
this.age = age;
this.employeeType = type;
}