Sono ancora un novizio relativo con OOP, quindi sto ancora cercando di capire alcune delle migliori pratiche su come progettare oggetti "buoni". So che questa domanda è probabilmente piuttosto soggettiva, motivo per cui sono qui piuttosto che su StackOverflow.
Sto progettando un oggetto che avrà 20 proprietà di stringa separate, nessuna delle quali è richiesta. Questi vincoli sono fissi e non possono essere modificati in quanto è un'implementazione di un'origine dati esterna di cui non ho alcun controllo.
Il problema di progettazione in cui mi imbatto è come costruire in modo efficace un'istanza dell'oggetto e essere in grado di confrontare l'uguaglianza confrontando ciascun campo senza violare le best practice normali.
-
Un costruttore di 20 argomenti sembra molto sbagliato, soprattutto perché ogni campo è una stringa, e ci sono casi in cui molti di essi saranno nulli. Potrei usare gli argomenti opzionali in C # 4 per ridurre il numero di argomenti che sono effettivamente chiamati, ma dato che tutto è una stringa, dovrei usare parametri nominati quando chiamo il costruttore, e sembra che sarebbe ancora più brutto.
-
Ho pensato di provare a raggruppare le proprietà in classi più piccole, ma il raggruppamento più logico ha ancora un oggetto con 10 proprietà e almeno la metà delle proprietà rimanenti non ha raggruppamenti logici.
-
Potrei assegnare a ciascuna proprietà un setter pubblico, ma ciò renderebbe l'oggetto mutabile e quindi complicherebbe gli argomenti per l'override di
GetHashCode()
. E davvero non ho bisogno che l'oggetto sia mutabile. Una volta che è stato creato, non dovrebbe mai esserci un motivo per cambiarlo, ma non voglio fare affidamento su questo perché chissà che cosa cercheranno di fare con qualcuno. -
L'implementazione di
IEquatable<T>
è una possibilità per il test di uguaglianza, ma la mia comprensione è che si raccomanda di sovrascrivereEquals(object obj)
eGetHashCode()
quando si implementaIEquatable
così tutti i metodiEquals
hanno lo stesso comportamento .
Si tratta di un caso limite in cui è necessario eseguire l'override di Equals
senza sovrascrivere GetHashCode
? Non intendo utilizzare questo oggetto come chiave in un dizionario o come membro di HashSet
, ma non posso prevedere ciò che qualcun altro tenterebbe di fare in futuro.
O dovrei abbandonare l'idea di fare un confronto di uguaglianza su tutte le proprietà con Equals e implementare il mio metodo Compare()
?
O esiste un metodo migliore per costruire l'oggetto che gli consentirebbe di essere immutabile senza dover passare tutti gli argomenti tramite un costruttore o un metodo?
EDIT: In risposta al commento di Sign, lo scopo dell'oggetto è in ultima analisi essere in grado di confrontare i dati dall'origine dati esterna con i nostri dati interni per garantire che sia accurato. Entrambi i set di dati contengono informazioni sull'indirizzo, ma sono suddivisi in modo diverso.
I dati interni, sono generalmente memorizzati come indirizzo tipico (Via, Città, Stato, Codice postale, Contea, Paese), ma ci sono variazioni quando si dispone di una suite / appartamento # o di un piano in un edificio.
I dati esterni vengono ulteriormente suddivisi in pezzi più piccoli.
Quindi questo oggetto dovrebbe essere un collegamento comune tra le 2 origini dati e consentire all'utente di confrontare campi uguali per l'uguaglianza.
EDIT # 2: Alla fine, ho scelto la risposta di Doc Brown perché una versione modificata della sua idea del dizionario (con Enums come Keys invece di stringhe) era il modo più semplice per andare senza avere un costruttore disordinato e comunque fornire l'immutabilità che speravo di avere. A lungo termine, ho intenzione di sperimentare alcuni dei suggerimenti di Oliver in quanto alcune delle sue modifiche hanno avuto molto da offrire.