Тип утки как синтаксический сахар для размышлений: хорошая или плохая идея?
-
10-07-2019 - |
Вопрос
В последнее время я размышлял, будет ли хорошей формой синтаксического сахара в таких языках, как Java и C #, включать " утку " тип как тип параметра метода? Это будет выглядеть следующим образом:
void myFunction(duck foo) {
foo.doStuff();
}
Это может быть синтаксический сахар для вызова doStuff () через отражение, или он может быть реализован по-другому. Фу может быть любого типа. Если foo не имеет метода doStuff (), это вызовет исключение времени выполнения. Дело в том, что вы будете иметь преимущества более жесткой предварительно определенной парадигмы интерфейса (производительность, проверка ошибок), когда вы захотите их, то есть большую часть времени. В то же время у вас будет простой, аккуратно выглядящий бэкдор для утки, который позволит вам аккуратно вносить изменения, не предусмотренные в первоначальном дизайне, без масштабного рефакторинга. Более того, он, вероятно, будет на 100% обратно совместим и будет полностью соответствовать существующим языковым конструкциям. Я думаю, что это могло бы помочь сократить сверхпрочный стиль программирования «просто в случае», который приводит к запутанным, загроможденным API. Верите ли вы, что подобное будет хорошо или плохо в статических ОО-языках, таких как C # и Java?
Решение
Ключевое слово dynamic
поддерживает эту точную семантику и будет в C # 4.0.
Это не только для размышления. Это реализация динамической отправки , которая использует отражение только в том случае, если другой механизм недоступен. р>
Этот вопрос также есть много полезной информации.
Другие советы
На самом деле это очень похоже на "динамический". тип, который будет частью C # 4.
Мой краткий ответ: «Да, Duck Typing - это полезный инструмент на языках OO. Команда C # соглашается и помещает это в C # 4.0 "
Длинный ответ:
У Duck Typing есть свои плюсы и минусы ... Есть много людей, которые полностью ругаются на это, но я скажу вам следующее: Есть несколько очень веских причин для использования Duck Typing для вещей, которые нельзя решается хорошо в любом другом случае. Р>
Смотрите мой пост об интерфейсе, в котором вместо словаря IDictionary используется словарь, в котором Duck Typing спас бы день:
В C # есть НЕКОТОРЫЕ наборы утки, встроенные начиная с 1.0! Возьмите ключевое слово foreach, например. Это распространенное заблуждение, что ваш тип должен быть IEnumerable, чтобы использовать объект в цикле foreach. Оказывается, на самом деле это не так. Вам нужно только реализовать GetEnumerator (), и реализация интерфейса не нужна (хотя это хорошая форма). Это Duck Typing.