PDF 예제를 시작점으로 삼아 살펴 보겠습니다.
http://en.wikipedia.org/wiki/Single_responsibility_principle
단일 책임 원칙 (Single Responsibility Principle)은 대상이 단 하나의 목표를 가져야한다고 제안합니다. 이것을 명심하십시오.
http://en.wikipedia.org/wiki/Separation_of_concerns
우려의 분리 원칙은 클래스에 중복되는 기능이 없어야 함을 알려줍니다.
이 두 가지를 살펴보면 논리가 의미가있는 경우에만 해당 클래스가 처리해야하는 경우에만 논리가 클래스에 들어가도록 제안합니다.
이제 PDF 예제에서 문제는 누가 인쇄를 담당합니까? 무슨 의미가 있습니까?
첫 번째 코드 스 니펫 :
Pdf pdf = new Pdf();
pdf.Print();
이것은 좋지 않습니다. PDF 문서는 자체 인쇄되지 않습니다. 프린터에 의해 인쇄됩니다. 따라서 두 번째 코드 스 니펫이 훨씬 좋습니다.
Pdf pdf = new Pdf();
PdfPrinter printer = new PdfPrinter();
printer.Print(pdf);
이것은 말이됩니다. PDF 프린터는 PDF 문서를 인쇄합니다. 더 좋은 방법은 프린터가 PDF 프린터 나 사진 프린터가되어서는 안됩니다. 최고의 성능으로 전송 된 자료를 인쇄 할 수있는 프린터 여야합니다.
Pdf pdf = new Pdf();
Printer printer = new Printer();
printer.Print(pdf);
간단합니다. 적절한 방법을 사용하십시오. 분명히, 항상 그렇게 간단한 것은 아닙니다. 국가 통계를 예로 들어 보겠습니다.
Country m = new Country("Mexico");
double ratio = m.GetDebtToGDPRatio();
귀하의 우려는 n 개의 통계 가있을 수 있으며 Country 클래스에 있으면 안된다는 것입니다. 사실입니다. 그러나 모델 이 특정 통계 만 요구하는 경우이 모델링 예제가 실제로 적합 할 수 있습니다.
이 경우 국가가 모델 및 현재 요구 사항에 따라 자체 통계를 계산할 수 있어야한다는 것을 논리적으로 말할 수 있습니다.
그리고 거기에 문제가 있습니다 : 당신의 요구 사항은 무엇입니까? 귀하의 요구 사항은 세계를 모델링하는 방식, 이러한 요구 사항이 충족되는 컨텍스트를 주도합니다.
실제로 다수 / 가변 수의 통계가있는 경우 두 번째 예가 더 적합합니다.
Country m = new Country("Mexico");
DebtStatistics ds = new DebtStatistics();
double usRatio = ds.GetDebtToGDPRatio(m);
더 좋은 방법은 국가를 매개 변수로 사용하는 통계라는 추상 슈퍼 클래스 또는 인터페이스를 사용하는 것입니다.
interface StatisticsCalculator // or a pure abstract class if doing C++
{
double getStatistics(Country country); // or a pure virtual function if in C++
}
DebtToGDPRatioStatisticsCalculator 클래스는 StatisticsCalculator를 구현합니다.
InfantMortalityStatisticsCalculator 클래스는 StatisticsCalculator를 구현합니다 ...
그리고 등등. 일반화, 위임, 추상화로 이어집니다. 통계 수집은 특정 추상화 (통계 수집 API) 를 일반화 하는 특정 인스턴스에 위임 됩니다 .
이것이 귀하의 질문에 100 % 대답하는지 모르겠습니다. 결국, 우리는 불가침의 법에 근거한 완벽한 모델을 가지고 있지 않습니다 (EE 사람들처럼). 그리고 그것은 당신이 결정해야 할 공학적 결정입니다. 가장 좋은 방법은 OO 원칙 (및 일반적으로 좋은 소프트웨어 모델링 원칙)에 익숙해지는 것입니다.