OOP in Java - A cosa servono i getters?

3

Di solito, i getter restituiscono sempre il valore di una variabile. Ho appreso nella mia letteratura che l'accesso ai campi è controllato da getter e setter. Quando ho avuto il mio codice valutato dai programmatori, è stato improvvisamente detto che getter e setter violano il pensiero orientato agli oggetti.

Finora, ho sempre impostato le istruzioni di uscita nel metodo di una classe che ha apportato modifiche all'oggetto. Tuttavia, se voglio cambiare il modo in cui faccio le uscite (per esempio graficamente o in un terminale), dovrei riscrivere tutte le classi. Pertanto, ho considerato di fare quanto segue: L'output non è più realizzato nella classe, ma la classe fornisce metodi che forniscono i valori da visualizzare. Un'altra classe viene quindi creata per la visualizzazione, che utilizza getter speciali per interrogare lo stato dell'oggetto e visualizzare i dati come preferisce. I getter sono nella classe che ha questi dati. Ad esempio, potrei avere un oggetto "Umano". The Human ha tra le altre cose le variabili lifeCurrent e lifeMax. Questi campi rappresentano la salute, se si impostano questi valori in relazione. Un'altra classe chiamata "Display" è ora responsabile della visualizzazione dello stato attuale di un Umano. Quindi creo un get getinner nella classe umana che restituisce una lista con lifeCurrent e lifeMax. la classe Display avrebbe una funzione chiamata salute (Umana). Questa funzione chiama il getter dall'umano e visualizza i valori per l'utente del programma. È uno stile accettato usare getter come questo?

    
posta Henry Weinert 03.02.2018 - 12:29
fonte

2 risposte

2

I nomi che dai alle entità del programma mostrano ciò che pensi di loro, e questo non sembra essere corretto (se ho capito bene la tua descrizione):

  • Le istanze di Human rappresentano gli esseri umani, e va bene.
  • Un metodo getHealth() che restituisce una lista di lifeCurrent e lifeMax implica che una "salute" è una coppia di lifeCurrent e lifeMax . È strano. Per me, una salute sarebbe un numero che può essere calcolata da lifeCurrent e lifeMax (se questa è l'ipotesi del mondo modello). Quindi, getHealth() dovrebbe fare quel calcolo e restituire il risultato. [Se dici "dammi una macchina" a qualcuno, non vuoi ottenere un kit senza istruzioni, vuoi il prodotto finale].
  • È utile separare la business logic e l'interfaccia utente, come fai con Human (business logic) e Display (interfaccia utente).
  • Un nome di classe di Display mi confonde. I nomi delle classi dovrebbero essere nomi, quindi l'ho letto come per es. un display TFT, che non è quello che intendevi. Un nome migliore sarebbe Presenter . E diverse istanze di Presenter potrebbero mostrare il risultato su media diversi o in diversi formati.
  • Un nome di metodo di health(Human) è troppo aspecifico. Che cosa fa per la salute? printHealth sarebbe un nome migliore. E mi aspetto che un metodo printHealth() accetti un parametro di integrità (un numero) anziché un Human . Mi aspetto che un metodo di stampa accetti un Human per stampare tutte le informazioni su quel Human .
risposta data 03.02.2018 - 13:54
fonte
1

La risposta breve è no . Non appena definisci un metodo che restituisce una variabile di istanza in qualsiasi forma al solo scopo di avere quell'informazione dall'altra parte, stai sbavando le responsabilità su tutta la tua applicazione, violando l'incapsulamento e ogni sorta di altre cose.

Ora la domanda diventa: hai un motivo per invitare tutte quelle cose brutte? Se sì, allora potrebbe esserci un motivo per avere anche i getter.

Una delle ragioni potrebbe essere che hai un limite naturale (del dominio aziendale) e non puoi (non puoi!) sapere cosa succede dall'altra parte. Quindi, se non sai come verrà mostrato da altri sviluppatori, devi pubblicare tutti i dati. Se fai sai come sarà presentato, allora quella presentazione (una parte astratta di essa) appartiene all'oggetto (in modo da evitare i getter).

Quindi la domanda è, perché vuoi cambiare il metodo di output. È davvero un requisito essere in grado di cambiarlo in qualsiasi momento? O sarà cambiato una volta e probabilmente mai più?

    
risposta data 03.02.2018 - 19:49
fonte

Leggi altre domande sui tag