Esempio di base: lancio di una palla
Analizzare gli aiuti della logica aziendale. La palla può forse lanciarsi da sola? Probabilmente no. È solo una palla e non può muoversi da sola. Ciò significa che dovrai creare un BallLauncher per avviarlo.
Cosa dovrebbe contenere Ball class? Principalmente proprietà dell'oggetto, come raggio, colore e consistenza.
Esempio di due oggetti: lancia un razzo
A Rocket può essere lanciato da solo, o può richiedere un launcher. A volte, guardando la logica, potrebbe non essere ovvio dove mettere il metodo. Un missile non è passivo, ma potrebbe aver bisogno di un lanciatore. È necessario un lanciatore per lanciare un razzo, ma il razzo partecipa anche al lancio.
Quando la logica non è ovvia, ecco un suggerimento: implementa il metodo Launch e osserva come vengono utilizzati Rocket e Launcher .
Esempio:
class Rocket
{
public void Launch()
{
this.ControlTower.RequestTakeoff().WhenAuthorized(launcher =>
{
launcher.Prepare();
if (launcher.Status == LauncherStatus.ReadyForLaunch)
{
launcher.Launch();
launcher.PrepareNewRocket();
}
else
{
throw new BrokenLauncherException();
}
});
}
}
sovrascrive su Launcher e deve essere spostato su Launcher class. D'altra parte:
class Launcher
{
public void Launch(Rocket rocket)
{
rocket.Ignite();
rocket.IncreasePressureTo(Rocket.RecommendedPressureOnLaunch);
rocket.PrepareForTakeoff();
if (rocket.IsReady)
{
this.Release();
rocket.Takeoff();
}
else
{
rocket.CancelTakeoff();
rocket.Engines.ShutDownEmergency();
throw new BrokenRocketException();
}
}
}
è un metodo illustrativo che si trova in una classe sbagliata: dovrebbe essere spostato su Rocket .
Esempio di tre oggetti: pacchetto, repository, uploader
Allo stesso modo, se hai Package e Repository :
- Il pacchetto deve essere caricato su un repository,
- Se un repository carica un pacchetto su se stesso,
- O dovrebbe esserci un
Uploader che si occupa di pacchetti e repository attraverso Upload(package, repository) ?
Ancora una volta, prevale la logica aziendale e, come nell'esempio precedente, può essere d'aiuto osservare come Package e Repository siano usati all'interno del metodo.
-
Se Upload sovrascrive su Package , potrebbe essere un suggerimento che dovrebbe essere Package.Upload .
-
Se Upload chiama i metodi da Repository praticamente sempre, spostalo su Repository .
-
Se Upload ha una logica che semplicemente non si adatta a Package o Repository , questa è una buona opportunità per creare un Uploader .