Интересно, что лучший способ написать модульное расширение существующей библиотеки в рубине, которое изменяет существующие методы. Он не должен вводить повторение кода и должен использоваться только по требованию.Что такое DRYest способ расширения/исправления библиотеки в рубине?
Конкретная задача, которую я пытаюсь выполнить, заключается в расширении модуля ruby Net::FTP
для поддержки некоторых not so standards compliant servers. Такое расширение должно быть полностью отделено от библиотеки, соответствующей стандартам IMHO.
Я думал, что дополнительный файл будет довольно приятным, так как это даже не представляет необходимости для какого-то переключателя в исходном коде. Таким образом, дополнительный require 'net/ftp/forgiving'
сделает оригинальную библиотеку немного более прощающей относительно наших менее одаренных реселлеров FTP-сервера.
Соответствующий файл может затем использовать открытый класс и модульную архитектуру ruby для исправления класса FTP. Для фиксации примера причудливого поведения, связанного выше, мне нужно будет исправить Net::FTP#mkdir
. который будет выглядеть следующим образом:
#content of net/ftp/forgiving
require 'net/ftp'
module Net
class FTP
# mkdir that will accept a '250 Directory created' as a valid response
def mkdir(dirname)
begin
original_mkdir(dirname)
rescue FTPReplyError => e
raise unless e.message.start_with? '250 Directory created'
return ""
end
end
end
end
Однако это потребовало бы, чтобы как-то кэшировать прочь оригинальный Net::FTP#mkdir
, как Net::FTP#original_mkdir
сохранить код DRY. Это возможно? Есть ли у вас дополнительные предложения по улучшению этого метода исправления/расширения? Или, может быть, даже совершенно разные подходы?
Да, подкласс, когда * возможно *, monkeypatch когда *необходимо*. – tadman
@tadman: Не мог бы сформулировать это лучше (а на самом деле нет). Разум, что я процитировал вас? –
Я уверен, что это было сказано раньше, но обязательно! – tadman