몇 달 전에 나는 새로운 프로젝트에서 일하기 시작했으며 코드를 통과 할 때 사용되는 정적 메소드의 양을 획기적으로 나타냅니다. 와 같은 유틸리티 메소드 collectionToCsvString(Collection<E> elements)
뿐만 아니라 많은 비즈니스 로직이 유지됩니다.
내가이 이론적 근거에 책임이있는 사람에게 물었을 때, 그는 그것이 봄의 폭정에서 벗어나는 방법이라고 말했다 . 이 사고 과정과 관련이 있습니다. 고객 영수증 생성 방법을 구현하기 위해 서비스를 가질 수 있습니다.
@Service
public class CustomerReceiptCreationService {
public CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
이제 그는 기본적으로 클라이언트 클래스가 Spring Bean 자체이어야한다는 제한을 부과하기 때문에 Spring이 불필요하게 클래스를 관리하는 것을 싫어한다고 말했다. 우리는 Spring에 의해 모든 것을 관리하게되는데, 결국 절차없는 방식으로 stateless 객체로 작업하게됩니다. https://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html에 명시된 내용
위 코드 대신에 그는
public class CustomerReceiptCreator {
public static CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
가능한 경우 Spring이 클래스를 관리하는 것을 피할 수 있다고 주장 할 수는 있지만 모든 것이 정적 인 것의 이점은 보이지 않습니다. 이러한 정적 메소드는 상태 비 저장이므로 OO도 아닙니다. 나는 무언가에 더 편안하게 느낄 것입니다
new CustomerReceiptCreator().createReceipt()
그는 정적 메소드에는 추가적인 이점이 있다고 주장합니다. 즉:
- 더 쉽게 읽을 수 있습니다. 정적 메서드를 가져 오면 클래스가 수행하는 작업이 아니라 작업 만 신경 써야합니다.
- 분명히 DB 호출이없는 메소드이므로 성능면에서 저렴합니다. 잠재적 인 고객이 코드에 들어가서 확인해야하도록 명확하게하는 것이 좋습니다.
- 테스트를보다 쉽게 작성할 수 있습니다.
그러나 나는 이것에 완전히 맞지 않는 것이 있다고 생각하므로 이에 대한 노련한 개발자의 생각을 듣고 싶습니다.
제 질문은 이런 프로그래밍 방식의 잠재적 인 함정은 무엇입니까?
static
위에서 설명되는 방법은 그냥 평범한 공장 방법이다. 팩토리 메소드를 정적으로 만드는 것은 여러 가지 강력한 이유로 일반적으로 수용되는 규칙입니다. 공장 방법이 적절한 지 여부는 다른 문제입니다.