![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Привет всем!
Какой стиль программирования на perl вам ближе: 1) со множеством перловых фишек и изворотов 2) строгий ООП стиль, а-ля java 3) что другое ? Задаю этот вопрос, т.к. самому перл понравился за скороговорку, за возможность быстро делать сложные вещи. Но по мере работы над проектом замечаю, что такой код плохо поддерживается (особенно, если писал его другой человек), потихоньку код приходит к виду a-la java, со множеством мелких классов, get/set, паттерны и все такое.. может я просто не постиг ДАО перла и на самом деле надо все писать процедурными скриптами ? П.С. извиняюсь, если флейм.. Это сообщение отредактировал(а) sir_nuf_nuf - 27.8.2008, 10:26 |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый sir_nuf_nuf, стиль написания часто зависит от постановки задачи: если быстродействие кода не является определяющим фактором при разработке, то лучше писать понятный другим разработчикам код, т.е. без особых "изворотов" (использование уникальных для Perl конструкций только там, где они действительно уместны). Если же приоритетом является производительность кода, то тут бывает такое...
![]() Это сообщение отредактировал(а) ginnie - 27.8.2008, 11:07 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Perl-style был и будет, если придерживаться этих рамок, то всем любые извороты будут понятны. Сколько "читал" код программистов, всегда был рад, что пишут в этом стиле, иначе ни поддержка. ни поиск ошибок/недочетов, да вообще многое сводится к нулю.
Тут имхо всё равно ООП или только извороты, или извороты+ООП ![]() perldoc perlstyle ;) Добавлено через 1 минуту и 19 секунд
это просто ООП в его "понимании" и реализации на любом языке. Почему Perl должен отличаться, если задача реально того стоит и реализация её этого требует - то да. |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый nitr, а вот такой код Вам понятен?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
Уважаемый ginnie, а что именно под быстродействием имееться ввиду, использовать всегда хэш и не использовать процедуры в которыйх функции будут внутри другой функции? компьтеры дешевеют, можно поставить 8Gb RAM ![]() JAVA весь на ООП, но он требовательный к ресурсам... Это сообщение отредактировал(а) gcc - 27.8.2008, 11:56 |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
ginnie, мне да. Но кто так писать будет?
![]() И так
|
|||
|
||||
ginnie |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый gcc,
думаю, для Вас не будет открытием, что в Perl один и тот-же результат можно получить несколькими способами. Время выполнения для разных способов отличается и если важна проиводительность кода, то приходится выбирать варианты, читаемость и понятность которых оставляет желать лучшего. Например, задача преобразования IP-адреса из формата xxx.xxx.xxx.xxx в int (для сохранения в БД). Самый быстрый вариант
У нас памяти в сервере больше 8 Гб, все равно не хватает ![]() -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||||
|
|||||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
лично такое "изворотом" не называю...
Добавлено через 2 минуты и 15 секунд ![]() Можно всё же это совмещать... Согласен не во всех случаях, но можно в "таких местах" оставлять комменты... Добавлено через 3 минуты За кодером не убудет... |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Побольше багов и косяков
![]() ИМХО, если что-то небольшое и не очень функциональное(без огромного количества всяких фич), то проще писать по процедурному. Но если что-то многофункциональное, то лучше прибегать к ООП. Но мулька-то в этом, хошь так, хошь так. ![]() -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый nitr, специально для Вас шедевр нетривиального мышления:
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Я лично по возможности использую только ООП. Правда далеко не все мудули на CPAN объектно ориентированы.
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
ginnie, спасибо
![]() |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
nitr, я минут 15 разбирался
![]() -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
AlexPet |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 5.12.2007 Где: Брянск Репутация: 1 Всего: 1 |
Люблю perl-style. Наверное, поэтому его (perl) и использую.
ООП примерно везде одинаково, и навевает скуку :( Возможно, оффтоп, но в последнее время столкнулся с тем, что для высокопроизводительных математических вычислений перл все же слабоват. Даже XS модули не спасают. Приходится все же использовать либо Maple\MatLab для мат.экспериментов, либо C (по слухам, Python тоже в математике преуспел, но так до него руки и не дошли) для продакшн. Жаль :( ginnie, возможно я не понял Ваш пример с next_power_of_two, но там всегда будет выводиться 1 в случае подачи на вход n >= 1. Это сообщение отредактировал(а) AlexPet - 27.8.2008, 18:19 |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый AlexPet, интересно, как это C-код работает нормально, а XS-модули не спасают?
советую провести полевые испытания функции ![]() -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
AlexPet |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 5.12.2007 Где: Брянск Репутация: 1 Всего: 1 |
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 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый AlexPet, Вы правы, я не обратил внимание на контекст для регулярного выражения. Он зависит от контекста вызова функции next_power_of_two(). Указанный выше вариант верно работает в списочном контексте (например print next_power_of_two(7);)
Про чужие XS-модули понятно, я имел ввиду свои XS-модули на основе корректно работающего C-кода. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
AlexPet |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 5.12.2007 Где: Брянск Репутация: 1 Всего: 1 |
Вот покопался в perldata и вот что вычитал:
Однако перл обычно выделяет число сегментов памяти под хэш как "min k, 2^k > n" (где n - количество элементов в хеше; установлено экспериментальным путем ![]() Только в том-то и дело, что "обычно". Например: n next_power_of_two 1..7 8 8 16 9 16 ... 1023 1024 1024 1024 Так что я бы относился с осторожностью к значению, выдаваемому этой функцией ![]() |
|||
|
||||
nitr |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
AlexPet, ginnie,
Вот размышления человека и его тесты ![]() А вот MATLAB У меня возник вопрос, что не так с функцией? ![]() А какой контекст подразумевался ещё? Или как вы пытались использовать? А вот насколько я в курсе "нормальная" реализация ![]()
Добавлено через 6 минут и 59 секунд ![]() Это сообщение отредактировал(а) nitr - 27.8.2008, 21:54 |
||||||
|
|||||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемые коллеги, хочу обратить ваше внимание, что функцию я привел не как пример рабочего кода, а как пример кода, использующего нюансы Perl и трудного для понимания другими разработчиками.
Уважаемый nitr, результат поиска по шаблону (рег. выражения в конце функции) зависит от контекста, в котором он выполняется, а этот контекст в свою очередь зависит от контекста вызова функции. В скалярном контексте возвращает 1 (совпадение найдено) или 0 (не найдено), в списочном - захваченную скобками подстроку.
выведет 1 ![]() Хотел прояснить для себя правильное название контекста. Я всегда пишу списочный, некоторые коллеги, а также КэмелБук (в некоторых местах) используют слово списковый. Посмотрел на сайте gramota.ru: списочный - такое слово есть, а списковый - нет. Может кто-нибудь прояснить ситуацию (у меня в школе тройка была по русскому языку ![]() Это сообщение отредактировал(а) ginnie - 27.8.2008, 22:43 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
лично это я понял ![]() Спасибо. А то я не понял, что вы имели ввиду ![]() Как выход:
|
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Мне кажется, что всё же правильно будет - СПИСКОВОЙ контекст, по крайней мере в большинстве книг, употребляется именно это слово. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый korob2001, слово СПИСКОВОЙ в словорях на gramota.ru тоже отсутствует. Интересует правильный вариант именно с точки зрения правил русского языка (т.к. писать с ошибками в нашем возрасте уже неприлично
![]() Добавлено через 2 минуты и 42 секунды Уважаемый nitr, приведенная мной функция next_power_of_two() никоим образом не является более производительным вариантом. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
nitr |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
ginnie,
![]() ![]() Я тоже считаю "Списковый". Надо взять словообразовательный словарь, найти слово "список" и посмотреть, какое "прилагательное" из него образовывается ![]() Мдя...
НО!!! в Гугле не нашёл "списочный элемент", в таком же контексте как "списковый элемент" ![]() Скорее всего будет верно все предложения/словосочетания приводить к слову "список". Например, списковый/списочный элемент - элемент списка ![]() http://www.codenet.ru/webmast/perl/CGI-Perl.php
В этой статье списочный. Но как-то не по-русски читается ![]() ![]() Это сообщение отредактировал(а) nitr - 28.8.2008, 17:39 |
||||
|
|||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
списковой - такого слова и в викисловаре нет, а вот списковый - в викисловаре присутствует, но статья незавершенная
Это все нуна копать в морфологию ![]() -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
korob2001 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Только что посмотрел в книгах по Perl. Perl - Специальный справочник (Стивен Холзнер). Стр. 70
И в той же книге, на следующей странице: Стр. 71
Самоучитель Perl (Матросов, Чаунин) Стр. 53
Программирование на Perl 3-издание (Уолл, Кристиансен, Орвант). Стр. 105
Если честно, раньше особого внимания не обращал на это, потому пологал, что везде написано именно так. Дальше смотреть не стал, ежу понятно, что как кому хочется так и тот и пишет. ;)))))) -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||
|
|||||||||
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
проще list
![]() |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
korob2001, да, поэтому и возник у ginnie вопрос, как верно
![]() Получается "переводам" можно не верить, а такие "бренды" их готовили, странно. Я проверил, ни в одном современном или советском словаре нет слова "списковый", от слова "список" образуется "списочный" и это будет верно так писать, как бы не казалось, что язык ломается от такого произношения, имхо, дело привычки ![]() Будем считать что слово "списковый" - perl'овый сленг ![]() |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Lingvo говорит, что "списковый" - list-oriented, а "списочный" - просто "list". В оригинальной документации везде используется словосочетание "list context". Да и просто "списковый" как-то не звучит)
-------------------- Died at Life.pl line 21 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |