программистское
Dec. 14th, 2006 01:04 pmЧитал недавно интервью с Струструпом про C++. В какой-то момент его там спрашивают: ну а вы не жалеете обо всем этом, не был ли дизайн C++ ошибкой? Он отвечает: нет, не жалею, не был итд. А я себе представил другой ответ: да; я давно хотел это сказать: простите меня. Меня мучила совесть все эти годы, и теперь я прошу всех программистов на C++: простите меня, я хотел как лучше. И стреляется. Было бы эффектнее!
Я не понимаю, что такое mixins. Не на уровне ключевых слов, а реальное понимание, что это такое и чем отличается ну там от интерфейсов и других ООП-механизмов. Википедия не помогает, там невнятно. Если кто-то может мне объяснить, буду признателен.
no subject
Date: 2006-12-14 11:14 am (UTC)mixin Ordreded {
abstract int compareTo (Object o);
boolean equal (Object o) { return compareTo (o) == 0; }
}
no subject
Date: 2006-12-14 11:16 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2006-12-14 11:17 am (UTC)2. В интерфейсе кода нет. А в микс-ине есть. Ну вот например представьте, что вы хотите добавить классу (и не одному!) метод ToString() (а раньше его не было). На каком-нибудь шарпе (до третьего) получается изрядный геморрой: пишется класс ToStringHelper, в котором реализуется всё, плюс интерфейс IToString, а затем от каждого класса делается наследование и пишутся одни и те же перенаправления из методов интерфейса в методы ToStringHelper. А то и вдобавок создание инкапсулированного объекта ToStringHelper со своим конструктором.
Если посмотреть внимательно, то это то же самое множественное наследование, только реализованное ручками.
no subject
Date: 2006-12-14 12:27 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2006-12-14 11:18 am (UTC)no subject
Date: 2006-12-14 11:50 am (UTC)Давайте попробуем методически.
В C++ есть abstract base class. У него есть методы без кода, но могут быть и методы с кодом тоже. От него невозможно создать объект. Ему можно наследовать. Самостоятельной ценности он не имеет.
В Java есть abstract class. У него есть методы без кода, но могут быть и методы с кодом тоже. От него невозможно создать объект. От него можно наследовать, но не множественно. Самостоятельной ценности он не имеет.
В Java есть также интерфейс. У него есть только методы без кода. От него невозможно создать объект. От него можно наследовать, в том числе и множественно. Самостоятельной ценности он не имеет.
Если я правильно вас понял, вы говорите следующее: миксин является полным аналогом abstract base class в C++, и не является полным аналогом abstract class в Java, поскольку миксины можно смешивать в множественном наследовании, а абстрактные классы в Джаве нельзя. Таким образом (я продолжаю свою попытку пересказать ваше мнение), понятия миксина опирается на мнение, что попытка Джавы "укротить" множественное наследование C++ путем ограничения его только на интерфейсы была слишком жесткой, и следует ее "откатить", вернувшись к неограниченному множественному наследованию C++, но на практике применяя его только к абстрактным классам, и называть их миксинами.
Я правильно понял?
(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2006-12-14 11:26 am (UTC)вобщем существенно более интересный язык получается когда объекты рассматриваются как _набор_ методов и data members.
как только происходит такой сдвиг в точке зрения -- тут-же появляются операции сложения интерфейсов, вычитания, пересечения. и появляется очень интересная идеология наследования. из public распространенных языков приблизительно такие возможности дает php.
насчет C++ -- я тоже надеюсь, чтоони когданить признаются что это была ошибка :)
no subject
Date: 2006-12-14 11:42 am (UTC)Давайте более дотошно. Объект - набор методов и data members, отлично, я могу таким образом на объект посмотреть и в C++, и в Java (которые не заявляют, что поддерживают миксины). Что такое "сложение интерфейсов" - то же, что в C++ наследование от двух классов, а в Java реализация двух интерфейсов? А что такое вычитание или пересечение, на практике? И какая интересная идеология появляется?
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2006-12-14 11:26 am (UTC)no subject
Date: 2006-12-14 11:48 am (UTC)По воводу C#: его корни как раз ведут в его университет.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2006-12-14 12:00 pm (UTC)Пусть жираф был неправ, но виновен не жираф
Date: 2006-12-14 12:22 pm (UTC)no subject
Date: 2006-12-14 12:35 pm (UTC):-)
no subject
Date: 2006-12-16 03:40 pm (UTC)(no subject)
From:no subject
Date: 2006-12-14 12:36 pm (UTC)Отдельное название используют, поскольку хотят подчеркнуть специфическую роль примеси как средства, реализующего некое побочное свойство класса, которое может иметь, а может и не иметь отношения к его основной функциональности. Например, по этой же причине используют термин Template Method, хотя это просто виртуальная функция.
no subject
Date: 2006-12-14 05:32 pm (UTC)template method - это не "просто виртуальная функция". Это полиморфная [виртуальная] функция. Также как template class - это параметризованный класс, а не просто класс.
(no subject)
From:Руки вымойте
From:Re: Руки вымойте
From:no subject
Date: 2006-12-14 12:41 pm (UTC)в большинстве современных языков построение конкретных типов происходит через наследование, поэтому миксины выглядят как "абстрактные" классы или интерфейсы.
в языке с полным программатическим доступом к системе типов миксин может выглядеть, скажем, как функция, берущая класс A и возвращающая класс B, где B является A + добавочная функциональность. подобная система, кстати, элегантно обходит проблемы со множественным наследованием — оно просто не нужно.
Self-modifying code rules!
Date: 2006-12-14 01:11 pm (UTC)угу
From:(no subject)
From:Re: Reply to your comment...
From:(no subject)
From:(no subject)
From:насчет застрелиться
Date: 2006-12-14 01:05 pm (UTC)no subject
Date: 2006-12-14 01:43 pm (UTC)no subject
Date: 2006-12-14 04:04 pm (UTC)(no subject)
From:no subject
Date: 2006-12-14 01:51 pm (UTC)Там довольно внятно написано зачем, по крайней мере с т.з. Руби.
Mix-ins in C++
Date: 2006-12-14 02:17 pm (UTC)struct RefCountable { virtual void inc_ref () = 0; virtual void dec_ref () = 0; }; struct Object: virtual RefCountable { virtual void f () = 0; };Now we want to implemen Object but would like to use some existing implementation of the RefCountable interface:
struct AtomicOpRefCountable: virtual RefCountable { // ... implementation goes here }; struct MyObj: Object, AtomicOpRefCountable { virtual void f () { // ... } };Here we are mix'ing-in implementation of RefCountable provided by AtomicOpRefCountable.
hth
Mixins
Date: 2006-12-14 02:29 pm (UTC)Наверное, если начинать с языка, где используют интерфейсы без имплементации и нет множественного наследования, mixins действительно выглядят чем-то необычным, а программист на на C++ их просто не замечает ;-)
Re: Mixins
Date: 2006-12-14 05:33 pm (UTC)Re: Mixins
From:Re: Mixins
From:no subject
Date: 2006-12-14 02:50 pm (UTC)no subject
Date: 2006-12-14 03:12 pm (UTC)http://www.rubycentral.com/book/tut_modules.html
Well, your classes can support all these neat-o features, thanks to the magic of mixins and module Enumerable. All you have to do is write an iterator called each, which returns the elements of your collection in turn. Mix in Enumerable, and suddenly your class supports things such as map, include?, and find_all?. If the objects in your collection implement meaningful ordering semantics using the <=> method, you'll also get min, max, and sort.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2006-12-14 03:34 pm (UTC)no subject
Date: 2006-12-14 04:07 pm (UTC)1) Может ли mixin, как класс, содержать данные (не статические)?
2) Не совсем понятен смысл вашего "виртуального mixin'а". Класс, в котором есть только pure protected virtual functions требует от меня их реализовать. Но при этом я не получаю полиморфизм, т.е. я не могу объект своего класса подставить в какое-то место, которое хочет получить объект класса mixin'a. Тогда что же я собственно получил? Что изменилось от того, что я "подмешал" такой mixin, по сравнению с тем, что я бы просто в своем классе написал ту же реализацию тех же функций с теми же именами, не упоминая нигде mixin?
(no subject)
From:(no subject)
From:no subject
Date: 2006-12-14 03:54 pm (UTC)прочитала парочку статей и дискуссию в ньюс группах
насколько я понимаю mixin это в точности то, что Александреску называет policy
no subject
Date: 2006-12-14 05:20 pm (UTC)2. Читал про mixin'ы в сети, и тут в комментариях. Не смог себя убедить, что это сколько-нибудь полезно, посему в обьяснения влезать не буду.
no subject
Date: 2006-12-14 05:21 pm (UTC)no subject
Date: 2006-12-15 02:11 am (UTC)Русский перевод можно скачать, например, здесь.
Он уделяет довольно много внимания частному случаю использования mixin'ов - в качестве шаблонных параметров класса, от которых класс наследуется. Он называет это стратегиями (policies).
no subject
Date: 2006-12-15 04:18 pm (UTC)Оффтопик: Авва, Вы знаете какой-нибудь легкий в обращении счетчик посетителей каждого топика в ЖЖ?
no subject
Date: 2006-12-16 03:49 pm (UTC)no subject
Date: 2006-12-15 05:11 pm (UTC)А помнит ли еще кто-нибудь этот (http://linuxforum.ru/lofiversion/index.php/t11818.html) древний текст ?