หลักการความรับผิดชอบเดี่ยว: ชั้นเรียนมีเพียงเหตุผลเดียวที่ทำให้เกิดการเปลี่ยนแปลง
เหตุใดจึงจำเป็นต้องมีหลักการความรับผิดชอบเดียว
หากคลาสมีหลายเหตุผลในการแก้ไขการแก้ไขฟังก์ชันอาจทำให้เกิดข้อบกพร่องกับฟังก์ชั่นอื่น ๆ ดังนั้นจึงเป็นการดีที่สุดที่จะมีความรับผิดชอบเพียงหนึ่งเดียวสำหรับชั้นเรียน แต่มันก็ยังยากที่จะประสบความสำเร็จในการใช้งานจริงดังนั้นเราจึงสามารถพยายามอย่างเต็มที่เพื่อให้สอดคล้องกับหลักการนี้
บางครั้งนักพัฒนาจะมีปัญหาบางอย่างเมื่อออกแบบอินเทอร์เฟซเช่นคุณสมบัติของผู้ใช้และพฤติกรรมของผู้ใช้ที่ถูกประกาศในอินเทอร์เฟซ สิ่งนี้ทำให้วัตถุทางธุรกิจและตรรกะทางธุรกิจรวมตัวกันซึ่งทำให้อินเตอร์เฟสมีความรับผิดชอบสองประการ ความรับผิดชอบของอินเตอร์เฟสนั้นไม่ชัดเจนและตามคำจำกัดความของ SRP มันเป็นการละเมิดหลักการของความรับผิดชอบเดียวของอินเทอร์เฟซ
นี่คือตัวอย่าง:
แพ็คเกจ com.loulijun.chapter1; อินเทอร์เฟซสาธารณะ itutu {// ความสูงเป็นโมฆะ setshengao (ความสูงสองเท่า); double getShengao (); // น้ำหนักโมฆะ Settizhong (น้ำหนักสองเท่า); double gettizhong (); // กินบูลีน Chifan (หิวบูลีน); // ในบูลีนบูลีนอินเทอร์เน็ต (บูลีนโง่); -ตัวอย่างข้างต้นมีปัญหานี้ ความสูงและน้ำหนักเป็นของวัตถุทางธุรกิจและวิธีการที่สอดคล้องกันส่วนใหญ่รับผิดชอบคุณลักษณะของผู้ใช้ การกินและท่องอินเทอร์เน็ตเป็นตรรกะทางธุรกิจที่สอดคล้องกันซึ่งส่วนใหญ่รับผิดชอบต่อพฤติกรรมของผู้ใช้ แต่สิ่งนี้จะทำให้ผู้คนรู้สึกว่าพวกเขาไม่รู้ว่าอินเทอร์เฟซนี้กำลังทำอะไรความรับผิดชอบไม่ชัดเจนและปัญหาต่าง ๆ จะเกิดขึ้นในระหว่างการบำรุงรักษาในภายหลัง
วิธีแก้ปัญหา: หลักการของความรับผิดชอบเดี่ยวแบ่งอินเทอร์เฟซนี้ออกเป็นสองอินเตอร์เฟสที่มีความรับผิดชอบที่แตกต่างกัน
itutubo.java: รับผิดชอบคุณลักษณะของ tutu (tutu ถ้าเป็นชื่อส่วนตัว)
แพ็คเกจ com.loulijun.chapter1; /*** BO: วัตถุธุรกิจวัตถุธุรกิจ* รับผิดชอบคุณลักษณะของผู้ใช้* @Author Administrator**/ส่วนต่อประสานสาธารณะ Itutubo {// // ความสูงโมฆะ setShengao (ความสูงสองเท่า); double getShengao (); // น้ำหนักโมฆะ Settizhong (น้ำหนักสองเท่า); double gettizhong (); -itutubl.java: รับผิดชอบในการวาง
แพ็คเกจ com.loulijun.chapter1; /*** BL: ตรรกะทางธุรกิจ, ตรรกะทางธุรกิจ* รับผิดชอบพฤติกรรมผู้ใช้* @author Administrator**/อินเทอร์เฟซสาธารณะ itutubl {// กินบูลีนมื้ออาหาร Chifan (Boolean Hungry); // ความบันเทิงบูลีน Shangwang (บูลีนโง่); -สิ่งนี้ตระหนักถึงความรับผิดชอบเดียวของอินเทอร์เฟซ จากนั้นเมื่อใช้อินเทอร์เฟซมีสองคลาสที่แตกต่างกัน
tutubo.java
แพ็คเกจ com.loulijun.chapter1; ระดับสาธารณะ Tutubo ใช้ itutubo {ความสูงสองเท่าส่วนตัว; น้ำหนักสองเท่าส่วนตัว @Override สาธารณะ double getShengao () {ความสูงกลับ; } @Override สาธารณะ double getTizhong () {น้ำหนักคืน; } @Override โมฆะสาธารณะ setShengao (ความสูงสองเท่า) {this.height = ความสูง; } @Override โมฆะสาธารณะ Settizhong (น้ำหนักสองเท่า) {this.weight = น้ำหนัก; -tutubl.java
แพ็คเกจ com.loulijun.chapter1; ชั้นเรียนสาธารณะ Tutubl ใช้ itutubl {@Override บูลีนสาธารณะ Chifan (Boolean Hungry) {ถ้า (หิว) {system.out.println ("ไปมีหม้อร้อน ... "); กลับมาจริง; } return false; } @Override บูลีนสาธารณะ Shangwang (บูลีนโง่) {ถ้า (โง่) {System.out.println ("น่าเบื่อไปที่อินเทอร์เน็ต ... "); กลับมาจริง; } return false; -สิ่งนี้ทำให้ชัดเจน เมื่อคุณต้องการแก้ไขแอตทริบิวต์ของผู้ใช้คุณจะต้องปรับเปลี่ยนอินเตอร์เฟส Itutubo ซึ่งจะส่งผลกระทบต่อคลาส Tutubo เท่านั้นและจะไม่ส่งผลกระทบต่อคลาสอื่น ๆ
สรุป:
1. สถานการณ์จริงคือหลายครั้งที่เราไม่สามารถคาดการณ์ "สาเหตุของการเปลี่ยนแปลง" ล่วงหน้าดังนั้นเราสามารถสร้างอินเทอร์เฟซของเราตามประสบการณ์และพยายามทำให้แน่ใจว่าอินเทอร์เฟซหนึ่งมีความรับผิดชอบเพียงอย่างเดียว สิ่งที่เรากำลังพูดถึงที่นี่คืออินเทอร์เฟซ คลาสอาจสืบทอดและใช้งานหลายอินเตอร์เฟสทำให้ยากขึ้นที่จะบรรลุความรับผิดชอบเพียงครั้งเดียว
2. เมื่อชั้นเรียนที่ฉันเขียนก่อนหน้านี้มีเหตุผลหลายประการสำหรับการเปลี่ยนแปลงมันเป็นการดีที่สุดที่จะ refactor
อย่างไรก็ตามมีปัญหากับหลักการของการใช้ความรับผิดชอบเดียว ไม่มีมาตรฐานการแบ่งแยกที่ชัดเจนสำหรับ "ความรับผิดชอบ" หากความรับผิดชอบถูกแบ่งรายละเอียดเกินไปมันจะนำไปสู่การเพิ่มขึ้นอย่างมากของจำนวนอินเทอร์เฟซและคลาสการใช้งานซึ่งจะเพิ่มความซับซ้อนและลดความสามารถในการบำรุงรักษาของรหัส ดังนั้นเมื่อใช้ความรับผิดชอบนี้เราจะต้องวิเคราะห์สถานการณ์เฉพาะ ข้อเสนอแนะคืออินเทอร์เฟซจะต้องใช้หลักการความรับผิดชอบเดี่ยวและตระหนักถึงหลักการความรับผิดชอบเดียวที่มากที่สุดเท่าที่จะเป็นไปได้ในการออกแบบชั้นเรียน เป็นการดีที่สุดที่จะทำให้เกิดการเปลี่ยนแปลงในชั้นเรียนหากมีเหตุผลหนึ่งที่เกิดขึ้น