Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > Ваш стиль программирования на Perl |
Автор: sir_nuf_nuf 27.8.2008, 10:26 |
Привет всем! Какой стиль программирования на perl вам ближе: 1) со множеством перловых фишек и изворотов 2) строгий ООП стиль, а-ля java 3) что другое ? Задаю этот вопрос, т.к. самому перл понравился за скороговорку, за возможность быстро делать сложные вещи. Но по мере работы над проектом замечаю, что такой код плохо поддерживается (особенно, если писал его другой человек), потихоньку код приходит к виду a-la java, со множеством мелких классов, get/set, паттерны и все такое.. может я просто не постиг ДАО перла и на самом деле надо все писать процедурными скриптами ? П.С. извиняюсь, если флейм.. |
Автор: ginnie 27.8.2008, 11:06 |
Уважаемый sir_nuf_nuf, стиль написания часто зависит от постановки задачи: если быстродействие кода не является определяющим фактором при разработке, то лучше писать понятный другим разработчикам код, т.е. без особых "изворотов" (использование уникальных для Perl конструкций только там, где они действительно уместны). Если же приоритетом является производительность кода, то тут бывает такое... ![]() |
Автор: ginnie 27.8.2008, 11:36 | ||
Уважаемый nitr, а вот такой код Вам понятен?
|
Автор: gcc 27.8.2008, 11:50 | ||
Уважаемый ginnie, а что именно под быстродействием имееться ввиду, использовать всегда хэш и не использовать процедуры в которыйх функции будут внутри другой функции? компьтеры дешевеют, можно поставить 8Gb RAM ![]() JAVA весь на ООП, но он требовательный к ресурсам... |
Автор: nitr 27.8.2008, 12:01 | ||
ginnie, мне да. Но кто так писать будет? ![]() И так
|
Автор: ginnie 27.8.2008, 12:01 | ||||||
Уважаемый gcc,
думаю, для Вас не будет открытием, что в Perl один и тот-же результат можно получить несколькими способами. Время выполнения для разных способов отличается и если важна проиводительность кода, то приходится выбирать варианты, читаемость и понятность которых оставляет желать лучшего. Например, задача преобразования IP-адреса из формата xxx.xxx.xxx.xxx в int (для сохранения в БД). Самый быстрый вариант
У нас памяти в сервере больше 8 Гб, все равно не хватает ![]() |
Автор: nitr 27.8.2008, 12:03 | ||
лично такое "изворотом" не называю... Добавлено через 2 минуты и 15 секунд
![]() Можно всё же это совмещать... Согласен не во всех случаях, но можно в "таких местах" оставлять комменты... Добавлено через 3 минуты За кодером не убудет... |
Автор: Bulat 27.8.2008, 12:20 |
Побольше багов и косяков ![]() ИМХО, если что-то небольшое и не очень функциональное(без огромного количества всяких фич), то проще писать по процедурному. Но если что-то многофункциональное, то лучше прибегать к ООП. Но мулька-то в этом, хошь так, хошь так. ![]() |
Автор: ginnie 27.8.2008, 13:33 | ||
Уважаемый nitr, специально для Вас шедевр нетривиального мышления:
|
Автор: korob2001 27.8.2008, 16:08 |
Я лично по возможности использую только ООП. Правда далеко не все мудули на CPAN объектно ориентированы. |
Автор: nitr 27.8.2008, 17:21 |
ginnie, спасибо ![]() |
Автор: ginnie 27.8.2008, 17:41 |
nitr, я минут 15 разбирался ![]() |
Автор: AlexPet 27.8.2008, 18:19 |
Люблю perl-style. Наверное, поэтому его (perl) и использую. ООП примерно везде одинаково, и навевает скуку :( Возможно, оффтоп, но в последнее время столкнулся с тем, что для высокопроизводительных математических вычислений перл все же слабоват. Даже XS модули не спасают. Приходится все же использовать либо Maple\MatLab для мат.экспериментов, либо C (по слухам, Python тоже в математике преуспел, но так до него руки и не дошли) для продакшн. Жаль :( ginnie, возможно я не понял Ваш пример с next_power_of_two, но там всегда будет выводиться 1 в случае подачи на вход n >= 1. |
Автор: ginnie 27.8.2008, 18:30 | ||
Уважаемый AlexPet, интересно, как это C-код работает нормально, а XS-модули не спасают?
советую провести полевые испытания функции ![]() |
Автор: AlexPet 27.8.2008, 19:08 | ||
ginnie, а вот так. Например, столкнулся на днях с тем, что Math::Prine::XS в некоторых случаях вылетает с ошибкой "Ошибка сегментации", а некоторых работает медленнее самописных функций. Просто тут меня затянуло в http://projecteuler.net (не сочтите за рекламу, я не имею никакого отношения к этому ресурсу), а там нужно считать оочень много и ооочень быстро. Давайте по порядку, может я чего не понимаю?
Разбираем по строкам. 1) Создаем ключи в хеше от 1 до поданного в функцию значения (пусть это будет n), значения которых - undef 2) локализуем переменную $_ и заносим в нее значение хеша в скалярном контексте. Это будет "k/b", где k - количество ключей, b - точно не скажу, но вроде как количество отведенной памяти под хеш... 3) проверяем регулярным выражением {/(.*)} на совпадение (а оно будет, если n>=1, иначе выдаст ошибку (на нечисловых значениях еще при заполнении хеша); при n < 1 совпадения не будет ) После чего return (по крайне мере у меня) трактует m{/(.*)} в скалярном контексте (а не списочном, поэтому ему по барабану группирующие скобки в регулярном выражении), и возвращает 1 в случае совпадения (n>=1), 0 иначе Поправьте, если что не так. Испытания провел, вроде все так. Добавлено через 12 минут и 29 секунд Кстати, на злобу дня: http://habrahabr.ru/blogs/perl/38014/ |
Автор: ginnie 27.8.2008, 19:29 |
Уважаемый AlexPet, Вы правы, я не обратил внимание на контекст для регулярного выражения. Он зависит от контекста вызова функции next_power_of_two(). Указанный выше вариант верно работает в списочном контексте (например print next_power_of_two(7);) Про чужие XS-модули понятно, я имел ввиду свои XS-модули на основе корректно работающего C-кода. |
Автор: AlexPet 27.8.2008, 19:58 | ||
Вот покопался в perldata и вот что вычитал:
Однако перл обычно выделяет число сегментов памяти под хэш как "min k, 2^k > n" (где n - количество элементов в хеше; установлено экспериментальным путем ![]() Только в том-то и дело, что "обычно". Например: n next_power_of_two 1..7 8 8 16 9 16 ... 1023 1024 1024 1024 Так что я бы относился с осторожностью к значению, выдаваемому этой функцией ![]() |
Автор: nitr 27.8.2008, 21:47 | ||||||
AlexPet, ginnie,
Вот размышления человека и его тесты ![]() А вот http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/ref/nextpow2.html&http://www.mathworks.com/cgi-bin/texis/webinator/search/?db=MSS&prox=page&rorder=750&rprox=750&rdfreq=500&rwfreq=500&rlead=250&sufs=0&order=r&is_summary_on=1&ResultCount=10&query=nextpow2&submitButtonName=Search У меня возник вопрос, что не так с функцией? ![]() А какой контекст подразумевался ещё? Или как вы пытались использовать? А вот насколько я в курсе "нормальная" реализация ![]()
Добавлено через 6 минут и 59 секунд ![]() |
Автор: ginnie 27.8.2008, 22:40 | ||
Уважаемые коллеги, хочу обратить ваше внимание, что функцию я привел не как пример рабочего кода, а как пример кода, использующего нюансы Perl и трудного для понимания другими разработчиками. Уважаемый nitr, результат поиска по шаблону (рег. выражения в конце функции) зависит от контекста, в котором он выполняется, а этот контекст в свою очередь зависит от контекста вызова функции. В скалярном контексте возвращает 1 (совпадение найдено) или 0 (не найдено), в списочном - захваченную скобками подстроку.
выведет 1 ![]() Хотел прояснить для себя правильное название контекста. Я всегда пишу списочный, некоторые коллеги, а также КэмелБук (в некоторых местах) используют слово списковый. Посмотрел на сайте gramota.ru: списочный - такое слово есть, а списковый - нет. Может кто-нибудь прояснить ситуацию (у меня в школе тройка была по русскому языку ![]() |
Автор: nitr 28.8.2008, 01:00 | ||||||
лично это я понял ![]()
Спасибо. А то я не понял, что вы имели ввиду ![]() Как выход:
|
Автор: korob2001 28.8.2008, 11:12 | ||
Мне кажется, что всё же правильно будет - СПИСКОВОЙ контекст, по крайней мере в большинстве книг, употребляется именно это слово. |
Автор: ginnie 28.8.2008, 11:22 |
Уважаемый korob2001, слово СПИСКОВОЙ в словорях на gramota.ru тоже отсутствует. Интересует правильный вариант именно с точки зрения правил русского языка (т.к. писать с ошибками в нашем возрасте уже неприлично ![]() Добавлено через 2 минуты и 42 секунды Уважаемый nitr, приведенная мной функция next_power_of_two() никоим образом не является более производительным вариантом. |
Автор: nitr 28.8.2008, 12:03 | ||||
ginnie, ![]() ![]() Я тоже считаю "Списковый". Надо взять словообразовательный словарь, найти слово "список" и посмотреть, какое "прилагательное" из него образовывается ![]() Мдя...
НО!!! в Гугле не нашёл "списочный элемент", в таком же контексте как "списковый элемент" ![]() Скорее всего будет верно все предложения/словосочетания приводить к слову "список". Например, списковый/списочный элемент - элемент списка ![]() http://www.codenet.ru/webmast/perl/CGI-Perl.php
В этой статье списочный. Но как-то не по-русски читается ![]() ![]() |
Автор: Bulat 28.8.2008, 13:01 | ||
списковой - такого слова и в викисловаре нет, а вот списковый - в викисловаре присутствует, но статья незавершенная
Это все нуна копать в морфологию ![]() |
Автор: korob2001 29.8.2008, 21:11 | ||||||||||
Только что посмотрел в книгах по Perl. Perl - Специальный справочник (Стивен Холзнер). Стр. 70
И в той же книге, на следующей странице: Стр. 71
Самоучитель Perl (Матросов, Чаунин) Стр. 53
Программирование на Perl 3-издание (Уолл, Кристиансен, Орвант). Стр. 105
Если честно, раньше особого внимания не обращал на это, потому пологал, что везде написано именно так. Дальше смотреть не стал, ежу понятно, что как кому хочется так и тот и пишет. ;)))))) |
Автор: gcc 29.8.2008, 21:32 |
проще list ![]() |
Автор: nitr 29.8.2008, 22:15 |
korob2001, да, поэтому и возник у ginnie вопрос, как верно ![]() Получается "переводам" можно не верить, а такие "бренды" их готовили, странно. Я проверил, ни в одном современном или советском словаре нет слова "списковый", от слова "список" образуется "списочный" и это будет верно так писать, как бы не казалось, что язык ломается от такого произношения, имхо, дело привычки ![]() Будем считать что слово "списковый" - perl'овый сленг ![]() |
Автор: KSURi 30.8.2008, 02:40 |
Lingvo говорит, что "списковый" - list-oriented, а "списочный" - просто "list". В оригинальной документации везде используется словосочетание "list context". Да и просто "списковый" как-то не звучит) |