I modelli di dominio basati su ActiveRecord dovrebbero avere proprietà visibili? Perché o perché no?

6

I modelli di dominio basati su ActiveRecord dovrebbero avere proprietà visibili? Perché o perché no?

La mia esperienza e gli studi mi hanno sempre portato a credere che le proprietà degli oggetti dovrebbero essere sempre protette e che i dati dovrebbero essere manipolati / accessibili solo attraverso i metodi. Questo assicura che se gli interni della classe devono essere refactored, altri oggetti che si basano su quell'oggetto non devono quindi essere nuovamente refactored.

Spesso vedo i modelli di dominio con proprietà pubblicamente visibili, tuttavia i modelli possono essere passati per dire oggetti di visualizzazione che accedono direttamente a tali proprietà durante la costruzione della vista. Ho sempre pensato che questa sia forse l'unica eccezione alla regola sopra menzionata, perché altrimenti dovresti fondamentalmente creare getter e setter per oggetti come la vista da usare, o qualche altra soluzione dal suono altrettanto problematico. Forse mi sbaglio su questo? Vorrei ricevere un feedback sull'argomento.

    
posta dqhendricks 01.11.2011 - 21:54
fonte

2 risposte

1

Non penso che la tua preoccupazione si applichi a Ruby o ad altri linguaggi che supportano le proprietà. In Ruby, puoi associare qualsiasi comportamento desiderato all'impostazione di una proprietà, definendo un accessor . Ciò offre ai clienti una comoda sintassi, dando al progettista della classe il controllo completo sul comportamento. Impostare e ottenere metodi non sono necessari in Ruby.

    
risposta data 02.11.2011 - 00:16
fonte
1

I metodi pubblici sono estremamente convenienti e richiedono meno codice, in quanto non è necessario scrivere il mutatore metodi . Sono indovinando che la ragione per cui i modelli Active Record con proprietà pubbliche sono comuni è che sono considerati POD (POJO, POPO, POCOS ecc.), DTO o Oggetti valore .

Ma i modelli in genere comportano comportamenti e non c'è assolutamente alcun motivo, concettuale o di altro tipo, per qualsiasi altra classe che porta un comportamento contro incapsulamento . A meno che tu non abbia delle considerazioni sulle prestazioni estreme e desideri mantenere tutto il più leggero possibile, consiglierei di esporre le tue proprietà.

My experience and studies have always lead me to believe that object properties should always be protected, and that data should only be manipulated/accessed through methods.

No, dovrebbero essere quasi sempre privati, dichiararli protetti solo quando è assolutamente necessario accedervi in una classe figlia. La maggior parte delle volte puoi utilizzare i tuoi getter nella classe figlio, se in dubbio vai con proprietà private e getter e setter pubblici, e se a un certo punto nel futuro hai bisogno di proprietà protette, aggiorna semplicemente la tua API.

Domande correlate:

risposta data 01.11.2011 - 23:23
fonte

Leggi altre domande sui tag