Tendo a seguire la risposta di Robert Harvey (concentrati sulla funzionalità della classe, non sui bit da fare che), ma c'è ancora dell'altro.
È raro che tu abbia mai creato una classe una da zero. Spesso fornisci alcune funzionalità e una decisione chiave da prendere è dove disegnare le linee per rompere quel set di funzionalità in blocchi di dimensioni di classe. Qual è un pezzo di classe? Una singola responsabilità .
Personalmente, trovo che sia efficace disegnare quelle linee di separazione in modo che le singole classi forniscano una buona API, ma differiscono anche per quanto sono mutabili . Tanto più che i programmi diventano più simultanei e più complessi, gli oggetti immutabili consentono di rendere l'implementazione più semplice, robusta e priva di bug.
Quindi, in riferimento alla domanda, "per impostazione predefinita" mirano a rendere le mie classi immutabili quando possibile. Prendono ciò che hanno bisogno di nel costruttore ed espongono la funzionalità che è quella responsabilità della classe. Dopodiché, mirano a rendere gli oggetti mutabili con un costruttore predefinito e uno stato iniziale sensato.
Una volta che sono su oggetti mutabili dipende da cosa fa l'oggetto. Alcuni oggetti sono un insieme di funzionalità in cui l'utente può manipolare uno stato , ma non necessariamente dati . Pensa alla progressione di un gioco di poker. Il gioco del poker qui è mutevole perché il suo stato può progredire. Per questi oggetti, "per impostazione predefinita" andrò con l'incapsulamento convenzionale. Lo stato (chi ha quali carte, chi è il mazziere, qual è il piatto) viene nascosto e viene esposta la funzionalità (deal cards, bet, raise, etc.).
Alcuni oggetti sono solo dati. Pensa a un contatto nella tua app di posta elettronica. Qui, lo scopo dell'oggetto è solo raggruppare il nome, l'indirizzo e-mail, il numero di telefono, ecc. In modo che l'utente possa modificarli. Avere quei dati pubblicamente mutabili è responsabilità dell'oggetto, quindi rendi pubbliche le cose. Le lingue con proprietà lo rendono più semplice, ma ci dovrebbero essere poche funzionalità in questi tipi di classi (di nuovo, "per impostazione predefinita").