2011-07-27 4 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); 
       } 
      } 
     } 
    } 
} 

문제는 우리의 시스템이 (가 오류를보고하지만 모든 작업을 계속해야한다 그냥 컴파일러의 하나처럼 작동 오류 로깅 메커니즘을 가지고 당신이 프로그램을 컴파일 할 때., 그것은하지 않습니다 처음 오류가 발생할 때 컴파일 프로세스를 중지하십시오.)

나는이 오류보고 일에 대해 내 IO 클래스를 알지 못하게하고 싶습니다. 그래서 제 생각은 IO 메서드에서 예외를 던져서 m() 오류 잡기와 나머지 오류 처리를하는 것이 었습니다. 문제는 IOExceptionSecurityException 둘 다 파일의 이름이 무엇인지 알려주지 않는다는 것입니다.

나는 내 자신의 예외를 만들 수 있지만, 내가 그런 간단한 것들에 대한 내 자신의 예외를 만들기 시작한다면, 나머지 코드에 대해서도 수백 가지 예외를 만들어야 할 것입니다!

리팩토링을 가능한 한 간단하게 유지하고 싶습니다.

리팩토링을 어떻게 처리 하시겠습니까?

+0

_ _ 자바 _? 나 늙은 거 같아 . . . –

답변

3

분명히 할 일은 치명적이지 않은 오류 로깅을 허용하는 오류 처리를 디자인하고 구현하는 것입니다.

필자는 컴파일러와 마찬가지로 발생하는 오류 목록이있는 클래스를 만드는 것이 좋습니다. 입출력에 문제가 발생하면 오류 클래스에 전달되어 오류 목록에 표시되며 이후 처리를 위해 반환됩니다.

이렇게하면 오류가 발생할 수있는 각 장소에서 오류를 처리하거나 나중에 저장하고 처리하기 위해 오류 로거에 제공하는 모든 특정 시점에서 오류를 복구하지 못합니다.

이 오류 로거를 사용하면 리팩터링을 쉽게 수행 할 수 있습니다.

1

다음 사항을 확인해 드리겠습니다.

  • 단일 책임

  • 방법에서 null을 반환하지 마십시오
  • ;

  • 간단하고 작은 방법을 계속 빈 개체/컬렉션을 반환

  • 만 호출자에게 메소드 서명에

  • 던져 예외를보다 2-3 인수를 전달하지 마십시오

  • ; 그것의 의미가 있다면. 그렇지 않으면 여기에서만 처리하십시오.

리팩토링은 아무튼; t는 하나의 큰에서 작은 방법을 만드는 의미, 우리는 일을 확인해야합니다. 그리고 여전히 우리의 디자인 구조에 따라 더 많은 것들이 있습니다.

+0

답변을 읽었을 때 궁금합니다. null 대신 null을 반환하는 것이 좋습니다. – karla

+0

빈 객체에 대한 요점은 있지만 컴파일러 디자인에서는 해시 테이블의 데이터를 항상 처리하므로 아무 것도없는 경우 null을 반환하므로 실제로하는 것이 유용합니다. –

+0

null을 리턴하면 널 포인터를 검사하기 위해 호출하는 메소드 코드에 부담이 쌓일 것이기 때문이다. 주로 컬렉션과 함께. – Parth

관련 문제