Zasadniczo muszę wykonywać różne działania, biorąc pod uwagę określony warunek. Istniejący kod jest zapisywany w ten sposób
Interfejs podstawowy
// DoSomething.java
interface DoSomething {
void letDoIt(String info);
}
Wdrożenie pierwszej klasy robotniczej
class DoItThisWay implements DoSomething {
...
}
Wdrożenie drugiej klasy robotniczej
class DoItThatWay implements DoSomething {
...
}
Główna klasa
class Main {
public doingIt(String info) {
DoSomething worker;
if (info == 'this') {
worker = new DoItThisWay();
} else {
worker = new DoItThatWay();
}
worker.letDoIt(info)
}
Ten kod działa dobrze i jest łatwy do zrozumienia.
Teraz, ze względu na nowy wymóg, muszę przekazać nową informację, która ma sens DoItThisWay
.
Moje pytanie brzmi: czy następujący styl kodowania jest dobry, aby poradzić sobie z tym wymogiem.
Użyj nowej zmiennej klasy i metody
// Use new class variable and method
class DoItThisWay implements DoSomething {
private int quality;
DoSomething() {
quality = 0;
}
public void setQuality(int quality) {
this.quality = quality;
};
public void letDoIt(String info) {
if (quality > 50) { // make use of the new information
...
} else {
...
}
} ;
}
Jeśli zrobię to w ten sposób, muszę wprowadzić odpowiednią zmianę do osoby dzwoniącej:
class Main {
public doingIt(String info) {
DoSomething worker;
if (info == 'this') {
int quality = obtainQualityInfo();
DoItThisWay tmp = new DoItThisWay();
tmp.setQuality(quality)
worker = tmp;
} else {
worker = new DoItThatWay();
}
worker.letDoIt(info)
}
Czy to dobry styl kodowania? Czy mogę to po prostu rzucić
class Main {
public doingIt(String info) {
DoSomething worker;
if (info == 'this') {
int quality = obtainQualityInfo();
worker = new DoItThisWay();
((DoItThisWay) worker).setQuality(quality)
} else {
worker = new DoItThatWay();
}
worker.letDoIt(info)
}
DoItThisWay
i DoItThatWay
są wykonywane raz w konstruktorze Main
. Main
jest klasą długowieczną i doingIt
nazywa się ją wiele razy.
setQuality
metoda będzie wywoływana wiele razy podczas życia DoItThisWay
obiektu?
quality
do konstruktoraDoItThisWay
?