LINUX.ORG.RU

Перловая каша


0

1

Доброй ночи!

Говорят, что перл еще жив, и если смотреть на CPAN, то активность там имеется. Тем не менее, насколько я смог увидеть, то современные практики типа ООП в перле из коробки выглядят как стройплощадка, на которой и фундамент толком не выкопан. То есть все языки вокруг в комплекте поставки содержат джентльменский набор для реализации хотя бы самых распространенных и проверенных временем паттернов, типа тех же фабрик, абстрактных классов и аксессоров, за которыми в перле надо скачивать пол-CPAN'а.

При этом все скачанное будет совмещаться друг с другом только при большом везении, так как делается разными людьми, под разный набор conventions, с разными программистскими религиями.

А я убедился в одном: хочешь получить код на перле, который понимать и сопровождать легко — не используй перлизмов, не используй аббревиатур, понятных только тебе, не используй сверхкоротких имен методов и данных пэкэджей, просто потому, что тебе набирать лень, не используй всего того, что так любят использовать авторы книг про перл и многие авторы на CPAN'е. Короче, пиши так, как писал бы на Java, только вот Java кучу таких требований прибивает гвоздями, а в перле требуется сила воли.

Тем не менее, я все еще верю, что где-то есть ресурс, который еще не порос мхом от старости и неухоженности, как Perl Patterns Wiki, и который бы описывал в терминах более-менее современных версий Perl и более-менее живых модулей на CPAN, как в этом вашем перле можно реализовать хотя бы большинство из фаулеровских паттернов проектирования, не говоря уж о сравнительных характеристиках их существующих реализаций.

Подскажите, пожалуйста, чего почитать по этому вопросу плюс какой-нить выпрямитель рук для того, чтобы писать на перле так, чтобы поняли другие люди.

Да, я знаю, что перл на самом деле мертв. Но вот сейчас у меня парочка проектов именно на.

★★★★★

>Подскажите, пожалуйста, чего почитать по этому вопросу плюс какой-нить выпрямитель рук для того, чтобы писать на перле так, чтобы поняли другие люди.

Не нужно, перл - write-only. :)

nanonymous
()

>современные практики типа ООП

Спасибо, посмешил:)

Led ★★★☆☆
()

>на которой и фундамент толком не выкопан

К.О. желает вам сообщить в целях просвещения, что откапывают таки котлован, а фундамент уже возводят.

//Строитель-недоучка

fat_angel ★★★★★
()

А зачем вам понадобился ООП? И не вижу ничего плохого в том ООП, который сейчас есть из коробки. У самого даже того же moose нету.

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

Как — зачем? Ну ты еще спроси, зачем функции нужны, если можно простынишкой одной и копипастой писать скрипты... Как этот, как его, configure.

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

зачем копипастить?! goto наше фсио

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

Затем, что удобно. Затем, что потом удобно повторно использовать. Затем, что полиморфизм.

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

За счет чего достигается удобство, за счет чего достигается удобство повторного использования, что вам даст полиморфизм?

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

Удобство достигается за счет инкапсуляции.
Удобство повторного использования достигается за счет наследования.
Полиморфизм дает возможность не плодить лишние сущности.

Вообще, ООП самое то для крупных проектов.

shimon ★★★★★
() автор топика

Я так и знал, что по существу ответить никто не умеет. Слабаки хреновы. Обмазались тут несвежим говном и думают, что писать скриптики по стандартам 1989 года — это типа наше все.

Программисты на Java и Python смотрят на перловиков, как на говно, и, я полагаю, правильно делают.

shimon ★★★★★
() автор топика
Ответ на: комментарий от zfsed

Удобства реализации многих вещей, которые в мире ООП воспринимаются как данность. Типа тех же аксессоров — чтобы сделать их не напрягаясь с матом вокруг tie, надо тащить примочку из CPAN, чтобы сделать прозрачно наследуемые данные, надо тащить Class::Data::Inheritable, чтобы эксепшоны не через жопу реализовывать, надо опять-таки из CPAN что-то дотаскивать.

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

