2011-07-27 9 views
0

私はこの異なるSomeClassのリファクタリングを試みていました。上記のメソッドは、このクラスをトリミングするのに適しているようでしたので、IO固有のクラスに入れることを考えました(必要に応じて、簡単にモックを許可する)。いくつかのレガシーコードのリファクタリングに関する問題

class SomeClass{ 

    ... 

    public void m() { 
     ... 
     emptyDirectory(something); 
     ... 
    } 

    private void emptyDirectory(File dir) { 
     File[] dirContent = dir.listFiles(); 

     if (dirContent != null) 
      for (File f : dirContent) { 
       if (f.isDirectory()) 
        emptyDirectory(f); 

       try { 
        if (!f.delete()) { 
         IOError problem = new IOError(symbolTable.getRefinement().getFileName(), 
           f.toString(), f.isDirectory()); 

         problemManager.add(problem); 
        } 
       } catch (SecurityException e) { 
         IOError problem = new IOError(symbolTable.getRefinement().getFileName(), 
          f.toString(), f.isDirectory()); 

        problemManager.add(problem); 
       } 
      } 
     } 
    } 
} 

問題は、我々のシステムは、単にコンパイラの1(それがエラーを報告しますが、すべてがその作業を継続すべきであると同じように動作エラーロギングメカニズムを持っているということです。あなたがプログラムをコンパイルしようとすると、それはしません最初にエラーが発生したときにコンパイルプロセスを停止します)。

私はIOメソッドから例外をスローし、それをキャッチしてエラー処理の残りの作業をしていたので、このエラー報告のことについてIOクラスに無関心にしたいと思っています。問題は、IOExceptionSecurityExceptionの両方が、ファイルの名前が何であるか教えてくれないことです。

私は自分自身の例外を作成することができますが、私がこのような単純なもののために自分自身の例外を作成し始めると、残りのコードに対して数百もの例外を作成する必要があります。

リファクタリングをできるだけシンプルに保ちたいと思います。

リファクタリングをどのように扱いますか?

+0

_Java_?老いを感じる 。 。 。 –

答えて

3

最初に行うことは、致命的ではないエラーロギングを可能にするエラー処理の設計と実装です。

私は、(コンパイラのように)遭遇したエラーのリストを持つクラスを作成することをお勧めします。 I/Oが問題に遭遇すると、それはエラークラスに渡され、エラークラスでエラークラスをポップし、それ以降の処理のために戻ります。

このようにして、エラーを発生させる可能性がある各場所でエラーを処理したり、エラーログを保存して後で処理したりする責任があります。

このエラーログを手元に置くと、リファクタリングが簡単に行えます。

1

以下の点を確認します。

  • シングル責任

  • メソッドからnullを返しません。
  • がシンプルで小型な方法を保つ空のオブジェクト/コレクション返す

  • のみ、呼び出し元にメソッドのシグネチャに

  • スロー例外を超える2-3引数を渡さないでください

  • 。それが意味を持つならば。 それ以外の場合は、ここでのみ処理してください。

リファクタリングは、大きなメソッドから小さなメソッドを作成することを意味します。このようなことを確認する必要があります。デザインの構造によってはさらに多くのものがあります。

+0

私はあなたの答えを読んで、私は疑問に思っています - なぜnullの代わりにオブジェクトを返すことをお勧めしますか? – karla

+0

私は空のオブジェクトについてあなたの意見を得ていますが、コンパイラの設計では、何も持たない場合はnullを返すハッシュテーブルのデータを常に扱っているため、実際に行うのは便利です。 –

+0

ヌルを返すので、ヌルポインタをチェックするためにメソッドコードの呼び出しに負担がかかります。主に、コレクションで。 – Parth

関連する問題