Downcasting is unpopular, maybe a code smell
Non sono d'accordo. Downcasting è estremamente popolare ; un numero enorme di programmi reali contiene uno o più downcast. E non è forse un odore di codice. È sicuramente un odore di codice. Ecco perché è necessario che l'operazione di downcasting si manifesti nel testo del programma . È così che puoi più facilmente notare l'odore e spendere l'attenzione per la revisione del codice su di esso.
in what circumstance[s] is it appropriate to write code which downcasts?
In ogni circostanza in cui:
- hai una conoscenza corretta al 100% di un fatto sul tipo di esecuzione di un'espressione che è più specifico del tipo di espressione di compilazione dell'espressione, e
- devi approfittare di questo fatto per utilizzare una capacità dell'oggetto non disponibile sul tipo di compilazione, e
- è meglio usare il tempo e gli sforzi per scrivere il cast piuttosto che rifattorizzare il programma per eliminare uno dei primi due punti.
Se è possibile effettuare un refacting di un programma a basso costo in modo che il tipo di esecuzione possa essere dedotto dal compilatore o effettuare il refactoring del programma in modo tale che non sia necessario il tipo più derivato, eseguire tale operazione. I downlink sono stati aggiunti alla lingua per quelle circostanze in cui è difficile e costoso per il refactoring del programma.
why is downcasting supported by the language?
C # è stato inventato da programmatori pragmatici che hanno un lavoro da fare, per programmatori pragmatici che hanno un lavoro da fare. I designer C # non sono puristi OO. E il sistema di tipo C # non è perfetto; in base alla progettazione sottostima le restrizioni che possono essere inserite nel tipo di runtime di una variabile.
Inoltre, il downcasting è molto sicuro in C #. Abbiamo una strong 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 comprensione al 100% della semantica dei tipi risulta corretta al 99,99%, allora il tuo programma funziona il 99,99% delle volte e si blocca per il resto del tempo, invece di comportarsi in modo imprevedibile e corrompendo i dati degli utenti 0,01% delle volte .
ESERCIZIO: esiste almeno un modo per produrre un downcast in C # senza utilizzando un operatore di cast esplicito. Riesci a pensare a questi scenari? Dal momento che questi sono anche potenziali odori di codice, quali fattori di progettazione pensi siano andati nella progettazione di una funzionalità che potrebbe causare un arresto anomalo del downcast senza avere un cast manifest nel codice?