-
Penso che il suo primo esempio sia un po 'forzato. Se ti sei davvero appassionato a questo sottaceto, probabilmente non hai pensato abbastanza sul problema in primo luogo.
-
I metodi "largerThan" e "addTo" hanno senso perché piuttosto che portare due valori & imponendo un po 'di semantica al di fuori della classe sui valori separati, sta definendo le operazioni sul valore / valuta coppia attraverso le operazioni di classe. E questa è una buona cosa, perché il significato di "largerThan" o "addTo" è incapsulato nella classe. Che è (probabilmente) meglio che lasciare la definizione (e il possibile uso improprio) al client.
-
Ma un approccio alternativo potrebbe essere quello di esprimere tutti i valori monetari in alcune valute canoniche, fare tutte le operazioni in quella valuta comune e poi convertirle nella valuta desiderata all'ultimo minuto.
-
La parte in cui dispensa con il getter in favore di una scrittura su metodo è ... qualcosa. Si potrebbe sostenere che introduce una dipendenza dall'interfaccia di Writer piuttosto che consentire al client di ottenere il valore e farlo con quello che vuole.
L'ho già fatto prima, ma non come pratica generale.
Ad esempio, se dovessi serializzare Money in JSON, introdurrai un metodo "toJSON" che accetta un oggetto "serializzatore"? Ora quella classe ha un'altra dipendenza e amp; una semantica più da gestire. C'è il potenziale per far esplodere l'interfaccia con tutti i diversi punti di integrazione.
... per esempio. per forzare, come si salva un denaro in un database come parte di una transazione?
Quindi sta facendo un punto interessante, e penso che il suo esempio di mettere le operazioni logiche nella classe sia un buon esempio. Ma l'idea di rinunciare completamente ai getter è un interessante refactoring, ma non uno che vedo comunemente.
...
Penso che l'idea principale qui sia che ha un esempio in cui le operazioni sono distribuite su 4 classi: Money, Currency, CurrencyConverter e qualsiasi altro client lo stia mettendo insieme.
Ma in realtà, la classe Currency ha un utilizzo più serrato se elimini CurrencyConverter e muovi la sua logica all'interno di Currency in modo che il tipo di valuta e le operazioni su quel tipo siano raggruppate insieme & nascosto dal mondo esterno.
Quindi tira le operazioni sul valore / valuta coppia e raggruppa quelli all'interno della classe Money, e li nasconde dal mondo esterno.
Quindi IMHO mi sembra più un esempio di miglioramento dell'incapsulamento povero o debole più che una condanna dei getter: qui i getter sono più come accessori per il crimine piuttosto che per le menti. ;)