読みやすさのためだけに名前でサブクラスを作成することは悪い習慣ですか?


8

1つのパッケージに3つのセンサーがあり、すべてを調整する必要があります。これらをsens1、sens2、およびsens3と呼びます。sens1とsens2のキャリブレーションは同じですが、sens3のキャリブレーションには追加のパラメーターが必要です。私の質問は、「読みやすさを維持しながら、ほぼ同一の3つのオブジェクトを処理する最良の方法は何ですか?」です。

もちろん、最初に考えたのは、ポリモーフィズムを使用することでした。汎用のSensorオブジェクトを.calibrate(Parameters params)メソッドでセットアップします。ここで、Parametersクラスを使用すると、実行しているキャリブレーションに基づいてパラメーターの数を変更できます。ただし、これにより次のようになります。

Sensor sens1 = new Sensor();
Sensor sens2 = new Sensor();
Sensor3 sens3 = new Sensor3();

将来の人々は、1つのセンサーが他の2つのセンサーと根本的に異なることを知る必要がありますが、非常によく似ているため、Sens1とSens2を名前だけでサブクラス化するのが最善のようです。言い換えると、より論理的なクラス名を持たせるために、動作を変更または拡張しない2つのサブクラスを作成します。これらの3つのセンサーはすべて同じパッケージに含まれているため、このデータは非常に頻繁に組み合わされます。これにより、上記のコードが次のように変更されます。

Sensor1 sens1 = new Sensor1();
Sensor2 sens2 = new Sensor2();
Sensor3 sens3 = new Sensor3();

どこ

Sensor1 extends Sensor {
}

Sensor2 extends Sensor {
}

Sensor3 extends Sensor {
    @Override
    calibrated(Parameters params) {
        \\ Code
    }
}

これは良い考えだと私は夢中ですか?ここで完全に見落としているきれいなパターンはありますか?

回答:


5

書かれているように(過度に単純化されている可能性があります)、センサーは一般的な動作ではすべて同じであるように聞こえますが、キャリブレーションのパラメーターが異なります。

これが唯一の違いであり、Java(以下で使用)などのジェネリックを使用する言語を使用している場合は、次のようなパラメーターでクラスを生成できます。

abstract class Sensor<CalibrationParameters> {
   // constructor, getters, setters, etc...

   abstract public void calibrated(CalibrationParameters parameters);
}

その後の束

public class SensorN extends Sensor<CalibrationParametersForSensorN> {

   public void calibrated(CalibrationParametersForSensorN parameters) {
      ...
   }

}

警告:IDEなしで入力されたため、タイプミスやエラーがある可能性があります...

psロバートに同意する。したがって、より具体的な実装は次のようになります。

public class Thermometer extends Sensor<ThermometerCalibration> {

    public void calibrated(ThermometerCalibration parameters) {
       ...
    }

}

9

これらのセンサのための最高のわかりやすい名前があるない場合はSensor1Sensor2Sensor3。数値は、センサー間の特徴的な特性を示すものではありません。

異なるクラスが異なるタイプのセンサーを示す場合、異なるクラスが保証される場合があります。これが、クラスをタイプと呼ぶことがある理由ですが、「タイプ」という言葉自体はより広い意味を持っています。

PressureSensor extends Sensor
TemperatureSensor extends Sensor

私の特定のケースでは、Sensor1、Sensor2などは使用せず、実際の読みやすいセンサー名を使用します。これは例として使用しただけです。私のクラスには、あなたが挙げた例のような名前を付けます。
tomsrobots

0

キャリブレーションがセンサーの責任であるかどうかはわかりません... 2つの新しいクラスを作成することを検討します。SensorCalibratorBase、SensorCalibratorAdavancedのようなもの。次に、アプリの状態に基づいてキャリブレーターの特定のインスタンスを作成し、センサーインスタンスをそのキャリブレーション機能にフィードします。各キャリブレータは、必要なパラメータをコンストラクタの引数として取得します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.