и в процессе чтения до меня доходит что модуль был переоткрыт и сейчас расширяется!
У меня вопрос: зачем так делать? Почему бы просто не использовать наследование? Зачем вообще нужен манки-патчинг? Код становится на порядок запутанее. В том же С# для определения класса в разных файлах используется ключевое слово partial, ага значит определение может быть где то еще.
В том же С# для определения класса в разных файлах используется ключевое слово partial, ага значит определение может быть где то еще.
ключевое отличие в том что C# как и java рассчитана на толпу обезьянокодеров работающих за еду. Там все сделано чтобы не оставить команду без ног - т.е. писать можно как угодно и это мало повлияет на остальной код (и по этому на java я и пишу)
руби и прочее это для «хакеров» (не тех которые «какиры») там можно все, чем народ и пользуется
если используется только последний то переписать базовый до вида последнего. Если все используются то да, классов столько сколько сущностей. Вот почему бы не ввести ключевое слово reopen? например
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:
Это ты, балбес, просто запутался в двух строчках и решил спасти человечество, заменив 2 привычных строчки на одну новую. А человечество-то в этом и не нуждается. Ты бы еще предложил вместо простого деланья манки-патчинга обрамлять все это в MONKEY_PATCH_START ... MONKEY_PATCH_END
Это ты, балбес, просто запутался в двух строчках и решил спасти человечество, заменив 2 привычных строчки на одну новую. А человечество-то в этом и не нуждается.
Без разницы, для чего оно было призвано. Это как раз конструкция MONKEY_PATCH_START ... MONKEY_PATCH_END - та самая, которая не нужна миру... если воспринимать тебя всерьез.
при чем тут 2 строчки? Открыл файл с определением класса, прочитал, все понятно. В коде натыкаешься на метод которого нет в определение класса, твои действия? grep? Ты лучше скажи что трудного в наследование что ты применяешь манки?
MONKEY_PATCH_START
самый мягкий вариант о котором я думал, хочешь безосновательно юзать манки? Набери вручную 256hash
Вообще-то разница есть.Из того, что эта конструкция есть, не следует делать вывод о том, что она была введена в язык для того, чтобы на лоре было меньше истерик неосиляторов.
Из того, что эта конструкция есть, не следует делать вывод о том, что она была введена в язык для того, чтобы на лоре было меньше истерик неосиляторов.
*пожимая плечами* Еще раз - неважно, для чего именно она была внесена. Это тот самый... ну ты понел.
эм, я тоже могу пожимать плечами, а по делу сказать есть что? Это как утверждать, что если моль есть одежду, то одежда была создана потому, что моли было нечего есть.
В том же С# для определения класса в разных файлах используется ключевое слово partial, ага значит определение может быть где то еще.
Partial используется только чтобы разделить код, который генерируется кодогенератором (например, дизайнером интерфейсов) и код, написанный человеком руками, просто, потому что кодогеннератор затирает изменения, внесенные руками. Использования паршиала в других случаях - это руки-крюки.
С наследованием проблема в том, что мало кому хочется использовать нестандартный класс всего лишь ради пары плюшек. Например, потому что теряешь литералы. Вместо s = «string» начинаются жавизмы s = MySuperString(«string»). Те же рельсы выглядели бы беспощадно ынтырпрайзно без открытых классов. Понятно, что с манкипатчингом нужно аккуратнее: могут быть конфликты имён, да и вообще возникает сильная зависимость от вменяемости автора библиотеки. Тут как всегда рулит здравый смысл, а кому нужна огороженность - велкам ту жаба.
Наследование, в данном случае - говно. И что ты будешь делать.. тестить 150 классов с одним и тем же функционалом? Создавать классы, которые нужны для одной задачи?
зачем так делать?
Потому что мы можем.
Код становится на порядок запутанее.
В проекте, в одном месте, ты расширяешь класс (причем, ты можешь это сделать инклудом модуля(ей) и это будет очень наглядно, а главное, _переносимо_). В последствии ты _легко_ сможешь применить конструкции в другом проекте, ведь классы не различаются по имени.
наследование
Ответь зачем.
На самом деле ты делаешь именно то, что сейчас нужно - расширяешь библиотеку. Через наследование ты показываешь общность объектов. У тебя здесь нет общности объектов. Ты просто желаешь наклепать непереносимый код.
Но почему ты снова придираешься к словам? Истинное назначение (лол) рефайн - ограничить область действия твоих писулек для того, чтобы не захламлять неймспейс, а не для того, чтобы делать «reopen module».
А может, и для того, да только вот обычно рефайнменты распространяются на весь проект.
так надо, в коде сразу видно какой юзается протокол. И если протокол поменяется то унаследовать класс и переопределить методы отвечающие за работу протокола. Да создавать классы которые нужны для одной задачи, описывают одну сущность, не ужели нужно создавать классы комбайны? А что если если я пишу rss клиент и мне нужно использовать два протокола? После выполнения всех require я имею один модуль который может работать либо с одним протоколом либо с другим. Подскажи как правильно включить оба протокола?
Ответь зачем.
Ну как зачем, я вижу такую архитектуру: создается базовый класс в котором описывается сущность - class RSS, он может быть абстрактным, и на его основе реализовывается конкретная версия class RSS09, class RSS20...