Da quello che hai chiesto, la tua classe sembra essere un veicolo per chiamare doThat()
. E doThat()
ha bisogno di tre "parametri", un languageRepository
, un firstArg
e un secondArg
.
Per me, "orientato agli oggetti" significa che ogni singola istanza che hai nella tua applicazione dovrebbe rappresentare qualcosa (corrispondente al nome della classe), e non la vedo nella tua domanda.
Da ora in poi, devo fare qualche congettura.
Suppongo che durante la vita della tua applicazione, vuoi chiamare doThat()
più di una volta, con i singoli valori firstArg
e secondArg
, ma con costante languageRepository
(o o alcuni enumerati).
Approccio 3
Quindi l'approccio 3 (che imposta tutti e tre i parametri nel costruttore) crea un'istanza di eliminazione per ogni singola chiamata doThat()
. Facendo ciò con un nome di classe di Language
si genera Great Astonishment (perché dovresti creare una nuova lingua per ogni chiamata di doThat()
- il numero di lingue nel mondo è noto, limitato ed enumerabile).
L'utilizzo tipico sarebbe come:
Language lang = new Language(repository, firstArg, secondArg);
lang.doThat();
E in seguito, l'istanza lang
diventa inutile: l'istanza non ha alcuno scopo e può essere sostituita da un metodo statico (raramente una buona scelta).
Approccio 2
Con il tuo approccio 2, le cose vanno ancora peggio:
LanguageDoThat lang = new LanguageDoThat(repository, firstArg, secondArg);
Questo diventa inutile spazzatura nel momento stesso in cui hai finito di creare l'istanza. E il tuo utente deve imparare che qui, creare un'istanza da buttare fa un lavoro reale - Very Great Astonishment.
Approccio 1
Questo è l'unico che potrebbe avere senso. Inizialmente crei un Language
con un dato (e presumibilmente costante) languageRepository
(o alcuni di essi con diversi linguaggi specifici), e chiama doThat()
più volte più volte con% di variazione firstArg
e secondArg
argomenti. Quindi un'istanza Language
rappresenta alcuni aspetti del linguaggio rilevanti per la tua applicazione (manifest nel metodo doThat()
) e sopravvive per più di una chiamata doThat()
. L'utilizzo potrebbe essere qualcosa come:
Language lang = Language.getInstance("en"); // or whatever way you choose,
// maybe Songleton Pattern,
// maybe Dependency Injection...
lang.doThat(firstArg, secondArg);
Alternative
LanguageRepository
Aggiungi il metodo doThat()
alla classe del repository di lingue. Dichiarazione di non responsabilità: dovresti decidere se si adatta in modo semantico.
Metodo statico
Crea doThat()
un metodo statico della classe Language, chiarendo che si tratta di una semplice chiamata procedurale:
public static void doThat(LanguageRepository repo, String arg1, String arg2) {
...
}
Runnable
Implementa l'interfaccia Runnable per doThat()
:
public class LanguageDoThatRunnable implements Runnable {
private LanguageRepository repo;
private String arg1;
private String arg2;
public Language(LanguageRepository repo, String arg1, String arg2) {
this.repo = repo;
this.arg1 = arg1;
this.arg2 = arg2;
}
public void run() {
...
}
}
Con Runnable, gli sviluppatori sono usati per creare un'istanza con tutti i parametri necessari per l'esecuzione già nel costruttore e avere un metodo no-args run () per il lavoro. Tecnicamente, siamo vicini al tuo approccio 3, ma nominarlo come Runnable (e implementare quell'interfaccia) evita lo stupore. Ma potrebbe essere eccessivo.
Consigli
Decidi quale istanza di una classe intende rappresentare, quindi la struttura lo segue.
Il costruttore dovrebbe rendere l'istanza una rappresentazione valida del concetto e "fare" qualsiasi cosa dovrebbe essere il dovere dei metodi.