Non farlo; sarà molto complicato e tu non ne avresti bisogno
... è la risposta che avrei scritto qui 2 anni fa. Ora, però, non ne sono così sicuro; in effetti, negli ultimi mesi ho iniziato a migrare il vecchio codice in questo formato, non perché non avessi nulla di meglio da fare, ma perché ne avevo davvero bisogno per implementare nuove funzionalità o modificare quelle esistenti. Capisco le avversioni automatiche che gli altri hanno visto in quel codice, ma penso che questo sia qualcosa che merita un pensiero serio.
vantaggi
Il vantaggio principale è la possibilità di modificare ed estendere il codice. Se usi
class Point {
int x,y;
// other point operations
}
invece di passare solo un paio di interi in giro - che è qualcosa che, purtroppo, fanno molte interfacce - allora diventa molto più facile aggiungere in seguito un'altra dimensione. Oppure modifica il tipo in double
. Se utilizzi List<Author> authors
o List<Person> authors
anziché List<String> authors
, in seguito sarà molto più semplice aggiungere ulteriori informazioni a ciò che rappresenta un autore. Scrivendolo in questo modo mi sento come se stessi affermando l'ovvio, ma in pratica sono stato colpevole di usare le stringhe in questo modo molte volte me stesso, specialmente nei casi in cui all'inizio non era ovvio, avrei avuto bisogno di più di una stringa.
Attualmente sto cercando di ridefinire qualche lista di stringhe che è intrecciata nel mio codice perché ho bisogno di più informazioni lì, e sento il dolore: \
Oltre a ciò, sono d'accordo con l'autore del blog che contiene più informazioni semantiche , rendendo più facile la comprensione da parte del lettore. Mentre ai parametri vengono spesso dati nomi significativi e una linea di documentazione dedicata, spesso non è il caso dei campi o della gente del posto.
Il vantaggio finale è tipo sicurezza , per ovvi motivi, ma ai miei occhi qui è una cosa secondaria.
Inconvenienti
Ci vuole più tempo per scrivere . Scrivere una piccola classe è facile e veloce ma non senza sforzo, specialmente se hai bisogno di molte di queste classi. Se ti ritrovi a fermarti ogni 3 minuti per scrivere qualche nuova classe di wrapper, può essere un vero danno per la tua concentrazione. Mi piacerebbe pensare, tuttavia, che questo stato di sforzo di solito si verifichi solo nella prima fase della scrittura di qualsiasi parte di codice; Di solito riesco a capire velocemente quali entità dovranno essere coinvolte.
Può coinvolgere molti setter (o costruzioni) ridondanti e getter . L'autore del blog fornisce l'esempio veramente brutto di new Point(x(10), y(10))
invece di new Point(10, 10)
, e vorrei aggiungere che un utilizzo potrebbe anche comportare cose come Math.max(p.x.get(), p.y.get())
invece di Math.max(p.x, p.y)
. E il codice lungo è spesso considerato più difficile da leggere, e giustamente. Ma in tutta onestà, ho la sensazione che un lotto di codice si muova attorno agli oggetti, e solo i metodi di selezione lo creano, e ancora meno bisogno di accedere ai suoi dettagli grintosi (che comunque non è OOPy).
Discutibile
Direi se questo aiuta o meno la leggibilità del codice è discutibile. Sì, più informazioni semantiche, ma codice più lungo. Sì, è più facile capire il ruolo di ogni locale, ma è più difficile capire cosa puoi fare con esso a meno che tu non vada a leggere la sua documentazione.
Come per la maggior parte delle altre scuole di pensiero di programmazione, penso che non sia salutare portare questo estremo all'estremo. Non mi vedo mai separare le coordinate xey per essere ognuna di un tipo diverso. Non penso che Count
sia necessario quando un int
dovrebbe essere sufficiente. Non mi piace l'utilizzo di unsigned int
in C - mentre teoricamente buono, non ti dà abbastanza informazioni, e proibisce di estendere il tuo codice in seguito per supportare quel magico -1. A volte hai bisogno di semplicità.
Penso che il post sul blog sia un po 'estremo. Ma nel complesso, ho appreso dall'esperienza dolorosa che l'idea alla base è fatta dalle cose giuste.
Ho una profonda avversione al codice troppo ingegnerizzato. Lo so davvero. Ma usato correttamente, non penso che sia un eccesso di ingegneria.