Pull to refresh

Comments 63

Ну, применительно к тому коду написание жы-шы с буквой ы вполне оправдано, не находите?
Исправыл :). Спасибо, исправил!
На перле можно каждый второй скрипт отправлять на конкурс. Место в тройке гарантированно.
Распространенное заблуждение ;)

Perl отлично читаемый язык, правда перенасыщенный идиомами, посему сложный для вкуривания без его знания. И использующий явные указатели, что для многих программистов бывает… некомфортным. Меня например PL/SQL после перла бесит своей нелаконичностью. В итоге конструкция из пары строчек (научиться читать map / slit / join конструкции и простейшие регекспы несложно).

Хотя вы правы, нечитабельны именно скрипты, когда мне надо что-то быстро сваять, например прогу для чистки raw/jpg, я не особо парюсь читабельностью и тем что конструкция ?(): не является общепринятой идиомой.

Правда и питоновских подскриптников у меня хватает и тоже не сказал бы что они читаемые ;)

Да вот и пример — приблуда которая переносит в каталог 2clear (корзину) JPG файлы не имеющие RAW пары с тем же именем.
use strict;
use Data::Dumper;

my @files = glob('*.*'); # опасность ищем только файлы с расширениями
my %refs = ();

my %param = (
clear => ['jpg'], # страшная конструкция ключ => ссылка(!) на анонимный массив
base => ['raw','nef','dng'],
);

for my $f (@files){
next unless $f =~ /([^\\\/\:]+)\.(.*?)$/; # страшный регексп(!) для выкусывания имени файла и расширения
my ($name, $ext) = (lc($1), lc($2)); # непонятные переменные $1 $2 для результатов поиска
$refs{$name}{$ext} = $f; # хэш-хэшей (нужно помнить что скобки массива и хэша разные)
}

for my $r (keys %refs){
next if grep{ exists $refs{$r}{$_} } @{$param{'base'}}; # постфиксный if, избыточный grep и разыменование "ссылки на массив" (!) в массив
for (map{ exists $refs{$r}{$_} ? $refs{$r}{$_}:() } @{$param{'clear'}}){ # map cond?():value для исключения эл-тов из массива с одновременным его преобразованием
rename($_, "2clear/$_"); # опасность! переменная $_
}
}


Главное, чтобы такое не пролезало в продакшн. Пишу на перле реальные проекты уже достаточно долго, проскакивали у нас такие вещи у новых программеров. Но благодаря настроенному Perl::Critic, жить становилось проще всем.
А что именно вам тут не нравится? ;)

Здесь использована одна нестандартная идиома. Кстати Perl::Critic на неё почему-то не возбудился.

Что нашёл Perl::Critic в brutal mode (в gentle ему всё нравится):
— Объявлять ревизии и пакеты в скипте, равно как возвращать 1 в конце оного я вижу мало смысла.
— next unless я сам не люблю, но тут абсолютно читаемый контекст (свалить, если регэксп ничего не нашёл). постфиксный if я считаю более читабельным, чем префиксный (что кстати в соглашении о коде на прошлой работе было прописано).
— grep — as bool да моветон, но в данном контексте допустим. List::Util::any — смысла мало тут городить.
— скобки в вызове built-in функций… вот это сюрприз — предпочитаю их писать для более легкого чтения кода

Так что про «новых программистов» вы загнули, 6 лет плотной работы с Perl оно знаете как-то…
Что не нравится?
Ну например вот это:
next if grep{ exists $refs{$r}{$_} } @{$param{'base'}};
или это
for (map{ exists $refs{$r}{$_} ? $refs{$r}{$_}:() } @{$param{'clear'}})
или
next unless $f =~ /([^\\\/\:]+)\.(.*?)$/;

Это трудно читается. У нас над одним кодом работают 10 перл-программеров, если каждый будет писать как захочет, это будет полный ад.
Помимо того, что нужен один(или хотя бы похожий) стиль программирования (а особенно в таком языке, как перл, который позволяет слишком много вольностей).

Кстати, да, забыл, помимо перлкритика у нас еще хук на push стоит в репозиторий, который проверяет код на всякие мелочи.

Так вот, помимо общего code-style, как я считаю, необходимо просто-напросто запрещать некоторые конструкции (у нас например запрещены постфиксные if-ы, в которых больше 2 условий; или например однострочные map-grep-sort; или например вложенные тернарные условия; ну и так далее).

Всё-таки согласитесь, что на перле гораздо проще написать трудночитаемый код не говнокодя, чем на тех-же плюсах или джаве.
Я сам не так давно страдал этими конструкциями(до сих пор иногда проскакивает :), но переучил почти себя, стало немного проще читать свой код 1-1.5годовой давности :)
По поводу for полностью согласен — грязный хак. for на map да еще неявный filter. писалось для себя, а сам я знаю какие идиомы хорошо читаются ;)

