デフォルトのパラメータを使用して型システムを回避することはアンチパターンです

私は今日、大学のコース プロジェクトでピア プログラミングを行っています。コードベースには、04 があります。 次のようなクラス:

public class Ship {
    private final String name;
    private final int length;
    private int hitCount = 0;

    public Ship(String name, int length) {
        this.name = name;
        this.length = length;
    }

    // other methods
    ...
}

その後、コース プロジェクトの新しい要件により、17 と呼ばれる別のフィールドを追加する必要があります。 、クラスに、次の変更を加えました:

public class Ship {
    private final String name;
    private final int length;
    private int hitCount = 0;
    private final int captainsQuertersHealth;
    public Ship(String name, int length, int captainsQuertersHealth) {        this.name = name;
        this.length = length;
        this.captainsQuertersHealth captainsQuertersHealth;    }

    // other methods
    ...
}

ただし、古いインターフェイスに対してテストする単体テストが大量にあり、それらは 29 を気にしません。 フィールド.私のパートナーは、デフォルトのパラメータを追加することを提案しました.コースプロジェクトはJavaであり、デフォルトではデフォルトのパラメータをサポートしていないため、オーバーロードされたコンストラクタを追加することをお勧めします:

public Ship(String name, int length) {
  this(name, length, 1);
}

このコンストラクターは前のコンストラクターに委譲し、常にデフォルトの 36 確かに便利ですが、このコンストラクタを追加すると、このコンストラクタを使用する場所でコンパイラがコンパイル エラーを生成できなくなり、その場所では 46<を気にします。 /コード> .結果として、コンパイラでキャッチ可能なバグが実行時まで延期されます。

私はチームメイトに、それは悪い考えだと納得させました。最終的な解決策は、単体テストにヘルパーを追加することでした:

private Ship createShip(String name, int length) {
  return new Ship(new, length, 1);
}

デフォルトのパラメーターや関数のオーバーロードを使用するべきではないと言っているのではありませんが、それらの欠点に気付き、慎重に使用してください。