LINUX.ORG.RU

«Утиная типизация» (Duck-typing) — зло или благо?

 duck-typing


3

8

Вылез из криокамеры и обнаружил оную. Вижу также много критики в ее сторону (стандартная: «Дракон может *специально* крякать как утка, чтобы попасть к вам в пруд».) Так всё же: это благо или зло (если рассматривать не только в контексте языков с динамической типизацией)?

★★

Последнее исправление: GreenBag (всего исправлений: 1)

Ответ на: комментарий от note173

Думаю, что под капотом создается инстанс интерфейса(т.е. таблица указателей на функции-реализации интерфейса) для типа.

anonymous
()
Ответ на: комментарий от anonymous

И это тоже не утиная типизация.

Дело в том, что возможность получить доступ к произвольному полю/методу без учета иерархии классов это еще не все. Самая мякотка в том, чтобы перед таким обращением проверить: а есть ли такое поле/метод в переданном классе, т.е. является ли класс «уткой» или нет. В C++ можно использовать шаблоны и компилятор сделает такую проверку за вас, но такая проверка в этом случае является не основным свойством, т.к. шабнон генерирует для каждого типа отдельную функцию, каждая из которых выполняет одни и те же операции.

При утиной типизации действия с объектом определяются в зависимости от возможностей (наличиствующего интерфеса) переданного объекта. Вот если бы в C++ на этапе компиляции проверять наличие у шаблонного типа некоего интерфейса и генерировать разный код для разных интерфейсов - вот это была бы утиная типизация. ЕМНИП такая методика имеется, но требует более многоэтажных шаблонов.

no-such-file ★★★★★
()
Ответ на: комментарий от tailgunner

Это не вывод типов, a структурные типы. Не совсем утиная типизация, но по употреблению похоже.

anonymous
()
Ответ на: комментарий от true_admin

Суть в том что объект считается подходящим не потому что имеет нужный тип, а потому что реализует нужный интерфейс. Я прав?

Верно. Т.е. суть такова

1. проверяем, есть ли у объекта набор методов X

2. если есть то это объект, класса X - используем его

3. если нет, то... делаем что-то другое.

Важно именно то, что программа не валится (компиляция не вылетает с ошибкой в статическом варианте) если объект не подходит, а происходит другое полезное действие.

Иначе можно сказать, что

class F {};

class A: public F {
public:
int x;
};

class B: public F {
public:
int x;
};

F *f=new B();

cout << f->x;
тоже утиная типизация, ведь A и B реализуют один интерфейс.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Иначе можно сказать, что

я не знаю, на каком языке написан приведенный пример.

по синтаксису больше всего похоже на c++, но тогда код некорректен и не скомпилируется.

anonymous
()
Ответ на: комментарий от no-such-file

Странно, я думал, что питон чуть ли не эталон утиной типизации. Для проверки именно «интерфейса» в С++ «есть»(в смысле будут) концепты. Но тут по сути будет тоже самое - компилятор скажет, что у вашего класса нет нужного метода.

anonymous
()
Ответ на: комментарий от proud_anon

Вон еще на скале пример. Тоже структурные типы, строго говоря, а не динамическая утиная типизация, чтобы всякие выпускники ПТУ не придирались (но блин, крякает же):

http://codemonkeyism.com/scala-goodness-structural-typing/

Но тем не менее.

anonymous
()
Ответ на: комментарий от anonymous

компилятор скажет, что у вашего класса нет нужного метода

Нужно чтобы было так: есть интерфейс - использем его, нет интерфейса - не используем (делаем что-то другое, возможно пробуем использовать другой интерфейс). Никакой ошибки компиляции быть не должно.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Это тоже можно уже сейчас, благодаря SFINAE. Наиболее удобно через boost::enable_if. Если введут концепты, по ним можно будет выбирать альтернативу.

anonymous
()
Ответ на: комментарий от anonymous

Я и говорю - можно. Но в этом треде таких примеров не было. Сами по себе шаблоны - не утиная типизация «в статике» как тут втирают.

no-such-file ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.