Basicamente, preciso executar ações diferentes, dada uma determinada condição. O código existente é escrito desta maneira
Interface base
// DoSomething.java
interface DoSomething {
void letDoIt(String info);
}
Implementação da primeira classe de trabalhadores
class DoItThisWay implements DoSomething {
...
}
Implementação da segunda classe de trabalhadores
class DoItThatWay implements DoSomething {
...
}
A classe principal
class Main {
public doingIt(String info) {
DoSomething worker;
if (info == 'this') {
worker = new DoItThisWay();
} else {
worker = new DoItThatWay();
}
worker.letDoIt(info)
}
Este código funciona bem e é fácil de entender.
Agora, devido a um novo requisito, preciso passar uma nova informação que só faz sentido DoItThisWay.
Minha pergunta é: o seguinte estilo de codificação é bom para lidar com esse requisito.
Use nova variável de classe e método
// 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 {
...
}
} ;
}
Se eu fizer dessa maneira, preciso fazer a alteração correspondente no chamador:
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)
}
É um bom estilo de codificação? Ou posso apenas lançá-lo
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)
}
DoItThisWaye DoItThatWayé feita uma vez no construtor de Main. Mainé uma classe de vida longa e doingIté chamada várias vezes.
setQualitymétodo será chamado várias vezes durante a vida útil do DoItThisWayobjeto?
qualitypara o construtorDoItThisWay?