Тип утки как синтаксический сахар для размышлений: хорошая или плохая идея? - PullRequest
2 голосов
/ 22 ноября 2008

В последнее время я размышлял, будет ли хорошей формой синтаксического сахара в таких языках, как Java и C #, включать тип «утка» в качестве типа параметра метода? Это будет выглядеть следующим образом:

void myFunction(duck foo) {
   foo.doStuff();
}

Это может быть синтаксический сахар для вызова doStuff () через отражение, или он может быть реализован по-другому. Фу может быть любого типа. Если foo не имеет метода doStuff (), это вызовет исключение времени выполнения. Дело в том, что вы будете иметь преимущества более жесткой предварительно определенной парадигмы интерфейса (производительность, проверка ошибок), когда вы захотите их, то есть большую часть времени. В то же время у вас будет простой, аккуратно выглядящий бэкдор для утки, который позволит вам аккуратно вносить изменения, не предусмотренные в первоначальном дизайне, без масштабного рефакторинга. Более того, он, вероятно, будет на 100% обратно совместим и будет полностью соответствовать существующим языковым конструкциям. Я думаю, что это могло бы помочь сократить сверхпрочный стиль программирования «просто в случае», который приводит к запутанным, загроможденным API. Вы верите, что что-то подобное было бы хорошо или плохо в статических ОО-языках, таких как C # и Java?

Ответы [ 3 ]

6 голосов
/ 22 ноября 2008

Ключевое слово dynamic поддерживает эту точную семантику и будет в C # 4.0.

Это не только для размышления. Это реализация динамической отправки , которая использует отражение только в том случае, если другой механизм недоступен.

Этот вопрос также содержит много полезной информации.

1 голос
/ 22 ноября 2008

Мой короткий ответ: «Да, Duck Typing - это то, что было бы полезным инструментом в языках OO. Команда C # соглашается и помещает его в C # 4.0»

Длинный ответ:

Утиная печать имеет свои плюсы и минусы ... Есть много людей, которые полностью ее ругают, но я скажу вам следующее: Есть несколько очень веских причин для использования утиной печати для вещей, которые не решается хорошо в любом другом случае.

Смотрите мой пост об интерфейсе, который использует словарь вместо IDictionary, где Duck Typing спас бы день:

http://www.houseofbilz.com/archive/2008/09/22/why-you-really-need-to-think-about-your-interfaces.aspx

C # имеет НЕКОТОРЫЕ наборы утки, встроенные начиная с 1.0! Возьмите ключевое слово foreach, например. Это распространенное заблуждение, что ваш тип должен быть IEnumerable, чтобы использовать объект в цикле foreach. Оказывается, на самом деле это не так. Вам нужно только реализовать GetEnumerator (), и реализация интерфейса не нужна (хотя это хорошая форма). Это утка набрав.

1 голос
/ 22 ноября 2008

На самом деле, это очень похоже на «динамический» тип, который будет частью C # 4.

...