2016-09-01 10 views
0

私は、サーバ上に存在するファイルに対していくつかのファイル操作を行うメソッドを記述しようとしています。たとえば、ソースからターゲットへのコピー、ファイルのシンボリックリンク、ファイルの読み込みなどです。ここでは、2つのシナリオ、つまりサーバーをローカルまたはリモートにする必要があります。リモート/ローカルサーバーのファイル操作メソッドをRubyでより効率的に書く方法

リモートサーバーのシナリオでは、(net/sshを使用して)サーバーに接続してから、execメソッドを使用してシェルコマンドを実行しています。ローカルサーバーでは、私はRuby FileUtilsメソッドを使用している接続を確立する必要はないので。あなたの参照のためにコードの部分を貼り付けました。

誰かがこの方法をより効率的に書くよう提案できるかどうかを確認したいと考えました。

def create_link 
begin 
    if self.particular_file_exists? 
    if [email protected] 
     @ssh.exec!("ln -s file1 file1-dump") 
    else 
     FileUtils.ln_sf("file1", "file1-dump") 
    end 
    end 
    rescue => e 
    $LOG.log(2, "Error occurred") 
    end 
end 
+0

尋ねるべきで、それはあなたに非効率的なように見えるのでしょうか?あなたはそれをプロファイリングしましたか? – Makoto

+0

ダブルネガティブな条件を避けるようにしてください。ここで 'else'は* if-not-not-sshがローカル*であるかどうかを評価します。 2つの線を折り返して、ネガを取り除くと、よりクリーンなものになります。 'unless!@ ssh.not_remote? 'のようなコードが出る前にこれに注意する価値があります。そして、あなたはそれが何を意味するのか理解できません。 – tadman

+0

これは、2つの異なるハンドラクラスによって実装された標準インタフェースを持つと、動作全体を簡単に切り替えることができる場合もあります。同じ問題を解決するための2つの異なるアプローチがある場合は、 'if'ステートメントではなく、サブクラスを使用してください。 – tadman

答えて

1

だけで簡単に編集:

def create_link 
    return unless self.particular_file_exists? 
    if @ssh.local 
    FileUtils.ln_sf "file1", "file1-dump" 
    else 
    @ssh.exec! "ln -s file1 file1-dump" 
    end 
rescue 
    $LOG.warn "Error occurred" 
end 

深いアイデアのためにあなたは何このコードについてhttps://codereview.stackexchange.com/

2

私は、パフォーマンスの最適化について言うが、ここで私は、拡張/より保守コードと思われるものですができません。あなたは、すべての罪深い方法でそれらのローカル/リモート支店のすべてを必要としません。代わりに、環境固有の動作を独自のオブジェクトに抽出し、それらに作業を委任します。このような何か:

class FileManipulator 
    attr_reader :handler 

    def initialize(ssh) 
    @handler = ssh? RemoteHandler.new(ssh) : LocalHandler.new 
    end 

    def create_link 
    handler.create_link if handler.particular_file_exists? 
    rescue => e 
    $LOG.log(2, "Error occurred") 
    end 

    RemoteHandler = Struct.new(:ssh) do 
    def create_link 
     ssh.exec!("ln -s file1 file1-dump") 
    end 
    end 

    LocalHandler = Struct.new do 
    def create_link 
     FileUtils.ln_sf("file1", "file1-dump") 
    end 
    end 
end 
+0

'if'を使って終わったとき、2つのブランチは1行だけ離れていました。今は5行離れており、距離も増えることがあります。このアプローチは決してコードを読みやすくしません。 – Nakilon

+0

@Nakilon:5種類のハンドラを想像し、それぞれの方法は3-10行です。問題のように、これらの実装をすべてまとめておくことは、SRPの大規模な違反です。あなたはすぐに森で迷子になるでしょう。 –

+0

5ではなく10個のメソッドを想像してください。少なくとも25%以上のコード行があります。これは主に 'def'、' do'、 'end'のような文法定型文です。 – Nakilon

関連する問題