ยกตัวอย่าง PDF ของคุณเป็นจุดเริ่มต้นมาดูกันดีกว่า
http://en.wikipedia.org/wiki/Single_responsibility_principle
หลักการความรับผิดชอบเดี่ยวชี้ให้เห็นว่าวัตถุควรมีวัตถุประสงค์เพียงหนึ่งเดียวเท่านั้น จำไว้ในใจ
http://en.wikipedia.org/wiki/Separation_of_concerns
หลักการแยกข้อกังวลบอกเราว่าคลาสไม่ควรมีฟังก์ชันที่ทับซ้อนกัน
เมื่อคุณดูที่ทั้งสองพวกเขาแนะนำว่าตรรกะควรไปในชั้นเรียนเฉพาะเมื่อมันทำให้รู้สึกเฉพาะในกรณีที่ชั้นนั้นมีความรับผิดชอบในการทำเช่นนั้น
ตอนนี้ในตัวอย่าง PDF ของคุณคำถามคือใครรับผิดชอบการพิมพ์ มีเหตุผลอะไร
ข้อมูลโค้ดแรก:
Pdf pdf = new Pdf();
pdf.Print();
มันไม่ดี เอกสาร PDF ไม่พิมพ์ตัวเอง มันพิมพ์โดย ... ta da! .. เครื่องพิมพ์ ดังนั้นข้อมูลโค้ดที่สองของคุณดีกว่ามาก:
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 m = new Country("Mexico");
DebtStatistics ds = new DebtStatistics();
double usRatio = ds.GetDebtToGDPRatio(m);
ยังดีกว่ามี abstract superclass หรือส่วนต่อประสานที่เรียกว่าสถิติที่ใช้ชื่อประเทศเป็นพารามิเตอร์:
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 folks ทำ) สิ่งที่คุณทำได้คือใส่สิ่งที่พวกเขาเข้าท่า และนั่นคือการตัดสินใจทางวิศวกรรมที่คุณต้องทำ สิ่งที่ดีที่สุดที่ต้องทำคือทำความคุ้นเคยกับหลักการ OO (และหลักการสร้างแบบจำลองซอฟต์แวร์ที่ดีโดยทั่วไป)