2014-09-12 1 views
1

이 자바 텍스트와 저자를 읽는 것은 꾸러미 org에 대해 생각해 보라고 권유한다. 클래스는 공개적으로 세상의 다른 사람들에게 열려 있어야한다. 내가 예를 생각할 수 없다, 그러나 - -자바 클래스 조직

내가 무엇을 필요하지 않은 것은 클라이언트 코드를 깨지 않고 나중에 물건을 변경할 수 있습니다 노출 비트 요점을 파악 생각 패키지의 말을 할 경우

은 몇 가지가 있습니다 엔터티 또는 클래스가 기능 집합을 제공하는 경우 - 공개 대면 클래스는 외부 세계와의 모든 의사 소통을 조율해야합니까?

모든 예제 또는 안내를 부탁드립니다.

+0

예. 왜냐하면'public' 클래스 만 외부 세계에서 볼 수 있기 때문입니다. – lxcky

+0

좋아 - 그래서 나는 다음과 같은 클래스 말할 수 구성하기를 원한다면 - 클래스 1 : "플랫폼"(MySQL은/​​SQL 서버/오라클) - 목록 플랫폼 클래스 2 : "데이터 저장소" - 클래스 - 3 : "오라클" - 생성 - updateByHostService - listAll -Class-4 : "세일즈 포스" - 생성 - updateByURL - listAll I 패키지에 모든이를 포장한다면, 추천 설계는 무엇인가 이 패키지의 공개 API는 무엇입니까? 그리고 왜? (나는 개별 클래스의 모든 메소드의 UNION을 공유하는 방법을 제공한다고 생각할 수 있습니다 .- 멋진 것은 아닙니다.) 감사합니다! –

답변

3

기본적으로 클라이언트 코드를 사용하지 않는 한 약정하지 않습니다. 메소드를 public으로 만들 때, 적어도 일부 컨텍스트에서는 클라이언트 코드를 조정하지 않고 메소드를 변경하지 않으려 고합니다.

메서드를 public으로 만들고 누군가가 사용한다고 가정합니다. 그런 다음 나중에 메서드를 변경해야한다는 것을 알게됩니다. 이제 두 가지 선택 사항이 있습니다.

  1. 변경하려는 클라이언트와 조정하십시오.
  2. 클라이언트를 중단하십시오.

가능한 경우 # 2를 피하십시오.

작은 시스템의 경우 # 1이 그리 중요하지 않을 수 있습니다. 그러나 코드에 따라 더 많은 클라이언트 코드가 있으므로 # 1은 실제로 문제가 될 수 있습니다. 어떤 이유 (일정, 사업상의 이유, 기술적 이유 등)에 관계없이 누군가는 귀하의 변화를 흡수 할 준비가되어 있지 않을 수 있습니다.

이러한 딜레마를 피하는 좋은 방법은 어떤 이유가있을 때까지 약정을 피하는 것입니다. 이것은 프로그래밍 외에서도 일반적으로 인생에서 할 수있는 현명한 일입니다. 그러나 프로그래밍에도 적용됩니다. 가시성 측면에서 공개 가시성보다 제한된 가시성을 선호하는 것을 의미합니다.

예. 내가 전자 상거래 주문 관리 라이브러리를 쓰고 있어요 말해, 나는 방법을 쓰기 모든 라이브러리의 세금 계산 라이브러리에 내부적으로 발생에도 불구하고

public double computeTax(double price) { ... } 

. 저는 세금 계산기를 세계와 공유하지 않는 것이 수치 스럽기 때문에이 방법을 공개합니다.

많은 사람들이이 방법이 훌륭하다는 데 동의하고이를 사용하는 앱을 만듭니다.

그러면 달러 금액을 나타 내기 위해 복식을 사용하는 것이 완전히 잘못되었음을 지적 할 수 있습니다 (부동 소수점 표현은 근사값 일뿐 돈으로는 좋지 않음). 나는 완전히 이전 방법 (근본적으로 뭔가를 잘못 사용하여 사람을 원하지 않는다), 그리고

public Currency computeTax(Currency price) { ... } 

로 교체하지만 지금은 클라이언트 코드의 무리를 깰거야 제거 할 것인지를 결정하는 원래 방법을 사용합니다.

도서관이 정말로 제공하고있는 것의 일부가 아니었기 때문에 내가 자기 세금 계산서를 지켰다면 더 좋을 것입니다. 이제 나는 딜레마에 빠지게된다.

+0

감사합니다. 위니 - 그건 말이 되네요.하지만 '로드 된'공용 '인터페이스'클래스를 만들지는 않습니까? –

+0

그것이 의미하는 바는 순전히 2 개의 클래스가있는 패키지가 있다고 가정 해 봅시다. 각 클래스는 각각 3 개의 메소드를 제공합니다. 그러면이 공용 클래스는 최악의 경우 6 개의 메소드를 제공합니까? 아니면 닫으시겠습니까? 한 클래스의 일부 메소드가 다른 클래스의 일부를 소비하는 경우? –

+1

코드에서 예제를보아야 할 수도 있습니다. 질문에 추가 할 수 있습니다. –

0

다음은 내가 주로 따르는 원리입니다. 클래스 나 메서드 또는 심지어 매개 변수까지 가시성을 최대한 낮추도록합니다. Facade 패턴은 클래스의 집단 기능을 폭로하는 좋은 방법입니다. 다른 좋은 방법은 public API에 대한 매개 변수 유형으로 객체를 사용하고 내부적으로 원하는 유형으로 변환하는 것입니다. 이렇게하면 잠재적 인 코드 분할을 피할 수 있습니다.