ความรับผิดชอบเดี่ยวอาจไม่ใช่สิ่งที่ฟังก์ชั่นเดียวสามารถเติมเต็มได้
class Location {
public int getX() {
return x;
}
public int getY() {
return y;
}
}
ชั้นนี้อาจทำลายหลักการความรับผิดชอบเดียว ไม่ใช่เพราะมันมีสองหน้าที่ แต่ถ้ารหัสสำหรับgetX()
และgetY()
ต้องตอบสนองผู้มีส่วนได้เสียที่แตกต่างกันที่อาจต้องการการเปลี่ยนแปลง หากรองประธานนาย X ส่งบันทึกช่วยจำว่าตัวเลขทั้งหมดจะแสดงเป็นตัวเลขทศนิยมและผู้อำนวยการฝ่ายบัญชีนาง Y ยืนยันว่าตัวเลขทั้งหมดที่แผนกรีวิวของเธอจะยังคงเป็นจำนวนเต็มโดยไม่คำนึงถึงสิ่งที่นายเอ็กซ์คิดว่าดี ความคิดเดียวของผู้ที่รับผิดชอบเพราะสิ่งต่าง ๆ กำลังสับสน
ถ้า SRP ได้รับการติดตามจะมีความชัดเจนว่าคลาส Location มีส่วนช่วยในสิ่งที่คุณ X และกลุ่มของเขาได้รับ ทำให้ชัดเจนในสิ่งที่ชั้นเรียนรับผิดชอบและคุณรู้ว่าคำสั่งใดมีผลกระทบต่อชั้นเรียนนี้ หากพวกเขาทั้งสองส่งผลกระทบต่อชั้นเรียนนี้ก็ถูกออกแบบมาไม่ดีเพื่อลดผลกระทบของการเปลี่ยนแปลง "คลาสควรมีเหตุผลเดียวเท่านั้นที่จะเปลี่ยน" ไม่ได้หมายความว่าทั้งคลาสสามารถทำสิ่งเล็ก ๆ น้อย ๆ ได้ หมายความว่าฉันไม่ควรมองไปที่ชั้นเรียนและพูดว่านาย X และนาง Y มีความสนใจในชั้นเรียนนี้
นอกเหนือจากสิ่งนั้น ไม่ได้หลายวิธีก็ใช้ได้ เพียงแค่ให้ชื่อที่ชัดเจนว่าวิธีการอยู่ในชั้นเรียนและสิ่งที่ไม่ได้
SRP ลุงบ๊อบเป็นเรื่องเกี่ยวกับกฎหมายของคอนเวย์กว่ากฎหมายหยิกของ ลุงบ็อบสนับสนุนการประยุกต์ใช้กฎของลอน (ทำสิ่งหนึ่ง) กับฟังก์ชั่นที่ไม่ใช่คลาส SRP เตือนไม่ให้ผสมเหตุผลต่าง ๆ ให้เปลี่ยนด้วยกัน กฎหมายของ Conway กล่าวว่าระบบจะติดตามการไหลของข้อมูลขององค์กร สิ่งนี้นำไปสู่การติดตาม SRP เพราะคุณไม่สนใจสิ่งที่คุณไม่เคยได้ยิน
"โมดูลควรจะรับผิดชอบต่อหนึ่งและเพียงคนเดียวเท่านั้นที่นักแสดง"
Robert C Martin - สถาปัตยกรรมสะอาด
ผู้คนต้องการให้ SRP มีเหตุผลทุกอย่างเพื่อ จำกัด ขอบเขต มีเหตุผลเพิ่มเติมในการ จำกัด ขอบเขตกว่า SRP ฉันยัง จำกัด ขอบเขตโดยยืนยันในชั้นเรียนเป็นนามธรรมที่สามารถใช้ชื่อที่ช่วยให้มองภายในจะไม่ทำให้คุณประหลาดใจ
คุณสามารถใช้กฎของลอนสำหรับคลาสได้ คุณอยู่ข้างนอกสิ่งที่ลุงบ๊อบพูดถึง แต่คุณทำได้ ที่ที่คุณไปผิดคือเมื่อคุณเริ่มคิดว่านั่นหมายถึงฟังก์ชั่นเดียว นั่นเหมือนกับการคิดว่าครอบครัวควรมีลูกเพียงคนเดียว การมีลูกมากกว่าหนึ่งคนไม่ได้หยุดอยู่แค่การเป็นครอบครัว
หากคุณใช้กฎของลอนด์กับชั้นเรียนทุกสิ่งในชั้นเรียนควรเป็นแนวคิดที่รวมเป็นหนึ่งเดียว ความคิดนั้นกว้าง ความคิดอาจมีอยู่ หากมีฟังก์ชั่นยูทิลิตี้การบันทึกอยู่ในนั้นแสดงว่าพวกเขาอยู่นอกสถานที่อย่างชัดเจน ไม่สำคัญว่านาย X จะเป็นคนเดียวที่ใส่ใจกับรหัสนี้หรือไม่
หลักการคลาสสิกที่จะใช้ที่นี่จะเรียกว่าการแยกความกังวลเกี่ยวกับ หากคุณแยกข้อกังวลทั้งหมดของคุณมันอาจเป็นที่ถกเถียงกันอยู่ว่าสิ่งที่เหลืออยู่ในที่เดียวคือข้อกังวลเดียว นั่นคือสิ่งที่เราเรียกว่าความคิดนี้ก่อนที่ภาพยนตร์ City Slickers ปี 1991 จะแนะนำเราให้รู้จักกับตัวละคร Curly
นี่เป็นเรื่องปกติ มันเป็นเพียงสิ่งที่ลุงบ็อบเรียกความรับผิดชอบไม่ใช่เรื่องกังวล ความรับผิดชอบต่อเขาไม่ใช่สิ่งที่คุณให้ความสำคัญ มันเป็นสิ่งที่สามารถบังคับให้คุณเปลี่ยน คุณสามารถมุ่งเน้นไปที่ข้อกังวลเดียวและยังคงสร้างรหัสที่รับผิดชอบกลุ่มคนที่มีวาระการประชุมต่างกัน
บางทีคุณอาจไม่สนใจสิ่งนั้น ละเอียด. การคิดว่าการถือเพื่อ "ทำสิ่งใดสิ่งหนึ่ง" จะช่วยแก้ปัญหาการออกแบบทั้งหมดของคุณแสดงให้เห็นถึงการขาดจินตนาการในสิ่งที่ "สิ่งหนึ่งสิ่ง" สามารถจบลงได้ อีกเหตุผลหนึ่งในการ จำกัด ขอบเขตคือองค์กร คุณสามารถซ้อน "สิ่งหนึ่ง" ไว้ข้างใน "อีกอย่างหนึ่ง" จนกว่าคุณจะมีลิ้นชักขยะที่เต็มไปด้วยทุกสิ่ง ฉันเคยพูดถึงเรื่องนี้มาก่อน
แน่นอนว่าเหตุผลที่คลาสสิก OOP จำกัด ขอบเขตคือคลาสมีเขตข้อมูลส่วนตัวอยู่แล้วใช้ getters เพื่อแชร์ข้อมูลนั้นเราใส่ทุกวิธีที่ต้องการข้อมูลในคลาสที่พวกเขาสามารถใช้ข้อมูลส่วนตัว หลายคนพบว่าข้อ จำกัด เกินไปที่จะใช้เป็นตัว จำกัด ขอบเขตเนื่องจากไม่ใช่ทุกวิธีที่อยู่ด้วยกันใช้เขตข้อมูลเดียวกันทั้งหมด ฉันต้องการให้แน่ใจว่าสิ่งใดก็ตามที่นำข้อมูลมารวมกันเป็นแนวคิดเดียวกันที่นำวิธีการมารวมกัน
วิธีการใช้งานที่ใช้มองสิ่งนี้ก็คือa.f(x)
และa.g(x)
เป็นเพียง f a (x) และ g a (x) ไม่ใช่ฟังก์ชั่นสองอย่าง แต่เป็นคู่ของฟังก์ชั่นที่ต่อเนื่องกัน a
ไม่ได้จะต้องมีข้อมูลอยู่แล้ว มันอาจเป็นวิธีที่คุณรู้f
และg
ใช้งานสิ่งที่คุณจะใช้ ฟังก์ชั่นที่เปลี่ยนแปลงด้วยกันอยู่ด้วยกัน นั่นคือความแตกต่างที่ดีเก่า
SRP เป็นเพียงหนึ่งในหลาย ๆ เหตุผลในการ จำกัด ขอบเขต มันเป็นสิ่งที่ดี แต่ไม่ใช่คนเดียว