При этом внутри код рельс никогда не был чем-то достойным особого
подражания. Код как код, местами довольно дрянной.
API рельс — прекрасен, кишки нет. Но пофиг, потому что юнит-тесты,
оперативное обновление, динамичное развитие.
Но с релизом 3 ситуация поменялась. На самом деле, проблема назрела
ещё раньше, когда группа «хакеров» (а на самом деле, бестолочей)
решила сделать merb под эгидой «пусть внутри будет красивый объектный код».
Сложно объяснить, в чём именно состояла проблема. Возможно в том, что
в руби так удобен манкипатчинг и для того, что бы он работал,
код должен быть буквально на каждой строчке распилен на методы
классов, возможно в том, что тяжелое наследие перла из людей просто
так
не выходит. Но сухой остаток таков: мерб был красив кодом, но так и не
смог превратиться во что-то работающее.
3-и рельсы создавались неоправданно долго и одной из причин было так
же то, что во главу угла вместо работоспособности и скорости, была
поставлена эфемерная внутренняя красота кода. Что это такое — описать сложно.
Но сухой остаток таков: «внутренняя красота кода» не дала никаких
реальных бонусов ни по скорости работы, ни по потребляемым ресурсам,
ни по скорости программирования (!). Термин «внутренняя красота кода»
в кавычках, потому что это крайне тонкое понятие,
которое можно в этом случае охарактеризовать скорее как «ООП головного мозга»
Недавно я столкнулся с особым проявлением такой «внутренней красоты»,
когда полез в библиотеку https://github.com/mojombo/grit
Не, Том молодец и при отсутствии внятной документации разобрался в
кишках гита. Молодец, спору нет. Но так писать нельзя.
Вот пример: https://github.com/mojombo/grit/blob/master/lib/grit/git-ruby/internal/pack.rb#L143
Вывернутое наизнанку управление кода с помощью лямбд
с адскими side-эффектами ни капельки не помогает сокращать код. Он
лишь растет и распухает, становясь рваным как коллбеки на
джаваскрипте.
Глядя на такой «ООП» код, начинаешь ценить простоту линейного кода на
C, который с копипащенными кусками всё таки прост, читаем и
поддерживаем.
Особенно это разительно при сравнении аналогичных кусков кода на Ruby
и на Erlang.
В самом деле: выделение куска кода в отдельный метод, который ещё и в
другом файле — очень серьезное действие, которое надо обдумать.
Если функция используется только один или два раза, то её вычленение
может быть серьезной ошибкой лишь ухудшающей читаемость.
Самое страшное, когда в борьбе с копипастой начинают выделяться
методы, которые немножко отличаются по их использованию в разных
местах.
В итоге начинаются всякие непонятные пробрасывания дополнительных
управляющих флагов. Ах, это ведь руби, здесь среди хипс.. хакеров не
принято
передавать управляющие флаги, надо запутать читающего, передав блок
внутрь обобщенной функции.
В итоге строк кода больше, читаемость меньше, хрупкость кода зашкаливает.
Слава богу, что ещё никто не посмотрел на монады в хаскеле и не
потащил их в ActiveSupport.
Резюме такое. Многие из модных библиотек написаны на самом деле не
очень хорошо. Они могут использовать всякие вычурные конструкции,
но практика показывает, что как правило, сделать модульную
архитектуру, не зная списка модулей, невозможно. Попытка сделать
обобщенную архитектуру
на все случаи жизни приводит к мербу (который, кстати, был непригоден
для ряда вещей =).
Код должен развиваться от потребностей, а не от пустого проектирования
на будущее и пользоваться языковыми средствами надо крайне аккуратно,
каждый раз отслеживая: действительно ли это помогает или это только
нагромождение кода.
--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
ror...@googlegroups.com
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-un...@googlegroups.com
Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru
1 октября 2012 г., 6:44 пользователь Zabazhanov Arkady
<kinw...@gmail.com> написал:
--
Yours truly, Pavel.
Третья история с интерфейсами. Тут просто пример:def do_something_with_value value, contextcase valuewhen Stringvalue.gsub(/#{context}/, '')when Integer(value + context.to_i).to_sendend
Можно написать вот так. Но если этот код во внешней библиотеке - то в ним уже ничего не сделаешь.def do_something_with_value value, contextvalue.extract_special_value context if value.respond_to? :extract_special_valueend
Кстати, вопрос аудитории: как вам мысль Literate Programing? Макс не
поддержит (точнее, поддержит до тех пор, пока собственный гемор не
снивелирует красоту кода, что само по себе неплохо), это понятно. Но
вообще-то? Как сферическая идея в вакууме либо прикладная методика?
Руби ИМО тут не самый неудачный язык )
1 октября 2012 г., 8:59 пользователь Zabazhanov Arkady
Угу. Это как раз классический пример ООП-штопора. Пишем библиотеку,
которая принимает String и Integer.
Думаем: о, надо заэкстрактить метод. Гадим в классы String и Integer.
Потом появляется Range, для которого надо вернуть среднее и отклонение
(т.е. уже два числа, а не 1).
Пишем метод do_something2, для которого делаем кейс внутри
библиотечного кода и пошло поехало.
А проблема в чём. Очень сложно написать библиотеку на все случаи
жизни. Я бы даже сказал: невозможно. Надо сначала все эти случаи в
голове удержать, а потом уже под них всех дизайнить.
И практика показывает, что зачастую лучше забить болт на потенциальную
расширяемость (которой в 99% никто не воспользуется),
и хорошо сделать то узкое подмножество функциональности, которое можно
отладить и протестировать.
Именно так и были написаны рельсы.
Приведу пример из личного опыта. erlyvideo 2 был очень расширяемым
сервером. В каждом месте было понатыкано возможностей для расширения.
Практика такова, что когда понадобилось этим всем пользоваться,
пришлось всё равно пилить тот код, который должен был быть предельно
расширяем. Это закончилось версией 3 в которой, например, жестко
захардкожен список входящих протоколов. И это работает!
Так же, как и нельзя написать на руби полностью функциональный код (нет функций высшего порядка).
Это абсолюная болтовня. В руби есть отчуждаемые функции, которые можно
передавать в другие функции.
То, что они синтаксически немножко не похожи на джаваскрипт, не
отменяет того факта, что это функции.
И не отменяет того факта, что они не являются радикальным способом
упрощения кода.
Нет, это вопрос общей терминологии между людьми. Если ты заявляешь,
что в руби нет функций высшего
порядка, в то время, как все вокруг считают, что есть, ты должен
объяснить, почему ты так считаешь.
В противном случае, ты можешь назвать функцию классом и совершенно
запутать собеседника.
Я столкнулся с такой же проблемой при разработке на spree, но это было
на rails 3.0, в rails 3.2 перезагружаются только те файлы, которые
были изменены[1] (в отличии от rails 3.0, где перезагружаются ВСЕ
файлы).
--
WBR, Anton
Я свой проект начинал на Spree 1.0 и поэтому был привязан к Rails 3.1
(а при попытке апгрейда на Spree 1.1 повылазило куча несовместимых
гемов и всяких других ошибок).
2012/10/1 Anton Ageev <ant...@gmail.com>:
Рельсы -- прекраснейший продукт. На момент выхода версий 2.3, они были
на несколько лет впереди всей остальной индустрии,
решая очень внятно обозначенный круг задач так оптимально, что даже
монстры типа Микрософта начали равняться на них.
При этом внутри код рельс никогда не был чем-то достойным особого
подражания. Код как код, местами довольно дрянной.
API рельс -- прекрасен, кишки нет. Но пофиг, потому что юнит-тесты,
оперативное обновление, динамичное развитие.
Но с релизом 3 ситуация поменялась. На самом деле, проблема назрела
ещё раньше, когда группа <<хакеров>> (а на самом деле, бестолочей)
решила сделать merb под эгидой <<пусть внутри будет красивый объектный код>>.
Сложно объяснить, в чём именно состояла проблема. Возможно в том, что
в руби так удобен манкипатчинг и для того, что бы он работал,
код должен быть буквально на каждой строчке распилен на методы
классов, возможно в том, что тяжелое наследие перла из людей просто
так
не выходит. Но сухой остаток таков: мерб был красив кодом, но так и не
смог превратиться во что-то работающее.
3-и рельсы создавались неоправданно долго и одной из причин было так
же то, что во главу угла вместо работоспособности и скорости, была
поставлена эфемерная внутренняя красота кода. Что это такое -- описать сложно.
Но сухой остаток таков: <<внутренняя красота кода>> не дала никаких
реальных бонусов ни по скорости работы, ни по потребляемым ресурсам,
ни по скорости программирования (!). Термин <<внутренняя красота кода>>
в кавычках, потому что это крайне тонкое понятие,
которое можно в этом случае охарактеризовать скорее как <<ООП головного мозга>>
Недавно я столкнулся с особым проявлением такой <<внутренней красоты>>,
когда полез в библиотеку https://github.com/mojombo/grit
Не, Том молодец и при отсутствии внятной документации разобрался в
кишках гита. Молодец, спору нет. Но так писать нельзя.
Вот пример: https://github.com/mojombo/grit/blob/master/lib/grit/git-ruby/internal/pack.rb#L143
Вывернутое наизнанку управление кода с помощью лямбд
с адскими side-эффектами ни капельки не помогает сокращать код. Он
лишь растет и распухает, становясь рваным как коллбеки на
джаваскрипте.
Глядя на такой <<ООП>> код, начинаешь ценить простоту линейного кода на
C, который с копипащенными кусками всё таки прост, читаем и
поддерживаем.
Особенно это разительно при сравнении аналогичных кусков кода на Ruby
и на Erlang.
В самом деле: выделение куска кода в отдельный метод, который ещё и в
другом файле -- очень серьезное действие, которое надо обдумать.
Если функция используется только один или два раза, то её вычленение
может быть серьезной ошибкой лишь ухудшающей читаемость.
Самое страшное, когда в борьбе с копипастой начинают выделяться
методы, которые немножко отличаются по их использованию в разных
местах.
В итоге начинаются всякие непонятные пробрасывания дополнительных
управляющих флагов. Ах, это ведь руби, здесь среди хипс.. хакеров не
принято
передавать управляющие флаги, надо запутать читающего, передав блок
внутрь обобщенной функции.
В итоге строк кода больше, читаемость меньше, хрупкость кода зашкаливает.
Слава богу, что ещё никто не посмотрел на монады в хаскеле и не
потащил их в ActiveSupport.
Резюме такое. Многие из модных библиотек написаны на самом деле не
очень хорошо. Они могут использовать всякие вычурные конструкции,
но практика показывает, что как правило, сделать модульную
архитектуру, не зная списка модулей, невозможно. Попытка сделать
обобщенную архитектуру
на все случаи жизни приводит к мербу (который, кстати, был непригоден
для ряда вещей =).
Код должен развиваться от потребностей, а не от пустого проектирования
на будущее и пользоваться языковыми средствами надо крайне аккуратно,
каждый раз отслеживая: действительно ли это помогает или это только
нагромождение кода.