2016-12-16 10 views
4

코드 : 생성자 아래Java : 한 클래스 만 새 클래스를 사용하는 경우 리팩토링/디커플링에 사용합니까?

public class Name { 

private String[] name; 
private String first; 
private String middle; 
private String last; 
private String suffix; 


public Name (String fullName) { 
    //Name is parsed in constructor 
    parse1(); 
    parse2(); 
    parse3(); 
    //invoking more parse methods... 
} 

private void parse1() {} 
private void parse2() {} 
private void parse3() {} 
//more parse methods... 

그 방법은 fullName을 구문 분석하는 데 도움. 이 parse#() 메서드를 다른 클래스로 옮기고 싶습니다. 예를 들어 NameHelper.class을 만들고 거기에 모든 것을 넣으십시오. public static하지만 내 안에는 다른 클래스가 아니기 때문에 리팩터링에 쓸모가 없다고 말하면 Name이 사용하게 될 것입니다.

나중에 리팩터링하기를 원하기 때문에 이것은 단위 테스트에 정말로 어려울 것입니다. 하지만 난 항상 PowerMockito을 사용하여 비공개를 테스트 할 수 있기 때문에 테스트를 희생하거나 나쁜 코드 리팩토링을 희생하고 싶지 않습니다.

답변

2

항상 도움이되는 한 가지는 입니다.입니다. 이름은 무엇보다도 ... 이름입니다.

문자열을 구문 분석 할 때 이름이 필요하지 않은 것 같습니다. 반드시 이라는 이름이 있어야합니다. 실제로는 "도우미"또는 "서비스"기능과 관련이 있습니다.

그런 의미에서 추가 클래스를 보호 한 패키지를 만들고 그 안에 분석 코드를 옮기십시오.

그러나 기록을 위해 : 나는 이 아니고을 비공개로 만들어서 테스트를 위해 Powermock 해머로 돌려 놓습니다. 특히 정말 입/출력 기반의 코드입니다. 왜 처음부터 조롱해야할까요?

의미 : 이것은 문자열을 입력 한 것으로 보이며 그 결과 일부 Name 개체가 수신됩니다. 따라서 여러분의 단위 테스트는 몇 가지 테스트 입력 데이터를 가지고 있으며, NameParserService를 인스턴스화합니다. 올바른 출력이 있는지 확인하십시오. 그 어떤 종류의 조롱/스터핑도 필요 없습니다!

1

코드가 더 좋다고 느끼면 리팩터링하십시오. 다른 수업에 넣지 않을 이유가 없습니다. 그것은 또한 더 읽기 쉽게 만들 수 있습니다. 인스턴스 변수를 얻으 려하지 않으면 거기에이 메소드를 넣을 필요가 없습니다. 그것들을 보호하고 동일한 패키지 또는 기본 (패킷 - 개인) 액세스에 넣을 수 있습니다.