1

우리 팀은 추가 유지 관리 및 개발을위한 기존 시스템을 제공 받았습니다. 이것이 사실 "유산"일 뿐이므로 정말 적은 수의 테스트가 있으며 그 중 대부분은 쓰레기입니다. 이것은 웹 인터페이스가있는 응용 프로그램이므로 컨테이너 관리 구성 요소뿐만 아니라 원할 때 언제 어디서나 "새롭게"수정되는 일반 Java 클래스 (모든 프레임 워크 등에 연결되지 않음)가 있습니다.대형 시스템에서 기존 자료를 단계별로 복구하는 방법은 무엇입니까?

우리가이 시스템에서 작업 할 때마다 우리는 주어진 부분을 만질 때마다 그 모든 것을 더 작은 조각으로 분해하고 의존성을 발견하고 리팩터링하며, 의존성을 코드에서 끌어 오지 않고 푸시하려고합니다.

제 질문은 그러한 시스템을 사용하여 의존성을 없애고 더 많은 코드를 테스트 할 수있는 방법입니다. 언제 그만하고 어떻게 처리해야합니까?

내가 당신에게 예를 보여 드리죠 :

public class BillingSettingsAction { 

    private TelSystemConfigurator configurator; 
    private OperatorIdDao dao; 

    public BillingSettingsAction(String zoneId) { 
     configurator = TelSystemConfiguratorFactory.instance().getConfigurator(zoneId); 
     dao = IdDaoFactory.getDao(); 
     ... 
    } 

    // methods using configurator and dao 
} 

이 생성자는 확실히 너무 많이한다.

public BillingSettingsAction(String zone, TelSystemConfigurator configurator, OperatorIdDao dao) { 
    this.configurator = configurator; 
    this.dao = dao; 
    this.zone = zone; 
} 

또는 전용 종속성 세터와 생성자 설정 영역을 제공 : 또한 내가 할 줄 것은으로 변경하는 것입니다 더 나아가 등 PowerMock와 함께 마술을하고 필요 리팩토링이를 테스트합니다.

내가보기에 문제는 내가 생성자에서 의존성을 제공한다면, 나는 여전히 그들을 어딘가에 제공 할 필요가 있다는 것이다. 그래서 문제를 한 단계 위로 움직이는 것입니다. 모든 종속성을 연결하기 위해 공장을 만들 수 있지만 앱의 다른 부분을 만지면 각기 다른 공장을 갖게됩니다. 분명히 모든 앱을 한 번에 리팩터링 할 수 없으며 예를 들어 거기에 봄.

(아마도 기본 구현이 제공된 상태에서) 세터를 드러내는 것은 비슷합니다. 또한 테스트 용 코드 만 추가하는 것과 같습니다.

내 질문에 어떻게 대처합니까? 한 번에 작업을 수행하지 않고도 객체 간의 종속성을보다 잘 읽고 더 쉽게 테스트 할 수 있습니까?

답변

2

소년 스카우트 규칙과 같은 규칙을 설정하려고합니다. 파일을 터치 할 때 구현할 항목을 구현하는 것 외에는 조금 개선해야합니다. 위해

는 기능 작업 2 시간 동안 우리는 정리 1 시간을 허용처럼 당신이

  • 은 개선을 위해 고정 된 시간 예산에 동의 할 수있는 지원합니다.

  • 시간 경과에 따른 개선을 보여주는 메트릭스가 있습니다. 종종 평균 파일 크기 및 테스트 커버리지와 같은 간단한 것들이 충분합니다.

  • 이미 작업 중이거나 선호하는 작업에 대한 "TelSystemConfiguratorFactory 제거"트랙과 같이 더 큰 항목에 대해 최소한 변경하려는 사항의 목록이 있어야합니다 이미 새로운 것을 시작한 것들을 작업합니다.

어쨌든 경영진이 귀하의 접근 방식에 동의하는지 확인하십시오.

기술적 측면 : 보여 준 접근 방식이 좋습니다. 많은 경우에 모든 종속성을 제공하지만 매개 변수가있는 새 생성자를 통해 두 번째 생성자를 고려할 것입니다.추가 생성자가 사용되지 않게 만듭니다. 해당 클래스의 클라이언트를 터치하면 새 생성자가 사용됩니다.

스프링 (또는 다른 DI 프레임 워크)을 사용하는 경우 스프링을 통해 실제로 인스턴스를 생성하고 모든 종속성을 주입하기 전에 정적 팩토리에 대한 호출을 중간 단계로 가져 오는 것으로 시작할 수 있습니다.

+0

예. 그것이 우리가 어떤 경우에 시작한 것입니다. 괜찮아 보이는데, 다른 사람들도이 방법을 선택하게되어 기쁩니다. 여기에 귀하의 의견을 보내 주셔서 감사합니다. – grafthez

3

저는 방금 Michael Feathers의 "기존 코드로 효과적으로 작업하기"를 읽기 시작했습니다. 이 책은 기본적으로 매우 질문에 대한 답변입니다. 레거시 시스템을 점차적으로 가져 와서 코드 기반을 점진적으로 향상시키는 매우 효과적인 "너겟 (nuggets)"및 기법을 제시합니다.

내비게이션은 약간의 혼란을 줄 수 있습니다. 도서가 특정 기술을 가리켜 거의 1 페이지부터 참조하기 때문에 혼란 스럽지만 그 내용은 지금까지 매우 유용합니다.

나는 작가와 비슷한 사람이 아니며, 비슷한 상황에 직면하고 있으며 매우 흥미로운 자료입니다.

HTH

+0

나는 그 책을 알고 정말로 그것을 고맙게 생각한다. 엄청난 지식과 기술이 필요합니다. 그러나 내가 필요로하는 것은 다른 혼란에 빠지지 않고 단계적 개선 (그 관행을 사용함으로써)을 한 방법으로하지 않는 방법을 찾는 것입니다. – grafthez