Diciamo, ad esempio, che hai un'applicazione con una classe ampiamente condivisa chiamata User
. Questa classe espone tutte le informazioni sull'utente, il loro ID, nome, livelli di accesso a ciascun modulo, fuso orario ecc.
Ovviamente i dati dell'utente sono ampiamente citati nel sistema, ma per qualsiasi motivo, il sistema è impostato in modo tale che invece di passare questo oggetto utente in classi che dipendono da esso, stiamo semplicemente passando in proprietà individuali da esso.
Una classe che richiede l'id utente richiederà semplicemente il GUID userId
come parametro, a volte potrebbe essere necessario anche il nome utente, in modo che venga passato come parametro separato. In alcuni casi, questo viene passato a singoli metodi, quindi i valori non sono mantenuti a livello di classe.
Ogni volta che ho bisogno di accedere a una diversa informazione dalla classe User, devo apportare modifiche aggiungendo parametri e dove aggiungere un nuovo overload non è appropriato, devo cambiare ogni riferimento al metodo o al costruttore della classe pure.
L'utente è solo un esempio. Questo è ampiamente praticato nel nostro codice.
Ho ragione nel ritenere che si tratti di una violazione del principio Aperto / Chiuso? Non è solo l'atto di modificare le classi esistenti, ma di impostarle in primo luogo in modo tale che molto probabilmente saranno necessari cambiamenti diffusi in futuro?
Se abbiamo appena passato l'oggetto User
, potrei apportare una piccola modifica alla classe con cui lavoro. Se devo aggiungere un parametro, potrei dover fare dozzine di modifiche ai riferimenti alla classe.
Vi sono altri principi infranti da questa pratica? Forse inversione di dipendenza? Sebbene non facciamo riferimento a un'astrazione, esiste un solo tipo di utente, quindi non è necessario avere un'interfaccia utente.
Vi sono altri principi non SOLID che vengono violati, come i principi di programmazione difensiva di base?
Il mio costruttore dovrebbe apparire così:
MyConstructor(GUID userid, String username)
O questo:
MyConstructor(User theUser)
Modifica post:
È stato suggerito di rispondere alla domanda in "ID pass o oggetto?". Questo non risponde alla domanda su come la decisione di andare in entrambi i modi influisce sul tentativo di seguire i principi SOLIDI, che è al centro di questa domanda.