밀접하게 결합된 수업:내 상황에 더 나은 디자인은 무엇입니까
-
12-11-2019 - |
문제
내 상황에서 더 나은 해결책은 무엇입니까? 클래스가 서로 많이 결합되지 않도록 디자인하는 방법은 무엇입니까?
일부 기능을 제공하는 라이브러리(API)가 있습니다(예: FX 가격 스트리밍 구독). subscribe
방법).API에 원하는 가격을 알려주는 API 클라이언트가 있습니다.API는 일부 인터페이스로 피드백을 제공합니다(예: SubscriptionStatus
) 메소드 포함 SubscribeSuccess(Subscription) and SubscribeFailed(Subscription)
.API 클라이언트에는 활성 구독 목록이 있습니다(List<Subscription> activeSubscriptions
).그리고 API 클라이언트가 구독 성공 시에만 반응하기를 원합니다(목록에 구독을 추가하기만 하면 됩니다).다른 경우에는 로그에 메시지를 인쇄하면 됩니다.구독 리스너와 API 클라이언트 간의 관계를 구성하는 가장 좋은 방법은 무엇입니까?옵션은 다음과 같습니다.
- 호출할 수 있도록 API 클라이언트 인스턴스를 구독 리스너에 전달합니다.
apiClient.addSubscription(subscription)
- API 클라이언트 구현 구현
SubscriptionStatus
해당 이벤트를 인터페이스하고 관리합니다(내부적으로 실패, 성공:activeSubscriptions.add(구독)).대조:다양한 유형의 작업이 있으며 모든 작업에는 자체 리스너가 있습니다.그래서 Api Client는 정말 큰 클래스가 될 것입니다. - 하나의 메소드로 자체 인터페이스 정의
SubscriptionSuccess(subscription)
API 클라이언트가 이를 구현하도록 하시겠습니까? - 당신의 선택은 무엇입니까?
주제에 대한 어떤 생각이라도 환영합니다!
감사해요!
해결책
나는 캐치와 함께 옵션 2로 갈 것입니다.만약 SubscriptionStatus
인터페이스는 정말 정말 크고 일부 클라이언트는 그 중 일부만 구현하기를 원하며 기본 빈 슈퍼클래스를 제공하고 클라이언트가 이를 확장하도록 할 수 있습니다. abstract
강제로 시키려고)
다음과 같은 것 BaseSubscriptionStatus
모든 메서드에 대해 빈 구현이 있고 사용자가 원하는 메서드를 재정의할 수 있습니다.또 다른 옵션은
throw UnsupportedOperationException("This method is not supported by your implementation of SubscriptionStatus. Please override it");
빈 구현 대신 각 기본 메소드에 대해.
물론, 당신은 유지할 수 있습니다 SubscriptionStatus
적절한 종속성 주입 및 테스트 가능성을 위한 인터페이스 BaseSubscriptionStatus
그것을 구현하십시오.
다른 팁
나는 옵션 2로 갈 것입니다.이는 끝이 가장 유연성을 사용하고 상황에서 더 효과적으로 스트리밍의 문제에 대응할 수있게합니다.