이것은 일반적인 패턴/모범 사례 질문입니다. 저는 C#을 사용하고 있지만 자바와 다른 환경에도 똑같이 적용될 수 있다고 생각합니다. 라이브러리가 좀더 서비스 지향적 인 클래스와 손 잡고 사용되는 빌더 클래스를 노출하는 것은 매우 일반적입니다.빌더 메소드와 서비스 메소드 결합 - 나쁜 습관?
var users = db.Select("*").From("Users").ExecQuery<User>();
: 관심을 가질 그것은 단지 하나의 객체로 더 유창, 검색 가능한 API로 다음을 결합하는 유혹 라이브러리 개발자
var sql = SQLBuilder.Select("*").From("Users");
var users = db.ExecQuery<User>(sql);
:이 작업을 수행 할 수있는 가상 ORM을 가지고 차이점은 API 표면에 있습니다. 후드 아래에서 우리는 여전히 적절한 관심을 가지고 여러 클래스를 가질 수 있습니다.
두 번째 접근법의 잠재적 단점 중 하나는 테스트 가능성입니다. 첫 번째 방법에서는 서비스 객체를 스텁링하는 것이 훨씬 쉽습니다. 하지만 라이브러리 개발자가 앱 시작 또는 테스트 설정에서 구성 할 수있는 정적 인 TestMode
속성을 노출하여 서비스를 호출하고 서비스 호출을 기록/변조해야한다고 알리는 경우 어떻게해야할까요?
테스트 가능성 이외의 순수한 관점에서 보면 두 번째 접근 방식에는 "잘못된"것이 있습니까? 저는 실제로 작업하고있는 몇 개의 라이브러리에서 이것을 수행 할 것인지에 대해 논쟁 중입니다. 그리고 주요한 붉은 깃발은 첫 번째 접근법이 훨씬 더 보편적 인 것처럼 보입니다.
도서관 소비자의 관점에서의 테스트 가능성은 약간 어려울 것이라고 생각하십니까? 첫 번째 접근법에서는 db를 완전히 스텁링 할 수 있습니다. 하지만 두 번째 접근법에서는 최소한 빌더 메소드가 널이 아닌 값을 반환하도록 모의 설치 작업을 조금 더 수행해야 할 것입니다. 얼마나 지루한가는 조롱하는 프레임 워크에 달려 있다고 생각됩니다. (만약 당신이 Moq을 사용한다면,'SetReturnsDefault'가 유용 할 수 있습니다.) –
그건 그렇고, 자신감의 표를 얻는 것에 감사드립니다. 접근법 2로 나아가는 것에 대해 기분이 나아졌습니다. –
나는 단순한 사실 때문에 그렇게 생각하지 않습니다. 처음에 _your_ 코드를 테스트해서는 안됩니다. 또한 DB를 조롱해야한다고 생각하지 않습니다. 저장소를 조롱해야합니다. 하지만 이것은 지속성을 다룰 때 구체적이지만, 전체적으로 유창한 작성기 패턴에 적용된다고 생각하지 않습니다. 따라서 컨텍스트에 따라 다릅니다. D – MikeSW