Dillo, non chiedere potrebbe aiutarti qui.
switch (animal.getAnimalType()) {
case "DOG":
Food food = new Meat();
break;
case "FISH":
Food food = new Bread();
break;
default:
return;
}
Si noti che cos'è questo frammento di codice: un comportamento di attivazione. È un "odore di codice" in una soluzione orientata agli oggetti. Di solito, indica che c'è un oggetto sottostante che non hai scoperto. Qui, potrebbe essere più preciso dire che non hai delegato la responsabilità agli oggetti che hai già scoperto.
interface Animal {
void growl();
void orderDinner(DinnerOrder order);
}
class Dog implements Animal {
//...
void orderDinner(DinnerOrder order) {
order.add(new Meat());
}
}
class Fish implements Animal {
//...
void orderDinner(DinnerOrder order) {
order.add(new Bread());
}
}
In realtà, probabilmente non ha senso specificare l'istanza del cibo che l'animale vuole - probabilmente non si preoccupa di una specifica entità Pane, tanto quanto Bread come un tipo . Quindi forse questo viene posticipato all'oggetto DinnerOrder
.
Quindi potresti implementare DinnerOrder
con metodi che consentono ad un animale di specificare il tipo di cibo che desidera, e libera l'animale dal conoscere i dettagli (incapsulamento).
class Fish implements Animal {
//...
void orderDinner(DinnerOrder order) {
order.addBread();
}
}
Il cablaggio fisso in un comando specifico non è facilmente generalizzato. Quindi potrebbe essere che tu voglia usare gli argomenti per specificare il cibo dopotutto. Ma come notato sopra, probabilmente non ci interessa quale entità Pane stia cenando stasera; in particolare, potremmo voler regalare agli animali un regalo speciale a Natale; così gli animali specificano ciò che vogliono, e quindi il fornitore fa del suo meglio.
class Fish implements Animal {
//...
void orderDinner(DinnerOrder order) {
order.add(BREAD);
}
}
Naturalmente, se pensi che il cibo preferito sia un tratto di un certo numero di animali, allora potresti cercare di trattare il cibo, non come una costante statica, ma come una proprietà di un'istanza.
class Fish implements Animal {
//...
void orderDinner(DinnerOrder order) {
order.add(this.preferredFood);
}
}
Questo è un pattern OO molto comune; un metodo che passa una copia del suo stato a un argomento per un'ulteriore elaborazione. Ad esempio, questo è il modo in cui DomainServices
di solito funziona in un modello di dominio - il servizio viene passato a un aggregato, che fornisce il proprio stato al servizio per lavoro.
Talvolta vengono utilizzate specifiche per renderlo ancora più generale. Invece di passare una proprietà da interpretare a DinnerOrder, puoi passare un predicato che identifica quali alimenti hanno quella proprietà e quindi lasciare che il destinatario indaga sulle alternative disponibili.
Specification<Food> FISH_FOOD = new Specification {
boolean isSatifiedBy(Food food) {
return food.isA(BREAD);
}
}
class Fish implements Animal {
//...
void orderDinner(DinnerOrder order) {
order.order(FISH_FOOD);
}
}
Usato in questo modo, la Specifica è un esempio del modello di strategia; che potrebbe essere più adatto se volessi dare agli Animali un modo per classificare / scegliere quale delle opzioni disponibili preferirebbero ...