Вообще, ООП самое то для крупных проектов.

Почему? В чем это выражается?

Удобство достигается за счет инкапсуляции.

Как инкапсуляция помогает достичь удобства?

Удобство повторного использования достигается за счет наследования.

Наследование и повторное использование кода ортогональные вещи. Если я не прав, объясните в чем.

Полиморфизм дает возможность не плодить лишние сущности.

Как это, объясните. По мне что circle.area() и sq.area(), что circle.c_area() и sq.area(). Количество сущностей как бы не изменилось.

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

У тебя есть треугольники, круги, квадраты, многоугольники всякие разные. Есть методы для эффективного вычисления площади каждого. У тебя есть функция, которая должна на вход принять любую фигуру, внутри себя ей надобится вычислить площадь этой фигуры. Чо предлагаешь без ООП? Туеву хучу if-elsif-elsif-elsif?

shimon ★★★★★
() автор топика
Ответ на: комментарий от zfsed

Вот еще для размышлений: если использовать tie и overload одновременно, можно огрести, опять-таки, жопу. В питоне такого не бывает, там как бы сама парадигма работы операторов и типов данных реализована попроще.

shimon ★★★★★
() автор топика
Ответ на: комментарий от zfsed

Вы действительно не знаете или просто троллите?

mashina ★★★★★
()
Ответ на: комментарий от shimon

У тебя есть треугольники, круги, квадраты, многоугольники всякие разные. Есть методы для эффективного вычисления площади каждого. У тебя есть функция, которая должна на вход принять любую фигуру, внутри себя ей надобится вычислить площадь этой фигуры. Чо предлагаешь без ООП? Туеву хучу if-elsif-elsif-elsif?

Подходящая задачка для паттерн-матчинга. Кстати, не ООП. Только тут надо решить, что дешевле: добавлять новые фигуры (a.k.a. данные), или добавлять новые функции для их обработки?

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

C ООП оно как-то вообще дешевле по всем статьям получается. Каждый класс реализует некий интерфейс, одинаковый для всех фигур, и ниипет. А так тебе надо каждый раз и фигуру добавить, и функцию доштуковать новым паттерном.

shimon ★★★★★
() автор топика
Ответ на: комментарий от dave

А, и еще веселуха начинается, когда ты отдаешь в широкий мир эту функцию, заставляя каждого пользователя лезть внутрь ее, если он добавляет новые типы данных. Что приводит еще к пущей веселухе, когда встречаются два пользователя с разным набором фигур и начинают пытаться смержить тело функции, чтобы все их фигуры работали в одной программе...

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

Я хотел сказать, что если фигуры добавляются редко, а функции по их обработке часто и их нужно много, то ООП не подходит. Как раз подходит паттерн-матчинг с алгебраическими типами данных. ООП неуниверсально. Впрочем, ни структурное программирование, ни функциональное не являются универсальными тоже.

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

ООП неуниверсально, но если ты хочешь четко разграничить границы «своего» и «чужого» кода, не убавляя гибкости, то ООП заменить особо нечем.

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

Есть мнение, что для очень-очень больших систем ООП не подходит. А наследование даже для не очень больших проектов затрудняет повторное использование кода, превращая код в кучу трудно поддерживаемого хлама. Так что, за что боролись, на то и напоролись.

А разграничение на свое и чужое - вещь безусловно хорошая (инкапсуляция?). Но оно не является чертой одного ООП. Да взять тоже лексическое замыкание при создании функций.

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

Ну дай конкретный пример большого проекта, где ООП не подходит. И да, почему туда ООП не подходит?

Нарушение инкапсуляции — это когда мне надо для обработки нового типа данных заниматься патченьем. Или конфигурации. Короче говоря, все, из-за чего апгрейд третьесторонней функции на минорную версию ломается. Пример выше: три автора, три версии одной функции, грабли на попытке объединиться. А используй они ООП, такого бы не было.

Нет, конечно, можно пойди путем джедая-идиота и создать таблицу функций per datatype с блэеджеком и шлюхами, да только это будет та самая таблица виртуальных медотов, что и в ООП, которое в языке из коробки. Это автоматически засчитывает слив за попытку вымахиваться на ровном месте.

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

