문제

전제

나는 "좋은"과 "나쁜"객체 지향 설계 기술을 객관적으로 정의 할 수있는 방법이 있다고 생각하며, 커뮤니티로서 우리는 이것이 무엇인지 결정할 수 있다고 생각합니다. 이것은 학업 운동입니다. 진지함과 결의로 끝나면 커뮤니티 전체에 큰 이익이 될 수 있다고 생각합니다. 커뮤니티는 "이 기술은 '좋은'또는 '나쁜'것이며 특별한 상황이 없다면 그것을 사용하거나 사용해서는 안된다.

계획

이러한 노력을 위해, 우리는 객체 지향 원칙 (기능적, 세트 기반 또는 기타 유형의 언어와 반대)에 중점을 두어야합니다.

나는 하나의 답변을 받아들이려고 할 계획이 아니라 대신 최종 컬렉션에 기여하거나 문제에 대한 합리적인 논쟁이되기를 원합니다.

나는 이것이 논란의 여지가 있다는 것을 알고 있지만, 우리가 무언가를 다룰 수 있다고 생각합니다. 대부분의 모든 규칙에는 예외가 있으며 이것이 불일치가 떨어질 곳이라고 생각합니다. 우리는 선언을 한 다음 반대자들로부터 관련된 예외와 반대를 주목해야합니다.

기초

"Good"및 "Bad"를 정의하는 데 찌르고 싶습니다.

  • "좋은" -이 기술은 처음으로 작동하고 지속적인 솔루션이 될 것입니다. 나중에 변경하기 쉽고 구현의 시간 투자를 신속하게 지불 할 것입니다. 향후 유지 보수 프로그래머가 지속적으로 적용하고 쉽게 인식 할 수 있습니다. 전반적으로, 그것은 좋은 기능에 기여하고 제품 수명 동안 유지 보수 비용을 낮 춥니 다.

  • "나쁜" -이 기술은 단기적으로 작동 할 수 있지만 곧 책임이됩니다. 시간이 지남에 따라 변경하기가 즉시 어려워 지거나 더 어려워집니다. 초기 투자는 작거나 클 수 있지만 빠르게 증가하는 비용이되어 결국에는 침몰 비용이되어 끊임없이 제거되거나 계속 일해야합니다. 주관적으로 적용되고 일관성이 없으며 향후 유지 보수 프로그래머가 놀랍거나 쉽게 인식 할 수 없습니다. 전반적으로, 그것은 제품을 유지 관리 및/또는 작동하는 비용 증가에 기여하며 제품의 변화를 억제하거나 방지합니다. 변화를 억제하거나 예방함으로써, 그것은 직접 비용 일뿐 만 아니라 기회 비용과 상당한 책임이됩니다.

기동기

내가 좋은 기여가 어떻게 보일 것이라고 생각하는지의 예로서, 나는 "좋은"원칙을 제안하고 싶습니다.

우려의 분리

간단한 설명

예시

코드 또는 다른 유형의 예

목표

이 원칙이 어떤 문제를 방해하는지 설명

적용 가능성

이 원리를 언제, 어디서, 언제 사용하겠습니까?

예외

이 원칙을 언제 사용하지 않겠습니까? 아니면 실제로 어디에서 해로울 수 있습니까?

이의 제기

여기서 커뮤니티의 반대 의견이나 반대 의견에 주목하십시오

도움이 되었습니까?

해결책

우려의 분리

혼합 스타일 상속을 선호합니다

유틸리티 클래스에서 상속을 통해 기능을 얻을 수 있지만 많은 경우 상기 클래스의 구성원을 사용하여 얻을 수 있습니다.

예제 (boost.noncopyable) :

boost.noncopyable은 사본 생성자 또는 할당 연산자가없는 C ++ 클래스입니다. 서브 클래스가 복사되거나 할당되는 것을 방지하기 위해 기본 클래스로 사용될 수 있습니다 (이것은 공통 동작입니다). 직접 회원으로도 사용할 수 있습니다

이것을 변환 :

class Foo : private boost::noncopyable { ... };

이에:

class Foo {
    ...
private:
    boost::noncopyable noncopyable_;
};

예제 (잠금 가능 객체) :

Java가 소개했습니다 synchronized 모든 객체를 실시한 방식으로 사용할 수 있도록 관용구로서 키워드. 이것은 임의의 객체에 뮤 테스를 제공하기 위해 다른 언어로 미러링 될 수 있습니다. 일반적인 예는 데이터 구조입니다.

class ThreadsafeVector<T> : public Vector<T>, public Mutex { ... };

대신, 두 클래스는 함께 집계 될 수 있습니다.

struct ThreadsafeVector<T> {
    Vector<T> vector;
    Mutex mutex;
}

목표

상속은 종종 코드 반사 메커니즘으로 남용됩니다. IS 관계 외에 상속이 사용되는 경우 전체 코드 선명도가 줄어 듭니다.

더 깊은 체인을 사용하면 Mixin 기본 클래스는 "죽음의 다이아몬드"시나리오의 가능성을 크게 증가시켜 서 서브 클래스가 믹스 인 클래스의 여러 사본을 상속 받게됩니다.

적용 가능성

다중 상속을 지원하는 모든 언어.

예외

Mixin 클래스가 제공하는 멤버를 제공하거나 요구하는 모든 경우. 이 경우 상속은 일반적으로 IS- 구현 된 관계를 의미하며 집계는 충분하지 않습니다.

이의 제기

이 변화의 결과는 공개 회원으로 이어질 수 있습니다 (예 : MyThreadSafeDataStructure 공개적으로 접근 할 수 있습니다 Mutex 구성 요소로).

다른 팁

좋은 출발점을 형성 할 수있는 잘 이해 된 원칙이 있습니다.

또한 기존 디자인 패턴을 연구하여 그 뒤에 원리를 찾는 것이 좋습니다. 가장 중요한 것은 상속보다 (일반적으로) 구성을 선호하는 것입니다.

짧은 대답은 "좋은"OO 디자인이 변화에 따라 강력하다는 것입니다. 요구 사항 변경에 대한 코드 파손이 가장 적습니다. 일반적인 규칙을 모두 고려하면 모두 같은 결론을 내립니다.

어려움은 맥락없이 디자인의 "선함"을 평가할 수 없다는 것입니다. 모든 모듈화의 경우 파손을 극대화하여 각 방법에서 모든 클래스를 터치 할 수있는 요구 사항이 변경 될 것이라고 생각합니다.

당신이 그것에 대해 엄격하게 원한다면, 당신은 "변경 사례"모음을 개발하고 확률 순서로 주문할 수 있으므로 최고 확률 변경에 대한 파손을 최소화 할 수 있습니다.

그러나 대부분의 경우 잘 발달 된 직관은 많은 도움이됩니다. 장치 별 또는 플랫폼 특정 사항은 변화하는 경향이 있으며 비즈니스 규칙 및 비즈니스 프로세스는 변경되는 경향이 있지만 산술은 거의 변하지 않습니다. (예를 들어, 플랫폼 지원 BCD 산술을 사용할 수 있거나 사용할 수없는 비즈니스 시스템을 예를 들어, 절대로 상상할 수 있듯이 아닙니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top