Il downcasting è impopolare, forse un odore di codice
Non sono d'accordo. Il downcasting è estremamente popolare ; un numero enorme di programmi del mondo reale contiene uno o più downcast. E non è forse un odore di codice. È sicuramente un odore di codice. Ecco perché è necessario che l'operazione di downcast sia manifestata nel testo del programma . È così che puoi notare più facilmente l'odore e dedicare attenzione alla revisione del codice su di esso.
in quali circostanze è appropriato scrivere un codice che esegue il downcast?
In ogni circostanza in cui:
- hai una conoscenza corretta al 100% di un fatto sul tipo di runtime di un'espressione che è più specifico del tipo di tempo di compilazione dell'espressione e
- è necessario sfruttare questo fatto per utilizzare una capacità dell'oggetto non disponibile nel tipo di tempo di compilazione e
- è un uso migliore del tempo e dello sforzo per scrivere il cast piuttosto che riformattare il programma per eliminare uno dei primi due punti.
Se è possibile effettuare il refactoring a buon mercato di un programma in modo che il compilatore possa dedurre il tipo di runtime o rifattorizzare il programma in modo tale che non sia necessaria la capacità del tipo più derivato, farlo. I downcasts sono stati aggiunti alla lingua per quelle circostanze in cui è difficile e costoso riformattare così il programma.
perché il downcasting è supportato dalla lingua?
C # è stato inventato da programmatori pragmatici che hanno lavori da svolgere, per programmatori pragmatici che hanno lavori da svolgere. I designer C # non sono puristi di OO. E il sistema di tipo C # non è perfetto; in base alla progettazione, sottostima le restrizioni che possono essere poste sul tipo di runtime di una variabile.
Inoltre, il downcasting è molto sicuro in C #. Abbiamo una forte garanzia che il downcast verrà verificato in fase di esecuzione e se non può essere verificato, il programma fa la cosa giusta e si blocca. Questo è meraviglioso; significa che se la tua corretta comprensione al 100% della semantica di tipo risulta corretta al 99,99%, il tuo programma funziona il 99,99% del tempo e si arresta in modo anomalo per il resto del tempo, invece di comportarsi in modo imprevedibile e corrompere i dati dell'utente 0,01% del tempo .
ESERCIZIO: esiste almeno un modo per produrre un downcast in C # senza usare un operatore cast esplicito. Riesci a pensare a tali scenari? Dal momento che questi sono anche potenziali odori di codice, quali sono i fattori di progettazione che ritieni siano andati nella progettazione di una funzionalità che potrebbe causare un arresto anomalo del downcast senza un cast manifest nel codice?