既存のメソッドを変更する既存のライブラリのモジュラー拡張を ruby で記述する最良の方法は何だろうか。コードの繰り返しを導入するべきではなく、オンデマンドでのみ使用する必要があります。
私が達成しようとしている特定のタスクは、標準に準拠していないサーバーNet::FTP
をサポートするために ruby のモジュールを拡張することです。このような拡張機能は、標準準拠のライブラリ 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
ただし、これには、コードを DRY に保つために、何らかの形でオリジナルNet::FTP#mkdir
をキャッシュする必要があります。Net::FTP#original_mkdir
これは可能ですか?このパッチ適用/拡張方法を改善する方法について、さらに提案はありますか? それとも、まったく異なるアプローチでさえありますか?