По поводу постфиксного if с одним условием не соглашусь (вот постфиксный unless с двумя условиями или даже одним, не совсем прозрачным — первый кандидат на выпил).

Мне легче прочитать постфиксный if с правильным форматированием, чем префиксный. Это более логично и хуманоридабельно:)

Дать васе пряник 
если
  сегодня вторник
  и сегодня шел дождь
  и у нас есть пряник
  и (вася себя хорошо вел
      или вася застукал меня с училкой
      или у меня хорошее настроение);

Ну вот кстати по поводу питона соглашусь. Например мне его сложно читать, после нормальных языков )
тсссс… можно попалиться ;)
Это как раз плохой код. Почему «выкусывание» имени файла не заменить на вызов нормальной функции типа basename()/parseFilename()?

> for my $f (@files)

Лишь бы не писать нормально, for ($var in $array)

> @files, %refs, $refs

жесть.

Последний блок вообще нечитабелен, Возможно, если вы 6 лет пишете на 1 языке, то вам это привычно (за 6 лет легко можно научиться читать даже машинный код, я знаю, что люди раньше перфокарты умели читать без компьютера), но по моему это напрасная трата времени. Экономия от написания $1 вместо $match[1] например не стоит потери читабельности.

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

Все же что-то серьезное и крупное на нем писать нельзя. Даже один программист легко наворотит 100% нечитабельный скрипт, а что сделает команда (много человек, у каждого свой характер, свои привычки, помножьте это на поистине безграничные возможности обфускации кода в Перле), страшно представить.

Будем считать, что вы не выспались. По Perl вам незачет.

1. Не надо мешать теплое с мягким, «плохость» кода и непонимание вами языка
2. Префиксы контекста переменных (и контексты скаляра) это как раз фишка перла, за которую я его очень люблю. И читать код, равно как ловить ошибки проще, поскольку сразу виден контекст.
3. $match[1] в модели strict вам сразу выкинет error, а за build-in переменные типа $MATCH, вам сразу настучит по голове тим лидер. Потому как, либо вы используете понятные тому, кто хоть 15 минут потратил на разбор регекспов в перл переменные ${digit}, либо используете //g, чтобы собрать поиск в массив. Зачем делать сложно то, что можно сделать просто
4. передача параметров и объявления классов в перл исторически не особо прозрачные, но шоподелать
5. использовать функцию там где можно написать простейший регексп… можно конечно, но если работаешь в команде — это пример скрипта для себя, опять же зачем делать сложно то что можно сделать просто
6. mail.ru, amazon.com (правда при масштабировании переписанный на другой приблуде)…
7. У любой Perl команды есть соглашение о коде. У нынешнего Perl'а высокий порог вхождения поэтому профи пишут более чем понятно… для других профи. Меня пхп-шники вымораживают больше, вот где аццкий ад, пару раз приходилось подчищать сопли… А казалось бы
Понравилось как у них буквы в разделе победителей обозначены.
Да уж, по сравнению с IOCCC представленное в посте — детские шалости.
Не дал бы ни первое место, ни второе ни одному из вариантов кода в статье. Оба достаточно читаемы, понятны, и даже оформлены с отступами и разбиением на блоки, чего не скажешь о примерах из IOCCC в духе:
#include <stdio.h>
#include <math.h>
double l;main(_,o,O){return putchar((_--+22&&_+44&&main(_,-43,_),_&&o)?(main(-43,++o,O),((l=(o+21)/sqrt(3-O*22-O*O),l*l<4&&(fabs(((time(0)-607728)%2551443)/405859.-4.7+acos(l/2))<1.57))[" #"])):10);}
В чем смысл? Каковы критерии? Любой пример можно сделать ещё более неудобочитаемым.
UFO just landed and posted this here
Та ну, код вполне читается, даже я прочёл первый пример спокойно, при том что С\С++ явно не моя профессия. Второй пример вообще сущая простота
Да ну, обфусукатору сказать: друг, используй только вот эти символы 0,O,1,I,l,_

Это посильнее Фауста Гёте будет :)

Почему то вспомнился анедот:

Добавьте в широко используемый h file

#define TRUE FALSE /*happy debugging motherfucker!*/
тока что погуглил. есть улучшение:

#define TRUE random()%2
Лучше так:

#define TRUE (rand()%100 < 95)

— чтоб в 95% случаев было правильное значение.
Что-то смахивает на
int get_random_number() { return 4; }
* This source code was highlighted with Source Code Highlighter.

