Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Perl OOP???   Vinokurov Andrey   17 Jan 2002 19:28:36 
 Re: Perl OOP???   Serge Shikov   17 Jan 2002 21:03:08 
 Perl OOP???   Alex Kharitonov   20 Jan 2002 00:18:06 
 Re: Perl OOP???   Serge Shikov   20 Jan 2002 15:38:58 
 Re: Perl OOP???   Vinokurov Andrey   23 Jan 2002 16:58:18 
 Perl OOP???   Moderator   25 Jan 2002 01:35:06 
 Re: Perl OOP???   Vinokurov Andrey   23 Jan 2002 17:53:48 
 Re: Perl OOP???   Serge Shikov   25 Jan 2002 12:10:07 
 Re: Perl OOP???   Vinokurov Andrey   01 Feb 2002 19:07:25 
 Re: Perl OOP???   Serge Shikov   01 Feb 2002 22:18:32 
 Perl OOP???   Alexander Kostiuchenko   05 Feb 2002 08:54:10 
 Re: Perl OOP???   Vinokurov Andrey   23 Jan 2002 16:58:18 
 Perl OOP???   Alex Kharitonov   23 Jan 2002 20:29:59 
 Re: Perl OOP???   Vinokurov Andrey   24 Jan 2002 18:40:32 
 Perl OOP???   Alex Kharitonov   26 Jan 2002 00:41:19 
 Perl OOP???   Alexander Kostiuchenko   20 Jan 2002 04:08:56 
 Re: Perl OOP???   Vinokurov Andrey   24 Jan 2002 19:03:09 
Архивное /ru.website/6577363f78b7.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional