Quindi ho finalmente iniziato a leggere Progettare il software orientato agli oggetti e il mio ago è bloccato in un piccolo ma punto importante. Capisco che l'esempio che sto per presentare potrebbe sembrare un po 'fuori contesto, perché è stato sviluppato nel libro negli ultimi capitoli, ma credo che l'idea generale sia davvero semplice e farò del mio meglio per fornire contesto ovunque io possa. Riguardo a me, sono uno sviluppatore junior che insegna a me stesso, quindi spero che mettere questa domanda qui porterà a qualche discussione fruttuosa.
Bene, finalmente abbiamo eliminato i preliminari.
Il sistema sto parlando di un bancomat (ATM), che dobbiamo modellare in termini di software orientato agli oggetti. La discussione riguarda le classi di input che raccoglieranno input numerici dall'utente. Vengono identificati due possibili casi: la raccolta di numeri di account, importi, ecc. E la raccolta del PIN, che deve essere reso in modo diverso (il PIN viene visualizzato come un campo password).
Quindi gli autori hanno definito due classi diverse: Form e SecureForm, quest'ultima derivante dal precedente.
Ora ecco una sezione del libro (discutendo dell'utilità di SecureForm) che mi crea problemi:
The intended distinction between Form and SecureForm is whether user input is echoed literally or symbolically (perhaps with an X). This can be done by invoking two different messages: getValue() and getSecureValue(), but the sender [the class making the request] would have to test to determine which message to send. This could lead to maintenance difficulties. It is better to use polymorphism; that is, to have one message that invokes different methods depending on the class of object to which it is sent. For this reason we keep SecureForm [that is, don't discard it from our design].
La parte in corsivo non ha senso per me. Cosa dovrebbe provare l'oggetto chiamante? Forse per il tipo di input richiesto, ma poi a me non sembra fare la differenza se usi il polimorfismo o meno. Considera i seguenti due esempi ipotetici:
//inside doTransaction function of WithdrawalTransaction
//example 1
form = new Form();
pin = form->getSecureValue();
//example 2
form = new SecureForm();
pin = form->getValue();
Difficilmente mi sembra diverso, e non un "incubo di manutenzione" da nessuna misura.
Mi sento come se ci fosse qualche sottigliezza che mi manca qui, ma mi sfugge. Sarò molto grato se qualcuno mi può aiutare a decifrare l'intento dell'autore, e ancora meglio se alcuni esempi possono essere forniti.
Spero che non manchi alcuna informazione critica dal mio post. Se c'è, per favore fai notare e aggiungerò ulteriori dettagli.