За реализацию геометрии(в графических библиотеках и программах особенно) с помощью ООП, особенно с помощью виртуальных методов, надо вырывать руки и долго дубасить ими автора по голове.

А вообще, твоя проблема, в том, что ты думаешь, что ООП это только ООП в стиле Java/Python
А это наидерьмовейшие и наинеудобнейшие ОО-системы. Во-первых потому, что сами по себе эти ОО-системы убогие и кривые, а во-вторых потому, что они пытаются заставить разработчика абсолютно все задачи решать с применением ОО-подхода, что, мягко говоря, не совсем правильно.

Посмотри на CLOS.

anonymous
()

имхо
все зависит от проекта
если проект невелик - никаких проблем не вижу
за основу беру структурное программирование, в нем выполняется ядро проекта, к нему модульно цепляются подпрограммы пофайлово
Допустим ни к чему изобретать велосипед при работе с HTTP когда есть LWP
или незачем брать и писать свой класс для работы с базами данных когда есть DBI.
А создание собственных классов на любом языке имеет свои особенности и зависит больше от программиста, а не от языка.

Perl для меня тем и привлекателен, что не обязывает к ООП
были проекты, работающие под серьезной сетевой нагрузкой, все что требовалось для ускорения работы с ними - это компиляция в байт-код.

Единственное что не стал бы делать на перл - это работа с тредами,
в таком случае выберу java

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

Работать исключительно в рамках ООП заставляют только ЯП с ООП головного мозга, типа явы и плюсов. Если брать современные аналоги перла, то все они мультипарадигмальные с неплохой поддержкой ООП (в отличие от перла, где все парадигмы реализуются через задницу), от чего они только выигрывают даже на небольших проектах.

Для больших проектов структурный подход удобен на верхнем уровне с использованием объектного подхода в компонентах.

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

Я думал, что тему инкапсуляции мы уже прошли. Никто не говорит, что ООП всегда плохо. Иногда хорошо, но не всегда. И здесь мне нравятся гибридные языки типа F#, Scala и Common Lisp. Даже C# скоро станет гибридным :)

Примеры больших систем? Да тот же линукс как система в целом вместе с ядром, общесистемными либами и морем прикладных приложений. Как видишь, эта штука не строится целиком на ООП, и это правильно. Теперь представь, что это было бы полностью написано на Corba или COM. О, тихий ужас!

dave ★★★★★
()
Ответ на: комментарий от x97Rang

> Единственное что не стал бы делать на перл - это работа с тредами, в таком случае выберу java

Злые языки поговаривают, что ява сосёт в тредах, надо использовать эрланг (собираюсь проверить эту догму, кстати).

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

Ошибаешься, родной. В ядре линукса ООП _есть_, хотя бы и в части инкапсуляции и полиморфизма. struct dev_t с прописанными указателями на методы инициализации, ухода в спящий режим, пробуждение и т. п. видал? Доморощеная таблица виртуальных методов как есть.

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

кстати, речь была не о ядре, а о системе в целом.

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

>Corba или COM

Стул и стол, ага.

Чем плох COM? В линуксах вот нет - и от этого линуксу только хуже.

Сравни удобство использования OpenGL и Direct3D, например. Первый - «тру сишный стиль», куча хуй знает что делающих функций. Direct3D - на COM, приятная объектная модель, модульность, все такое.

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

Почему плох? Когда-то давно я для COM написал на C++ один компонент, и мне это тогда жутко нравилось (только нафиг не надо было так делать). Но сложные системы на основе COM создавать сложно. Вот и все.

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

Поговаривают, что в 1C написали свою собственную реализацию COM. Чего только не бывает на свете!

dave ★★★★★
()

Именно об этом я говорю уже 100500 лет. Мощь перла направлена против программиста - ему приходится полагаться только на самодисциплину. То же относится к плюсам, кстати.

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

