หลักการความรับผิดชอบเดี่ยว
("ทุกชั้นควรมีความรับผิดชอบเพียงอย่างเดียว; ในคำอื่น ๆ ทุกชั้นควรมีหนึ่งและเหตุผลเดียวเท่านั้นที่จะเปลี่ยน")
ฉันไม่เห็นด้วย. ฉันคิดว่าวิธีการควรมีเหตุผลเดียวเท่านั้นที่จะเปลี่ยนและวิธีการทั้งหมดในชั้นเรียนควรมีความสัมพันธ์เชิงตรรกะกับอีกแบบหนึ่งแต่ชั้นเรียนเองอาจทำสิ่งต่าง ๆ (เกี่ยวข้อง)
จากประสบการณ์ของฉันหลักการนี้มักถูกนำไปใช้อย่างกระตือรือร้นเกินไปและคุณก็จบลงด้วยชั้นเรียนขนาดเล็กแบบวิธีเดียวจำนวนมาก ทั้งร้านค้าเปรียวที่ฉันเคยทำมา
ลองนึกภาพถ้าผู้สร้าง. Net API มีความคิดเช่นนี้: แทนที่จะเป็น List.Sort (), List.Reverse (), List.Find () เป็นต้นเรามีคลาส ListSorter, ListReverser และ ListSearcher!
แทนที่จะเถียงกับ SRP อีกต่อไป(ซึ่งตัวมันเองก็ไม่ได้เลวร้ายในทางทฤษฎี)ฉันจะแบ่งปันประสบการณ์เล็ก ๆ น้อย ๆ ของฉันเกี่ยวกับประสบการณ์อันยาวนาน:
ในที่แห่งหนึ่งที่ฉันทำงานฉันเขียนตัวแก้ปัญหาการไหลอย่างง่าย ๆซึ่งประกอบด้วยห้าคลาส: โหนด, กราฟ, ผู้สร้างกราฟ, ผู้แก้กราฟและชั้นเรียนเพื่อใช้ผู้สร้างกราฟ / นักแก้ปัญหาเพื่อแก้ ปัญหาโลกแห่งความจริง ไม่มีความซับซ้อนหรือความยาวเป็นพิเศษ (ตัวแก้ปัญหานั้นยาวที่สุดที่ ~ 150 บรรทัด) อย่างไรก็ตามมีการตัดสินใจว่าชั้นเรียนมี "ความรับผิดชอบ" มากเกินไปดังนั้นเพื่อนร่วมงานของฉันจึงกำหนดให้มีการสร้างรหัสใหม่ เมื่อพวกเขาทำเสร็จแล้ว 5 ชั้นเรียนของฉันได้รับการขยายเป็น 25 ชั้นซึ่งบรรทัดของรหัสทั้งหมดมากกว่าสามเท่าที่พวกเขาเดิม การไหลของรหัสไม่ชัดเจนอีกต่อไปและไม่มีจุดประสงค์ของการทดสอบหน่วยใหม่ ตอนนี้ฉันมีเวลายากที่จะหาสิ่งที่รหัสของตัวเองทำ
ในสถานที่เดียวกันเกือบทุกชั้นมีเพียงวิธีเดียวเท่านั้น (เป็น "ความรับผิดชอบ" เท่านั้น) หลังจากกระแสในโปรแกรมเกือบเป็นไปไม่ได้และการทดสอบหน่วยส่วนใหญ่ประกอบด้วยการทดสอบว่าชั้นนี้เรียกใช้รหัสจากชั้นเรียนอื่นซึ่งทั้งสองจุดประสงค์มีความลึกลับเท่าเทียมกันสำหรับฉัน มีหลายร้อยชั้นเรียนที่ควรมี (IMO) เพียงสิบเท่านั้น แต่ละชั้นเรียนมี"สิ่ง"เพียงอย่างเดียวแต่ถึงแม้จะมีแบบแผนการตั้งชื่อเช่น"AdminUserCreationAttemptorFactory"มันก็ยากที่จะบอกความสัมพันธ์ระหว่างชั้นเรียน
ที่อื่น (ซึ่งมีคลาสความคิดที่ควรมีเพียงวิธีเดียวเท่านั้น ) เรากำลังพยายามปรับวิธีที่เหมาะสมซึ่งใช้เวลา 95% ของเวลาในระหว่างการดำเนินการบางอย่าง หลังจาก (ค่อนข้างโง่) ปรับให้เหมาะสมเล็กน้อยฉันหันความสนใจของฉันไปทำไมมันถูกเรียกว่าเป็นพันล้านครั้ง มันถูกเรียกในลูปในคลาส ... ซึ่งวิธีการถูกเรียกในลูปในคลาสอื่น .. ซึ่งก็ถูกเรียกในลูป ..
ทั้งหมดบอกว่ามีลูปห้าระดับกระจายออกไปมากกว่า 13 คลาส (จริงจัง) สิ่งใดที่คลาสหนึ่งกำลังทำจริง ๆ นั้นเป็นไปไม่ได้ที่จะตัดสินเพียงแค่มองมัน - คุณต้องวาดกราฟทางจิตของวิธีการที่เรียกใช้และวิธีการที่เรียกว่าวิธีการเหล่านั้นเป็นต้น หากมีการรวมกันเป็นหนึ่งวิธีมันจะมีความยาวประมาณ 70 บรรทัดเท่านั้นโดยวิธีการแก้ปัญหาของเราซ้อนอยู่ในลูประดับห้าทันทีที่เห็นได้ชัด
คำขอของฉันในการปรับโครงสร้าง 13 คลาสเหล่านั้นเป็นคลาสเดียวถูกปฏิเสธ