È 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.