Non confondere i problemi di interfaccia utente con i problemi di interfaccia di programmazione .
Il fatto che l'utente inserisca le note per nome è un problema di interfaccia utente e non riguarda assolutamente la tua funzione GenerateNote()
, che è parte di un'interfaccia di programmazione.
Di fatto, l'interfaccia utente potrebbe, in teoria, consentire all'utente di selezionare tra diverse notazioni, (A, B, C ...) o (Do, Re, Mi ...) così chiaramente, il compito di mappare le stringhe inserite dall'utente in oggetti note reali dovrebbe essere gestito dall'interfaccia utente e queste stringhe non dovrebbero mai essere propagate ad altre parti della tua applicazione. Il fatto che un oggetto Note
possa contenere il proprio nome non è nemmeno necessariamente pertinente alla mappatura, poiché l'utente può inserire "Do" e l'interfaccia utente dovrà mapparla su un oggetto Note
con il nome " UN". Allo stesso modo, quando l'interfaccia utente visualizza gli oggetti Note
all'utente, è necessario eseguire la trasformazione inversa e, di nuovo, potrebbe essere necessario mostrare "Do" mentre l'oggetto porta il nome "A". Quindi, i due sono completamente indipendenti.
Un noteIndex
di tipo int
è cattivo come una stringa, perché stai utilizzando un tipo di dati generici là dove potrebbe essere usato un tipo di dati più specifico (una classe Note
effettiva). Il tipo di dati generici non ha senso in sé e per sé, e il suo significato è in effetti qualunque sia il significato assegnato ad esso in fase di esecuzione (anziché in fase di compilazione) dal codice che lo gestisce, quindi la sua esistenza costituisce un completamente inutile e pericoloso (vedere soggetto a errore) indirection . La migliore pratica nell'ingegneria del software consiste nell'utilizzare un tipo speciale per ogni diverso concetto con cui la logica si occupa. Ecco cos'è "Strong Typing".
Quindi, sicuramente vai con un oggetto Note
.
Perché non usare solo una frequenza double
e farla finita con? Bene, ancora una volta, la risposta è "Strong Typing". Prendiamo un esempio da un'altra applicazione: supponiamo che tu stia scrivendo un software che si occupa di automobili, quindi hai a che fare con cose come "velocità" e "consumo di carburante". La cosa corretta da fare è avere un tipo di dati "Velocità", che contenga un doppio e un tipo di dati "FuelConsumption", che contenga un altro doppio, in modo da non passare mai il doppio, perché a un certo punto un doppio che era destinato per "Speed", erroneamente, si passerebbe per errore a una funzione che prevedeva un doppio che avrebbe dovuto significare "FuelConsumption", e allora accadranno tutti i tipi di cose divertenti. Buona fortuna con il debug di un sistema costruito in questo modo! Con una strong digitazione, il compilatore si assicura che non si possa fare la cosa sbagliata.