web-dev-qa-db-ja.com

コンストラクターに多くのパラメーターがある

コンストラクター内に多くのパラメーターがあるのは間違っていますか? 10から15のパラメータが好きですか?コンストラクターが多くのパラメーターを持つクラスを設計していたためです。たとえば、Personクラスです。

私の例のpersonクラスには、コンストラクターに6つのパラメーターがあります。

public class Person {
    private String fName;
    private String lName;
    private String mInitial;
    private int age;
    private String contactNumber;
    private String emailAddress;

    public Person(String fName, String lName, String mInitial, int age, String contactNumber, String emailAddress) {
       //insert rest of code here 
    }
}

それは間違っていますか?コンストラクターのパラメーターをたくさん作成しますか?

次に、Employeeという名前のクラスを作成し、それをpersonクラスに拡張することを計画しています。そうすると、コンストラクターも長くなります。

私が心配しているのは練習です、これは良いですか、それとも何ですか?他に何か提案はありますか?

27
KyelJmD
  1. 一般に、パラメーターが多すぎる場合は、低レベルのクラスが十分にないことを意味します。あなたの場合、あなたは_class Name { /* fname, lname, initial, */ }_とおそらく_class Contact { /* email, phone */ }_を持つことができます

  2. クラスを拡張するときは、コンストラクターにベースを1つのパラメーターとして取得させてから、新しいパラメーターを追加します。 (おそらく、従業員が個人を拡張するのではなく、その逆を意味するので、public Employee (Person person, Company company, String employeeId) { super(person); this.company = company; this.employeeId = employeeId; }

良い質問!

22
necromancer

伸縮コンストラクタパターンを使用する代わりに、ビルダーパターン

public class Person {
    private final String fName;
    private final String lName;
    private final String mInitial;
    private final int age;
    private final String contactNumber;
    private final String emailAddress;

    public Person(PersonBuilder builder) {
       //insert rest of code here 
       fName = builder.fName;
       ...
    }

    public static class PersonBuilder {
        private String fName;
        private String lName;
        private String mInitial;
        private int age;
        private String contactNumber;
        private String emailAddress;
        // setter methods
        public PersonBuilder setFirstName(String name) {
             fName = name;
             return this;
        }
        ...
        // build method
        public Person build() {
            return new Person(this);
        }

    }
}

.。

Person p = new PersonBuilder()
              .setFirstName("")
              // set all the setter methods
              .build();
13

PersonNameContactに分解できます。

public class ComposedPerson {
    private Name name;
    private int age;
    private Contact contact;

    public ComposedPerson(Name name, int age, Contact contact) {
        this.name = name;
        this.age = age;
        this.contact = contact;
    }

    public static void main(String... args) {
        Name name = new Name("John");
        Contact contact = new Contact("12345", "[email protected]");
        ComposedPerson person = new ComposedPerson(name, 45, contact);
   }

サンプルName。伸縮コンストラクターを使用してオプションの引数を許可する方法をご覧ください。

public class Name {
    private String fName;
    private String lName;
    private String mInitial;

    public Name(String fName) {
        this(fName, null, null);
    }

    public Name(String fName, String lName) {
        this(fName, lName, null);
    }

    public Name(String fName, String lName, String mInitial) {
        this.fName = fName;
        this.lName = lName;
        this.mInitial = mInitial;
    }
} 
10
Sahil Muthoo

はい、どのような種類の関数にも多くのパラメーターを含めるのは良くありません。 Code Complete 2という本によると、最大パラメータは約7である必要があります。

これは、コードが減少するためです可読性および保守性およびユーザビリティ。同じプロジェクトに取り組んでいる他の開発者を想像してみてください。あなたのコードをどのようにフォローするのですか?

これを処理する方法はたくさんあります。たとえば、ファクトリパターンです。これは、アプリケーションの設計方法によって異なります。

しかし、あなたのコードでは、いいえ、それは大丈夫だと思います。パラメータの数はまだ許容可能です(6パラメータ)

オブジェクトがインスタンス化するために非常に多くのパラメーターを必要とする場合は、コードの設計方法を再考する必要があります。たとえば、一部の属性を別のクラスにラップできますか?一部の属性をパラメーターとして渡す必要はありませんか?つまり、他のクラスから値を取得します。等...

4
Kit Ho