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

28

Sono entrato in un progetto e vedo che gli altri sviluppatori aggiungono molta logica ai setter delle proprietà sintetizzate. Capisco come funziona, ma penso che sia difficile capire il flusso del programma; mentre leggo il codice, ogni volta che vedo self.something = whatever , controllo sempre se il setter di something è sovrascritto.

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

Sarei lieto di leggere di più su questo se hai link / fonti rilevanti, è 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, suppongo).

    
posta phi 13.07.2013 - 23:43
fonte

3 risposte

43

Is it considered a bad practice to add logic in a property setter?

No

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

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

  • aggiorna alcuni valori derivati
  • notifica agli osservatori che lo stato della classe è cambiato
  • propagare la modifica ad un oggetto contenuto
  • propagare la modifica a un backing store
  • eseguire la convalida

La programmazione è più semplice quando le classi hanno interfacce che rendono ovvio ciò che la classe può fare, senza che i chiamanti pensino a come è fatto. Mettere la logica dietro i setter di proprietà permette 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à.

    
risposta data 14.07.2013 - 00:38
fonte
15

I setter sono tipicamente usati per cambiare lo stato di un oggetto senza significativi effetti collaterali o calcoli pesanti, usare metodi e funzioni per questo. Il motivo principale per cui l'implementazione setter è modifica e mantenimento di uno stato valido . Quindi, limitando l'intervallo, impostando i flag per richiedere il ricalcolo o regolando le proprietà correlate è assolutamente soddisfacente.

    
risposta data 14.07.2013 - 00:09
fonte
7

Non so dell'obiettivo C, ma come dici tu, sembra una domanda abbastanza generica per qualsiasi linguaggio OO. Prima di tutto e in realtà collegato a questo, è necessario discutere se avere setter e getter è una questione di discussione (in alcuni casi la loro esistenza è giustificata dall'uso di una struttura o di una biblioteca).

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

    
risposta data 14.07.2013 - 00:39
fonte

Leggi altre domande sui tag