Даунсинг - це непопулярний, можливо, кодовий запах
Я не погоджуюсь. Downcasting надзвичайно популярний ; величезна кількість реальних програм містять один або декілька знижень. І це не можливо кодовий запах. Це, безумовно, кодовий запах. Ось чому операція пониження моменту вимагає виявлення в тексті програми . Це так, що ви можете легше помітити запах і витратити на нього перегляд коду.
за яких обставин [и] доцільно писати код, який знищує?
За будь-яких обставин, коли:
- у вас є 100% правильне знання факту про тип вираження, який є більш конкретним, ніж тип виразу часу компіляції, і
- вам потрібно скористатися цим фактом, щоб використати можливості об'єкта, недоступного для типу компіляції, і
- краще написати час та зусилля для написання ролі, ніж рефактор програми, щоб усунути будь-який із перших двох пунктів.
Якщо ви можете дешево переробити програму, щоб компілятор міг визначити або тип виконання, або переробити програму, щоб вам не потрібні можливості більш похідного типу, тоді зробіть це. Зниження мови було додано до мови для тих обставин, коли важко і дорого таким чином переробити програму.
чому підтримка мовлення підтримується мовою?
C # був винайдений прагматичними програмістами, які мають працювати, для прагматичних програмістів, які мають працювати. Дизайнери C # не є пуристами OO. І система типу C # не є досконалою; за допомогою проекту він недооцінює обмеження, які можуть бути розміщені на типі виконання змінної.
Крім того, посилання вниз # є дуже безпечним у C #. Ми маємо тверду гарантію, що вихідний режим буде перевірений під час виконання, і якщо його не вдасться перевірити, програма зробить правильно і вийде з ладу. Це чудово; це означає, що якщо ваше 100% правильне розуміння семантики типів виявляється правильним на 99,99%, то ваша програма працює 99,99% часу і решту часу припиняє роботу, замість того, щоб вести себе непередбачувано і пошкоджувати дані користувачів 0,01% часу .
Вправа: Існує щонайменше один спосіб створити пониження в C # без використання явного оператора лиття. Чи можете ви придумати будь-який подібний сценарій? Оскільки це також потенційні запахи коду, які дизайнерські фактори, на вашу думку, увійшли в розробку функції, яка могла б призвести до аварійного поломки, не маючи явного відтворення в коді?