È considerata una cattiva pratica aggiungere la logica in un setter di proprietà?


28

Sono passato a un progetto e vedo che gli altri sviluppatori stanno aggiungendo molta logica nei setter delle proprietà sintetizzate. Capisco come funziona, ma penso che sia difficile capire il flusso del programma; durante la lettura del codice, ogni volta che vedo self.something = whatever, controllo sempre se somethingil setter è ignorato.

Quali sono le tue opinioni su questo argomento? Pensi che questo sia un segno di cattiva architettura o una soluzione elaborata?

Sarei felice di leggere di più su questo se hai collegamenti / fonti pertinenti, è troppo difficile ottenere buoni risultati su Google, quindi ho deciso di chiedere anche qui.

Grazie per qualsiasi risposta e tieni presente che sto parlando dell'obiettivo C nel caso in cui tu non abbia visto il tag (anche se questo non dovrebbe essere un problema specifico della lingua immagino).


5
Che tipo di logica? Non c'è nulla di sbagliato nel mettere la logica di validazione, per esempio. D'altra parte, un setter che invia alcuni eventi, chiama un servizio web e aggiorna l'interfaccia utente è completamente sbagliato.
Arseni Mourzenko,

@MainMa Sono d'accordo che le convalide vanno bene - forse aggiungendo anche alcuni osservatori, giusto? Potresti forse dare alcuni esempi di ciò che ritieni più appropriato da inserire in un setter?
phi,

anzi, gli osservatori hanno ragione. Per quanto riguarda le cose appropriate per un setter, lascio che sviluppatori più esperti rispondano a questa domanda.
Arseni Mourzenko,

Risposte:


44

È considerata una cattiva pratica aggiungere la logica in un setter di proprietà?

No

Le proprietà sono state inventate per consentire ai progettisti di classe di avere la logica collegata a una comoda interfaccia di accesso e assegnazione sul campo.

Quanto è troppo? Dipende dalle responsabilità della classe. Ecco alcune cose che è ragionevole mettere in un setter di proprietà:

  • aggiorna alcuni valori derivati
  • avvisare gli osservatori che lo stato della classe è cambiato
  • propagare la modifica ad alcuni oggetti contenuti
  • propagare la modifica in un archivio di supporto
  • eseguire la convalida

La programmazione è più semplice quando le classi hanno interfacce che rendono ovvio ciò che la classe può fare, senza indurre i chiamanti a pensare a come viene fatto. Mettere la logica dietro i setter di proprietà consente alle classi di nascondere la loro implementazione dietro una semplice interfaccia. Per alcune classi, non sono richiesti metodi. Basta girare le manopole impostando le proprietà e leggere l'output ottenendo le proprietà.


13
Esegui la convalida ...
Robert Harvey,

Quanto è buono ricaricare una collectionview o tableview in un metodo ignorato setter?
Krishnan,

15

I setter vengono in genere utilizzati per modificare lo stato di un oggetto senza effetti collaterali significativi o calcoli pesanti; utilizzare metodi e funzioni per questo. Il motivo principale per l'implementazione del setter sta cambiando e mantenendo uno stato valido . Pertanto, limitare l'intervallo, impostare i flag per richiedere il ricalcolo o regolare le proprietà correlate va assolutamente bene.


7

Non conosco l'obiettivo C, ma come dici tu, sembra una domanda abbastanza generica per qualsiasi linguaggio OO. Prima di tutto e in realtà correlato a ciò, se avere setter e getter in primo luogo è una questione di discussione (in alcuni casi la loro esistenza è giustificata dall'uso di un framework o di una libreria).

Credo che il nome del metodo dovrebbe spiegare cosa fa il metodo e tutto il metodo. Inoltre, la documentazione associata a tale metodo dovrebbe descriverla in modo più esplicito. In questo senso, un nome di metodo nella forma "set" + {sostantivo} non dovrebbe avere effetti collaterali diversi dall'impostazione del valore di una variabile e questa dovrebbe essere l'unica azione ad essa associata. Controllare che l'argomento sia valido, è accettabile ma dovrebbe essere descritto nella sua documentazione.


1
+1 per "se avere setter e getter". E un altro +1 per "nome metodo dovrebbe spiegare cosa fa".
aviv
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.