LINUX.ORG.RU

Философия Ruby

 ,


1

3

Читаю исходники стандартной библиотеки

require "rss/0.9"
module RSS
...
end
и в процессе чтения до меня доходит что модуль был переоткрыт и сейчас расширяется! У меня вопрос: зачем так делать? Почему бы просто не использовать наследование? Зачем вообще нужен манки-патчинг? Код становится на порядок запутанее. В том же С# для определения класса в разных файлах используется ключевое слово partial, ага значит определение может быть где то еще.



Последнее исправление: ymn (всего исправлений: 1)

В том же С# для определения класса в разных файлах используется ключевое слово partial, ага значит определение может быть где то еще.

ключевое отличие в том что C# как и java рассчитана на толпу обезьянокодеров работающих за еду. Там все сделано чтобы не оставить команду без ног - т.е. писать можно как угодно и это мало повлияет на остальной код (и по этому на java я и пишу)

руби и прочее это для «хакеров» (не тех которые «какиры») там можно все, чем народ и пользуется

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

мне и интересно как хакеры юзают эти фичи.

сидит Вася хакер хачит код, и встречается код вида "hello".make_all_good. И где искать этот хак? Неужто удобно?

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

из этих понятно. А если строчек 4K? Мне интересно кто и как и главное нафига юзает манкипатч

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

Наследование тут вообще ни при чем.

anonymous
()

модуль был переоткрыт и сейчас расширяется

Трагедия вселенского масштаба. Лучше наплодить 100500 классов, из которых используется только последний, ага :}

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

Работает, но мега костыль. Хотя в принципе если сменить vim на RubyMine то наверное таких проблем не будет(их будет решать иде)

RA
() автор топика

Это доказывает лишь то, что ООП не нужно.

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

если используется только последний то переписать базовый до вида последнего. Если все используются то да, классов столько сколько сущностей. Вот почему бы не ввести ключевое слово reopen? например

reopen module ...
end
уже нагляднее.

RA
() автор топика

Вот здесь правильно сказал:

Ruby’s answer to that problem is monkey patching, polluting the global namespace with an extension to that new type, making it act like a Number after all.

Засираем базовые классы, но ведь нам все равно - главное, что удобно и работает.

Хотя мне больше нравится про джавистов:

Java developers who have got beaten up by the Gang of Four in their youth, on the other hand, will think that an Adapter may solve all of their problems:

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

Это ты, балбес, просто запутался в двух строчках и решил спасти человечество, заменив 2 привычных строчки на одну новую. А человечество-то в этом и не нуждается. Ты бы еще предложил вместо простого деланья манки-патчинга обрамлять все это в MONKEY_PATCH_START ... MONKEY_PATCH_END

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

Это ты, балбес, просто запутался в двух строчках и решил спасти человечество, заменив 2 привычных строчки на одну новую. А человечество-то в этом и не нуждается.

А что такое refine в Ruby 2.0?

tailgunner ★★★★★
()

А мне вот такая философия нравится:

Идеальная программа равномерно заполняет своим исходным кодом широкоформатный экран.

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

А почему ты так толсто? refine было призвано не спасать кретинов от синтаксического шока, а чтобы как раз не засирать базовые модули.

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

А почему ты так толсто?

WAT

refine было призвано [...]

Без разницы, для чего оно было призвано. Это как раз конструкция MONKEY_PATCH_START ... MONKEY_PATCH_END - та самая, которая не нужна миру... если воспринимать тебя всерьез.

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

при чем тут 2 строчки? Открыл файл с определением класса, прочитал, все понятно. В коде натыкаешься на метод которого нет в определение класса, твои действия? grep? Ты лучше скажи что трудного в наследование что ты применяешь манки?

MONKEY_PATCH_START

самый мягкий вариант о котором я думал, хочешь безосновательно юзать манки? Набери вручную 256hash

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

ну я выше писал, мне даже ответ дали

«hello».method(:make_all_good).source_location

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

Ничего трудного, просто мне легче написать 2.coolTransform, чем (new coolTransformAvailable(2)).coolTransform, потому что не надо городить оберток.

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

Вообще-то разница есть.Из того, что эта конструкция есть, не следует делать вывод о том, что она была введена в язык для того, чтобы на лоре было меньше истерик неосиляторов.

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

хочешь безосновательно юзать манки? Набери вручную 256hash

Я не понял, что?

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

Из того, что эта конструкция есть, не следует делать вывод о том, что она была введена в язык для того, чтобы на лоре было меньше истерик неосиляторов.

