Ist es eine schlechte Praxis, eine Unterklasse nur aus Gründen der Lesbarkeit im Namen zu erstellen?

8

Ich habe drei Sensoren in einem einzigen Paket, die alle kalibriert werden müssen und die ich sens1, sens2 und sens3 nennen werde. Die Kalibrierung für sens1 und sens2 ist identisch, für die Kalibrierung für sens3 ist jedoch ein zusätzlicher Parameter erforderlich. Meine Frage lautet: "Was ist der beste Weg, um mit drei nahezu identischen Objekten umzugehen und gleichzeitig die Lesbarkeit zu gewährleisten?"

Mein erster Gedanke war natürlich, Polymorphismus zu verwenden. Ich würde ein generisches Sensorobjekt mit einer .calibrate-Methode (Parameters params) einrichten, bei der ich mit der Parameters-Klasse die Anzahl der Parameter basierend auf der von mir durchgeführten Kalibrierung variieren kann. Dies führt jedoch zu Folgendem:

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

Damit zukünftige Leute wissen müssen, dass sich ein Sensor grundlegend von den beiden anderen unterscheidet, aber sehr, sehr ähnlich ist, scheint es mir das Beste zu sein, Sens1 und Sens2 nur im Namen zu unterordnen. Mit anderen Worten, erstellen Sie zwei Unterklassen, die kein Verhalten ändern oder erweitern, um logischere Klassennamen zu erhalten. Denken Sie daran, dass sich alle drei Sensoren im selben Paket befinden, sodass diese Daten sehr oft zusammenpassen. Dies ändert den obigen Code in:

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

wo

Sensor1 extends Sensor {
}

Sensor2 extends Sensor {
}

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

Bin ich verrückt danach zu denken, dass dies eine gute Idee ist? Gibt es ein saubereres Muster, das mir hier völlig fehlt?

Tomsrobots
quelle

Antworten:

5

Wie geschrieben (was möglicherweise zu stark vereinfacht ist) klingt es so, als ob die Sensoren im allgemeinen Verhalten alle gleich sind, aber die Parameter für die Kalibrierung sind unterschiedlich.

Wenn dies der einzige Unterschied wäre und Sie eine Sprache mit Generika wie Java (siehe unten) verwenden, können Sie die Klasse anhand der Parameter generieren, z. B.:

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

   abstract public void calibrated(CalibrationParameters parameters);
}

dann ein Haufen

public class SensorN extends Sensor<CalibrationParametersForSensorN> {

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

}

Vorsichtsmaßnahme: Ohne IDE eingegeben, sodass Tippfehler oder Fehler auftreten können ...

ps Stimmen Sie mit Robert überein, dass bessere Namen besser wären. Eine bessere konkrete Umsetzung wäre also:

public class Thermometer extends Sensor<ThermometerCalibration> {

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

}
user949300
quelle
9

Nicht, wenn die besten beschreibenden Namen für diese Sensoren sind Sensor1, Sensor2und Sensor3. Die Zahlen geben keine Unterscheidungsmerkmale zwischen den Sensoren an.

Wenn die verschiedenen Klassen unterschiedliche Arten von Sensoren bezeichnen, können unterschiedliche Klassen gerechtfertigt sein. Aus diesem Grund bezeichnen wir Klassen manchmal als Typen, obwohl das Wort "Typ" selbst eine breitere Bedeutung hat.

PressureSensor extends Sensor
TemperatureSensor extends Sensor
Robert Harvey
quelle
In meinem speziellen Fall würde ich definitiv nicht Sensor1, Sensor2 usw. verwenden, sondern tatsächlich lesbare Namen von Sensoren. Ich habe dies nur als Beispiel verwendet. Ich würde meine Klassen wie die Beispiele benennen, die Sie gegeben haben.
Tomsrobots
0

Ich bin mir nicht sicher, ob die Kalibrierung in der Verantwortung des Sensors liegen sollte ... Ich würde in Betracht ziehen, zwei neue Klassen zu erstellen. So etwas wie SensorCalibratorBase, SensorCalibratorAdavanced. Dann würde ich eine bestimmte Instanz des Kalibrators basierend auf dem App-Status erstellen und die Sensorinstanz ihrer Kalibrierungsfunktion zuführen. Jeder Kalibrator würde die benötigten Parameter als Konstruktorargumente erhalten.

DanielS
quelle