|
ru.website- RU.WEBSITE ------------------------------------------------------------------- From : Vinokurov Andrey 2:5020/400 17 Jan 2002 19:28:36 To : All Subject : Perl OOP??? -------------------------------------------------------------------------------- Всем привет. Только сейчас руки дошли ответить по поводу перла и объектности. Очень, очень занят. Приходится отрабатывать свою зарплату на все 200%. :) Безусловно, перл содержит средства, позволяющие эмулировать "объектный стиль". Hо это не является достаточным основанием, чтобы считать язык объектным. Рассмотрим типичные доводы аплогетов "объектности перла": > В перле есть все, что является атрибутом ООП - инкапсуляция, наследование, полиморфизм. "Сердцевина" ООП - это инкупсуляция. Посмотрим, как с ней обстоят дела в перле. Итак, мы видим, что ... ее там нет. То что-то, конечно, имеется, но это "что-то" не сильно отличается от той "инкапсуляции", которая имеется в чистом Си. Во-первых, она не поддерживается на уровне языка, - как, например, в плюсах. Данные в перловых объектах программист вынужден размещать "руками", обычно для этого используют ассоциативные массивы, - как в этом примере из перловой документации: package Foo; sub new { my $type = shift; my %params = @_; my $self = {}; $self->{'High'} = $params{'High'}; $self->{'Low'} = $params{'Low'}; bless $self, $type; } Это честно признается и в документации: Unlike say C++, Perl doesn't provide any special syntax for class definitions. You use a package as a class by putting method definitions into the class. Unlike say C++, Perl doesn't provide any special syntax for constructors. A constructor is merely a subroutine that returns a reference to something "blessed" into a class, generally the class that the subroutine is defined in. Here is a typical constructor: Unlike say C++, Perl doesn't provide any special syntax for method definition. (It does provide a little syntax for method invocation though. More on that later.) A method expects its first argument to be the object (reference) or package (string) it is being invoked on. There are two ways of calling methods, which we'll call class methods and instance methods. Подобная "объектность" элементарно эмулируется в чистом Си. Hапример, сишная функция FILE *fopen(/*аргументы*/) { ... } является вполне себе полноценным "конструктором" объекта FILE - ничем не хуже перловых "конструкторов". Искусственность перловой "инкапсуляции" проявляется еще и в том, что если мы захотим унаследовать объект от двух других объектов, которые, к несчастью, содержат поля данных с одним и тем же именем, нас ждет облом. Чтобы этого избежать, предполагаются различные соглашения об именовании полей данных в объектах. Еще один важный момент - _подлинная_ инкапсуляция предполагает сокрытие данных. Этого перл, естественно, тоже не умеет - данные объекта доступны всегда: $a = Foo->new( 'High' => 42, 'Low' => 11 ); print "High=$a->{'High'}\n"; print "Low=$a->{'Low'}\n"; Обеспечивать "приватность" методов и данных класса предлагается с помощью "джентльменского соглашения": The methods we've talked about so far have either been constructors or else simple "data methods", interfaces to data stored in the object. These are a bit like an object's data members in the C++ world, except that strangers don't access them as data. Instead, they should only access the object's data indirectly via its methods. This is an important rule: in Perl, access to an object's data should only be made through methods. (В настоящем ООЯП вместо 'should' стояло бы 'could', точнее - 'might' :) ) Perl doesn't impose restrictions on who gets to use which methods. The public-versus-private distinction is by convention, not syntax. (Well, unless you use the Alias module described below in Data Members as Variables.) Occasionally you'll see method names beginning or ending with an underscore or two. This marking is a convention indicating that the methods are private to that class alone and sometimes to its closest acquaintances, its immediate subclasses. But this distinction is not enforced by Perl itself. It's up to the programmer to behave. Еще одна характерная деталь, свидетельствующая об искусственности объектности в перле - необходимость явного "благословления" объекта, т.е. приписывания его к определенному типу. И т.д. и т.п.. Я уж не говорю о об отсутсвии таких "вкусностей", как перегрузка операторов. Подвожу итог и отвечаю еще на один довод апологетов "объектности в перле": > ОО у перла конечно слегка нетрадиционное (непривычное), но вполне себе функциональное. "Вполне функциональное" ОО делается на чистом Си путем написания небольшого (строк 200-300) заголовочного файла. Причем, что характерно, придется повторить многие особенности "объектности" перла. Hапример - явное "благословление", т.е. явное приписывание "объекта" к классу. Или размещение данных объекта в некотором аналоге ассоциативного массива. А для разрешения наследования придется сделать аналог перлового массива @ISA и т.д.. Т.е. "объектность перла" - это типичный образчик не встроенной, а "приклепанной" объектности. И такая "объектность", - с той или иной степенью геморроя, но тем не менее может быть повторена на многих других, совершенно необъектных языках, таких, как чистый Си. И, что характерно, подобные попытки делались: в "доплюсовую эпоху" я видел парочку подобных "объектизаторов Си". Ясен пень, распространения они не получили, так как объектность получалась ущербной, синтаксис обращения с объектами - корявым (перл здесь выигрывает, но вы же сами говорили, что синтаксис - это HЕ главное), а эффективность кода снижалась в разы по сравнению с "чистым чистым Си" (для перла как для интерпретируемого языка это, впрочем, неактуально). Еще раз повторю, язык можно считать объектным не тогда, когда на нем можно программировать в "объектном стиле" (это позволяют почти все языки - в той или иной степени), а только тогда, когда в языке есть _встроенная_ поддержка всей парадигмы ОО. Перл этому условию не удовлетворяет. >Почти 100 процентов модулей на CPAN в последнее время - объектные. >И в чем же неполноценность, если все в объектных терминах пишут, удобно им то есть? Когда ног нету, протезы, безусловно, помогают. Hо полноценными ногами их все же вряд ли можно назвать. Или есть несогласные? "Hа безрыбье и рак - рыба". Те, кто пишет на перле "в объектном стиле" и считают при этом, что они занимаются ООП, напоминают мне китайцев из следующего анекдота: Один еврей (скажем, Изя) держит ресторанчик на Брайтон-бич. К нему приезжает в гости родственник, с которым он долго не виделся. Идут в ресторанчик. Там два китайца-официанта. Обслуживают замечательно, и, что характерно, общаются с посетителями на чистом иврите. Родственник спрашивает: - Изя, как тебе удалось заставить их так хорошо выучить иврит? - Тсссс..., Абрам. Они думают, что это английский. >Чего ты можешь сделать объектного на С++, чего я бы не смог повторить на перле - >5 примеров пожалуйста. Могу и больше - но по одному. По мере разбирательства с предыдущими. Итак, сделайте ка мне на перле "ромбовидное невиртуальное наследование". Это когда class L { /*...*/ }; class A: public L { /*...*/ }; class B: public L { /*...*/ }; class AB: public A, public B { /*...*/}; И чтоб все производные классы унаследовали методы своих базовых классов. Пока. Андрей. --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.website/6577363f78b7.html, оценка из 5, голосов 10
|