PDF örneklerinizi başlangıç noktası olarak ele alalım, buna bakalım.
http://en.wikipedia.org/wiki/Single_responsibility_principle
Tek Sorumluluk İlkesi, bir nesnenin tek bir hedefi olması gerektiğini önermektedir. Bunu aklında tut.
http://en.wikipedia.org/wiki/Separation_of_concerns
Endişelerin Ayrılması ilkesi bize sınıfların örtüşen işlevlere sahip olmaması gerektiğini söyler.
Bu ikisine baktığınızda, mantığın sadece mantıklı bir sınıfta gitmesi gerektiğini, ancak o sınıfın bunu yapmaktan sorumlu olması gerektiğini önerirler.
Şimdi, PDF örneğinizde soru şu: Baskıdan kim sorumlu? Ne mantıklı?
İlk kod snippet'i:
Pdf pdf = new Pdf();
pdf.Print();
Bu iyi değil. Bir PDF belgesi kendi kendine yazdırmaz. Bir yazıcı tarafından ... ta da! .. yazdırılır. Yani ikinci kod pasajınız çok daha iyi:
Pdf pdf = new Pdf();
PdfPrinter printer = new PdfPrinter();
printer.Print(pdf);
Bu mantıklı. Pdf Yazıcı bir pdf belgesi yazdırır. Daha da iyisi, bir yazıcı PDF yazıcı veya fotoğraf yazıcısı olmamalıdır. Sadece kendisine gönderilenleri en iyi şekilde yazdırabilen bir yazıcı olmalıdır.
Pdf pdf = new Pdf();
Printer printer = new Printer();
printer.Print(pdf);
Yani bu basit. Yöntemleri mantıklı oldukları yere koyun. Açıkçası, her zaman bu kadar basit değildir. Ülkenizin istatistiklerini ele alalım örneğin:
Country m = new Country("Mexico");
double ratio = m.GetDebtToGDPRatio();
Endişeniz, n sayıda istatistik olabileceğidir ve bir Country sınıfında olmamalıdır. Bu doğru. Ancak, modeliniz yalnızca belirli istatistikleri çağırıyorsa, bu modelleme örneği gerçekten iyi olabilir.
Bu durumda, oldukça mantıklı bir şekilde, bir ülkenin modelinize ve gereksinimlerinize özgü kendi istatistiklerini hesaplayabilmesi gerektiğini söyleyebilirsiniz.
Ve bir şey var: Gereksinimleriniz neler? Gereksinimleriniz, dünyayı modelleme şeklinizi, bu gereksinimlerin karşılanacağı bağlamı yönlendirecektir.
Gerçekten çok sayıda / değişken sayıda istatistiğiniz varsa, ikinci örneğiniz daha anlamlı olur:
Country m = new Country("Mexico");
DebtStatistics ds = new DebtStatistics();
double usRatio = ds.GetDebtToGDPRatio(m);
Daha da iyisi, ülkeyi parametre olarak alan, İstatistik adı verilen soyut bir üst sınıf veya arayüze sahip olun:
interface StatisticsCalculator // or a pure abstract class if doing C++
{
double getStatistics(Country country); // or a pure virtual function if in C++
}
class DebtToGDPRatioStatisticsCalculator uygular StatisticsCalculator ....
Sınıf InfantMortalityStatisticsCalculator uygular İstatistiklerCalculator ...
Ve benzeri vb. Bu aşağıdakilere yol açar: genelleme, delegasyon, soyutlama. İstatistiksel toplama, belirli bir soyutlamayı (bir istatistik toplama API'sı) genelleyen belirli örneklere devredilir .
Bunun sorunuzu% 100 yanıtlayıp yanıtlamadığını bilmiyorum. Sonuçta, dokunulmaz yasalara dayanan (EE milletlerinin yaptığı gibi) yanılmaz modellerimiz yok. Yapabileceğiniz tek şey, mantıklı oldukları şeyler koymaktır. Ve bu, vermeniz gereken bir mühendislik kararı. Yapılacak en iyi şey gerçekten OO ilkelerini (ve genel olarak iyi yazılım modelleme ilkelerini) tanımaktır.