Non farlo; complicherà le cose e tu non ne avrai 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 ho niente di meglio da fare, ma perché ne avevo davvero bisogno per implementare nuove funzionalità o modificare quelle esistenti. Capisco le avversioni automatiche che altri qui vedono quel codice, ma penso che questo sia qualcosa che merita una riflessione seria.
Benefici
Il principale vantaggio è 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 numeri interi - cosa che, sfortunatamente, molte interfacce fanno - allora diventa molto più facile aggiungere successivamente un'altra dimensione. Oppure modifica il tipo in double
. Se lo usi List<Author> authors
o List<Person> authors
invece List<String> authors
in un secondo momento diventa molto più semplice aggiungere ulteriori informazioni a ciò che rappresenta un autore. Scrivere in questo modo mi sembra di affermare 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, quindi avrei bisogno di più di una stringa.
Attualmente sto cercando di refactificare un elenco di stringhe che è intrecciato in tutto il mio codice perché ho bisogno di ulteriori informazioni lì e sento il dolore: \
Oltre a ciò, concordo con l'autore del blog sul fatto che contiene più informazioni semantiche , facilitando la comprensione da parte del lettore. Mentre ai parametri vengono spesso dati nomi significativi e si ottiene una linea dedicata di documentazione, questo non è spesso il caso di campi o locali.
Il vantaggio finale è la sicurezza del tipo , per ovvi motivi, ma ai miei occhi è una cosa minore qui.
svantaggi
Ci vuole più tempo per scrivere . Scrivere una piccola classe è semplice e veloce ma non facile, soprattutto se hai bisogno di molte di queste classi. Se ti ritrovi a fermarti ogni 3 minuti per scrivere una nuova classe di wrapper, può anche essere un vero danno per la tua concentrazione. Mi piacerebbe pensare, tuttavia, che questo stato di sforzo di solito avverrà solo nella prima fase della scrittura di qualsiasi pezzo di codice; Di solito riesco a farmi un'idea abbastanza veloce di quali entità dovranno essere coinvolte.
Può coinvolgere molti setter (o costruzioni) e getter ridondanti . L'autore del blog fornisce l'esempio davvero 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 sacco di codice muova gli oggetti, e solo alcuni metodi lo creano, e ancora meno hanno bisogno di accedere ai suoi dettagli grintosi (che comunque non è OOPy).
Discutibile
Direi che questo è discutibile o meno con la leggibilità del codice. Sì, più informazioni semantiche, ma codice più lungo. Sì, è più facile capire il ruolo di ciascun locale, ma è più difficile capire cosa si può fare con esso a meno che non si vada a leggere la sua documentazione.
Come con la maggior parte delle altre scuole di pensiero di programmazione, penso che non sia salutare portare questo estremo. Non mi vedo mai separare le coordinate xey per essere di un tipo diverso. Non penso Count
sia necessario quando int
dovrebbe bastare. Non mi piace l' unsigned int
uso in C - sebbene teoricamente buono, semplicemente 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 imparato dall'esperienza dolorosa che l'idea di base è fatta dalle cose giuste.
Ho una profonda avversione per il codice troppo ingegnerizzato. Lo faccio davvero. Ma usato bene, non credo che questa ingegneria eccessiva.