Только по С++ куча книг об этой самодисциплине есть. А вот по объектно-ориентированному проектированию с примерами на перле — ничего нет. perlpatterns есть, но дохленький, и иногда не учитывает, что описанные техники уже есть реализованные в нескольких ипостасях на CPAN.

Но опять: CPAN содержит код очень разной актуальности, бажности и свежести, а культуры, в которой велосипедизм и блэкджекство являются не то что дурным, а таки недопустимым тоном, нет.

Вот и берешь модуль неплохой вроде, но так до конца и не знаешь, взлетит оно на продакшене или в землю зароется и взорвется там.

shimon ★★★★★
() автор топика
Ответ на: комментарий от dave

С колокольни C++ он как раз довольно угребищен.
Впрочем, это потому что C++ угребищен.

А вот из .NET его использовать, да или даже из VB - одно удовольствие.

Там единственно что проблема - слишком примитивная модель управления памятью - тупой счетчик ссылок, безо всяких плюшек для GC, в отличие от того же GObject.

По поводу больших и не больших систем - ООП, по крайней мере, для этого на порядок лучше подходит, чем функциональщина. Ну и естественно, лучше, чем тупое структурное программирование.
Примеры использования - повсюду. Ядро линукса, ядро винды, графический интерфейс винды(SendMessage и т.п. - это же натурально по Алану Кэю), COM, Эппловские интерфейсы(там objc сплошной).
И это не спроста. Читай главу 3 из SICP, хехе.

Ну тут я под ООП, разумеется, понимаю гораздо более общее понятие, чем то говно, что навязывают жаба, бидон или кресты.

Еще про крупные системы - там еще лучше, чем ООП, конечно, подходит метапрограммирование - DSL'и разные и так далее; но я так понимаю, ты не его же подразумеваешь, говоря, что для построения крупных систем есть лучшие парадигмы?

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

COM это про интерфейсы, че там своего писать?
Таблички методов с stdcall соглашением вызова(интерфейсы), которые друг друга перекрывают(наследование интерфейсов) - вот и весь COM.

Ну и разные утилитарные функции для регистрации и загрузки компонентов - но это больше про OLE, а не про сам COM(в DirectX, например, эти функции не используются).

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

ООП скрывает состояние за фасадом красивых методов. В этом его сила и слабость. Состояние является причиной трудноуловимых ошибок. Побочные эффекты как-никак. Плюс наследование может сильно усложнить жизнь. Тут можно было бы порассуждать о спасительной идее чистого функционального программирования, но что-то я не уверен в ее осуществимости. На самом деле, мне видится самым перспективным гибридный подход, когда функциональщина, ООП и процедурщина применяются вместе, в зависимости от задачи. Очевидно, что ни одно из них само по себе не является серебряной пулей.

А Си++ полезен для COM тем, что можно прочувствовать технологию. С самых низов. Кстати, скомпилированный IDL на Си выглядит еще печальнее.

Вспомнилась одна уже неновая книжка про COM. Так там один из евангелистов Микрософт утверждал, что Java лучше всего подходит для COM. И это было правдой для того времени. Тогда .NET еще не было. Так что, ничего удивительно, что из .NET использовать COM может быть приятно.

У COM, точнее DCOM, вышел серьезный затык с распределенностью. Подсчет ссылок проявился во всей своей неказистости. Как решение, в .NET используется совершенно другой механизм при распределенной работе: идея о спонсоре. Инфу можно найти по теме Application Domains.

Что касается метапрограммирования, то оно вызывает у меня неоднозначные чувства. С одной стороны удивительная красота и мощь при определении своих языковых конструкций, а с другой - монады. Одно мешает другому. Синтаксический сахар для монад подразумевает трансформацию кода, а этому препятствуют макросы. Можно посмотреть на cl-cont, но там, как я понял, codewalker работает по уже трансформированному макросами коду. Теряется много полезной информации. Если для продолжений это не так важно (они все равно слишком общие), то для конкретных монад может быть утеряна очень важная часть информации, да по тем же циклам DO или LOOP, которая позволила бы сильно оптимизировать код (как это возможно в F#).

И нет, я не имел в виду метапрограммирование :)

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