2012-12-11 2 views
2

집계 및 구성의 다양한 측면을 이해하려고하는 책을 읽었습니다. 집계가 느슨한 결합을 향상시킬 수 있지만 캡슐화를 손상시킬 수 있다고 생각했던 지점을 발견했습니다.집계가 캡슐화를 깨기

느슨한 커플 링을 향상시킵니다. 엔진 클래스의 구현 위에서

public class Car{ 
    private Engine engine; 
    Car(Engine e){ 
     this.engine=e; 
    } 
} 

생성과 창조의 시간에 자동차 객체에 기선을 제압 당했지만, 엔진 인스턴스가 차없이 살 수 있기 때문에 그것은 통합의 완벽한 예입니다 수 있습니다. (이 예제는 위대한 현실 세계의 예가 아닐지도 모른다. 그러나 내 생각에 나는 내 생각을했다.)

이제 클라이언트 코드는 Engine 객체에 대한 완전한 제어권을 가지므로 엔진 객체의 몇 가지 상태를 Car로 전달할 수있다 , Car의 구현은 객체 또는 상태 (엔진)가 더 이상 자동차에 올바른 무결성을 가지고 있지 않기 때문에 캡슐화를 중단합니다.

내 이해가 맞습니까?

+0

그것은 종류의 캡슐화에 따라 당신이 원하는 해달라고을 깰 수 혹시 객체를 조작하기보다는 객체의 상태를 변경하십시오. engine.setOn (boolean) 대신 엔진을 사용하면 engine.turnOn()을 사용할 수 있습니다. 자동차를 엔진에서 작동 할 수있게하려면 생성자는 객체를 복제하여 액세스를 제한합니다. this.engine = (Engine) e.clone(); 자동차의 다른 작업은 removeEngine 일 수 있습니다. 그러면 엔진에 액세스 할 수 있지만 차에는 더 이상 액세스 할 수 없습니다 .. – BevynQ

+1

IMO, I 클라이언트가 Engine 객체를 제어 할 수 있다고 생각하지 마십시오. 더 높은 수준의 클래스가 있다고 생각합니다. 정확한 Engine 객체를 만들고이를 특정 Car 객체의 엔진으로 설정하는 Manufacturer를 호출했습니다. –

+0

그가 말하는 것은 자동차를 만드는 과정에서 엔진에 대한 참조가 있어야한다는 것입니다. – BevynQ

답변

1

Engine은 변경할 수있는 경우에만 Car으로, 즉 자동차가 엔진의 상태를 변경할 수 있습니다. 그러나 불변 클래스 Engine (상태를 변경하지 않는 상태 및 비즈니스 메서드에 액세스하는 데 필요한 getter 만 있음)을 정의하거나 EngineImpl 클래스로 구현되는 Engine 인터페이스를 만들 수 있습니다. EngineImpl은 변경할 수 없습니다. 상태를 변경할 수있는 기능이 포함되어 있습니다. 그러나 클라이언트에게 "불변"메서드 만 노출하는 인터페이스 Engine을 구현합니다. 따라서 차는 EngineImpl의 상태를 읽기 전용 인터페이스 Engine 뒤에 숨길 수 없습니다. 이 경우 캡슐화가 손상되지 않습니다.

당신이 맞다 : 이것은 실제 예제 아니라고 : 실제 드라이버에서 자신의 차에 의해 제공되는 인터페이스를 통해 엔진 제어하고 엔진 :(

+0

동의 함, +1. 단지 한 가지 의심, 매우 사소한 것, 변경 가능한 구현은 자동차가 아닌 엔진을 손상시킬 것입니다, 그렇습니까? –

1

여기서 느슨한 커플 링은 Car & Engine 사이의 관계를 목표로합니다.

자동차가 생성자를 통해 엔진을 수령하지만 차는 게터 방식으로 엔진을 노출시키지 않습니다.

이 생성자는 적절한 액세스 제어/레벨을 가져야하며 자동차와 엔진을 통합 처리하는 공장 또는 기타 창조적 인 패턴으로 사용해야합니다.

자동차의 클라이언트가 엔진에 액세스 할 수있게하려면 Car의 인터페이스를 사용해야합니다.

+0

내 생각에 너는 그걸 놓쳐 버린 것 같아. 엔진 e = new EngineImpl(); 자동차 c = 신차 (e); e.setSomethingOnEngine(); // 자동차 동작이 깨질 수 있습니다. –

+0

e.setSomethingOnEngine()은 일반적으로 공장 또는 개발 패턴으로 수행되지 않습니다. 어쩌면 빌더가 엔진을 만들 수도 있지만 엔진을 생성하고 엔진을 자동차에 주입 한 후에는 엔진을 변경하지 않습니다. 그럴 경우 창조 패턴 코드가 원칙을 위반하고 있습니다. –