На Хабре уже сто лет есть тег source…
Рядом с постом наверно только для меня сверкает «из песочницы»? Хорошо сказано!
Это означает, что вы сейчас не можете код отредактировать, чтобы избавить наши браузеры от буйства тегов :)? Или это означает, что в песочнице вообще недоступны ХабраТеги? Просто я довольно давно ей не пользовался.
Если вы про тег code, то я не видел подсветки, а так, могу специально для вас убрать «This code was highlighted....».
Тогда вынужден признать, что не знал об этом. В редакторе кнопка с надписью «code» вставляет тег code.
Хотя, есть тут кое-какие мысли… на счет
>>> Это означает, что вы сейчас не можете код отредактировать, чтобы избавить наши браузеры от буйства тегов :)?
Думаю неверное рассуждение, ведь по-любому в итоге получется «буйство тегов», чтобы мы могли увидеть подсветку, и это не зависит от того, использованы ли эти теги вами, или вставляются редактором, когда используется тег source.
Почему вам кажется, что фраза «тег source» может означать тег code? У вас всё хорошо? Я за вас волнуюсь.
А почему с таким сарказмом? У вас что всех так встречают? За волнение спасибо, а вы мне пофигу, если что!

P. S. И карму оставьте в покое!

P. P. S. На счет кармы, может поможете мне опубликовать этот пост в «Кодобред»?
Сарказм — это не страшно, привыкайте. В данном случае его применение обосновано не вашим незнанием возможностей хабра (что простительно новичку), а неспособностью внимательно прочитать комментарий оппонента.

Что касается вашего топика, его полезность равна нулю, поэтому желание что-то делать с вашей кармой у меня отсутствует.
Что-то уже начинаю волноваться за вас. Вы твердите о невнимательном прочтении комментария оппонента, а мою почему-то читаете невнимательно. Вы сами поняли, что не знаю возможностей хабра, поэтому мой комментарий как раз к месту, я ведь хотел выяснить, что именно имел ввиду оппонент.
«Если вы про тег code, то я не видел подсветки...». Обратите внимание, там стоит «Если»!
То, что изложено выше — это только цветочки. Вот как порой выглядят ягодки:

image
Ну так немцы, что Вы от них хотите.
Labview? никогда в живую не видел его
Код:
std::cin >> _ >> __ >> ___;
std::cin >> ____ >> _____;
int _0_ = ( _ + __ ) * (___ + static_cast(____) / static_cast(_____));
___000___ _________(_0_);


местами напоминает разъехавшийся смайлик

(\_/)
(O.o)
(> <)
/_|_\
Для всех, кто считает примеры не вполне удачными, неадекватно отобранными или и то и другое — в названии поста не использовано слово «Самый» вместо «Лучшего», вот поэтому примеры хорошо читаются, при этом неудобочитаемы!
а почему «Ненормальное Программирование»? Лучше бы это было в блоге «Кодобред», что ли :)
Гдето видал, полностью «задефайненный» русскими буквами исходник на С++. Тоесть типо

если ()
начало ....
конец иначе начало
.... конец


А по нормальному вот так:

if ()
{
...
} else {
...
}

Сейчас найти не смог, если кто знает киньте ссылку.
Просто блестяще! Целую повесть можно рассказать )
UFO just landed and posted this here
А еще есть классные варианты даже на томже PHP, когда в скрите куча переменных типа:
$0O0O0O, $O000O00 и так далее…
Первая будто аннимированная переменная, глаза не понимают, что творится:)
bool result = false;


// some code


if (result.ToString() < 5 ) {

}
Вы перепутали говнокод с трудночитаемым.
Немножко java:
class $<_, $, $_> {$ _;<_> $($ _){}<$> $($ _,$ $_){_=$_;}}
Код, который занял 2-ое место очень порадовал.
Частенько человечеству приходят гениальные (и к тому же элементарные) мысли, взглянув на которые каждый думает: «Блин, это же так элементарно, как я до такого не додумался!».
Согласен. Вот только когда самому хочется такое написать, уже на третьей строчке желание пропадает:)
UFO just landed and posted this here
Что-то страшно стало:). А может эту технику/стиль использовать в проектах с открытыми исходниками? Вот круто будет!
Не понимаю, как это сложнее, чем:

class DataServiceContractDispatcher
{
      DataServiceContractDispatcher(int dataServiceContractFactoryHandle)
...


¯\_(ツ)_/¯
function illiiil(iilli,illlii){
return iilli*illlii;
}
var iili{
this.iillili = 1;
this.iillli = function(){return this.iillili++;}
this.illi=function(iilll){
var iillili=this.iillili*2;
return illiiil(iillili,this.iillili);
}
}
var illl=iili();
illl.illi(1);
Sign up to leave a comment.

Articles