Тип утки как синтаксический сахар для размышлений: хорошая или плохая идея?

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
764
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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

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

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

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

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

См. Мой пост об интерфейсе, который использовал словарь вместо 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 (), и реализация интерфейса не является обязательной (хотя это хорошая форма). Это утиная машинка.

Мне не нравится идея именования элементов типа "утка", но хотелось бы, чтобы существовал способ интерфейсов типа "утка" и их комбинаций [например, «этому методу нужно что-то, что есть IEnumerable<Thing> и ILookup<Thing, OtherThing>], и он позволяет интерфейсам объявлять, что другие конкретные типы должны считаться реализациями [с интерфейсом, который либо напрямую содержит код для реализации, либо указывает статический класс, который его содержит]. подход обеспечил бы «защиту от опечаток», сохранив при этом многие полезные аспекты динамической типизации.

supercat 17.01.2015 01:34

@supercat ты имеешь в виду вроде этого? github.com/skyguy94/dynamic-wrapper

Brian Genisio 18.01.2015 05:38

Да, что-то в этом роде; одна вещь, которую я не заметил, - это наличие foo.As<T>.As<U> == foo.As<U>, которое было бы важной функцией для того типа интерфейса, который я хотел бы видеть.

supercat 19.01.2015 02:44

Другие вопросы по теме