*пожимая плечами* Еще раз - неважно, для чего именно она была внесена. Это тот самый... ну ты понел.

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

эм, я тоже могу пожимать плечами, а по делу сказать есть что? Это как утверждать, что если моль есть одежду, то одежда была создана потому, что моли было нечего есть.

cdshines ★★★★★
()

В том же С# для определения класса в разных файлах используется ключевое слово partial, ага значит определение может быть где то еще.

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

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

по делу сказать есть что?

Может быть, после того, как ты скажешь, в чем разница

cdshines> Вообще-то разница есть

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

Наследование куда очивидней

С наследованием проблема в том, что мало кому хочется использовать нестандартный класс всего лишь ради пары плюшек. Например, потому что теряешь литералы. Вместо s = «string» начинаются жавизмы s = MySuperString(«string»). Те же рельсы выглядели бы беспощадно ынтырпрайзно без открытых классов. Понятно, что с манкипатчингом нужно аккуратнее: могут быть конфликты имён, да и вообще возникает сильная зависимость от вменяемости автора библиотеки. Тут как всегда рулит здравый смысл, а кому нужна огороженность - велкам ту жаба.

Hjorn
()
module RSSDlyaLeshi
module RSSDlyaVani
module RSSDlyaKosti

Надо так штоле?

Почему бы просто не использовать наследование?

Наследование, в данном случае - говно. И что ты будешь делать.. тестить 150 классов с одним и тем же функционалом? Создавать классы, которые нужны для одной задачи?

зачем так делать?

Потому что мы можем.

Код становится на порядок запутанее.

В проекте, в одном месте, ты расширяешь класс (причем, ты можешь это сделать инклудом модуля(ей) и это будет очень наглядно, а главное, _переносимо_). В последствии ты _легко_ сможешь применить конструкции в другом проекте, ведь классы не различаются по имени.

наследование

Ответь зачем.

На самом деле ты делаешь именно то, что сейчас нужно - расширяешь библиотеку. Через наследование ты показываешь общность объектов. У тебя здесь нет общности объектов. Ты просто желаешь наклепать непереносимый код.

special-k ★★★
()
Последнее исправление: special-k (всего исправлений: 4)
Ответ на: комментарий от cdshines

Если ты до сих пор не понял, что я тебе говорю

ты говоришь о балбесах, кретинах, неосиляторах, троллинге, истерике и ЧСВ... и ничего - об истинном назначении конструкции refine.

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

Но почему ты снова придираешься к словам? Истинное назначение (лол) рефайн - ограничить область действия твоих писулек для того, чтобы не захламлять неймспейс, а не для того, чтобы делать «reopen module».

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

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

спасибо! Об этом я как то не подумал.

RA
() автор топика
Ответ на: комментарий от special-k

Ты что то не так понял

module RSSv09
module RSSv20
так надо, в коде сразу видно какой юзается протокол. И если протокол поменяется то унаследовать класс и переопределить методы отвечающие за работу протокола. Да создавать классы которые нужны для одной задачи, описывают одну сущность, не ужели нужно создавать классы комбайны? А что если если я пишу rss клиент и мне нужно использовать два протокола? После выполнения всех require я имею один модуль который может работать либо с одним протоколом либо с другим. Подскажи как правильно включить оба протокола?

Ответь зачем.

Ну как зачем, я вижу такую архитектуру: создается базовый класс в котором описывается сущность - class RSS, он может быть абстрактным, и на его основе реализовывается конкретная версия class RSS09, class RSS20...

Народ, может я не правильно понял ООП?

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

СпАсИбО, нЯшКа! Дни, когда хочется вводить в язык module_reopen - тоже.

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

не ужели

неужели.

Подскажи как правильно включить оба протокола?

RssClient.new protocol_version: 0.9

RSS09

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

Народ, может я не правильно понял ООП?
RSS09AsyncDomainRU

Определенно.

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

А есть возможность как в питоне проводить импорт? Что бы все что мы импортировали ложилось в какой нибудь namespace?

RA
() автор топика
Ответ на: комментарий от special-k

кстати, сделай grep в исходниках rss и обнаружь module rss10, module rss20, module rss09. Напиши разработчикам обязательно!

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

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

Ну или написать свою функцию импорта, причём где-то я уже такую видел.

theNamelessOne ★★★★★
()

В том же С#...

да, но это не C#, подсказывает нам Кэп, и тут не должно быть так же.

Зачем вообще нужен манки-патчинг?

Это ты ещё манки-патчинга не видел.

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