เพื่อขยายคำตอบที่ดีมากของ Vadim ฉันจะตอบคำถาม "is it แย้ง" กับ "ไม่ไม่จริง"
โดยทั่วไปการแยกอินเทอร์เฟซเป็นสิ่งที่ดีโดยการลดจำนวนโดยรวมของ "เหตุผลในการเปลี่ยนแปลง" ของวัตถุต่าง ๆ ที่เกี่ยวข้อง หลักการหลักคือเมื่อต้องเปลี่ยนอินเตอร์เฟซที่มีหลายวิธีพูดเพื่อเพิ่มพารามิเตอร์ให้กับหนึ่งในวิธีการอินเทอร์เฟซผู้บริโภคทุกคนของอินเทอร์เฟซจะต้องได้รับการคอมไพล์ใหม่อย่างน้อยแม้ว่าพวกเขาไม่ได้ใช้วิธีที่เปลี่ยน. "แต่มันก็แค่คอมไพล์อีกครั้ง!" ฉันได้ยินคุณพูด ที่อาจเป็นจริง แต่โปรดจำไว้ว่าโดยทั่วไปสิ่งใดก็ตามที่คุณคอมไพล์ซ้ำจะต้องถูกส่งออกมาเป็นส่วนหนึ่งของซอฟต์แวร์แพทช์ไม่ว่าการเปลี่ยนแปลงที่สำคัญจะเป็นไบนารี กฎเหล่านี้ได้รับการกำหนดแนวคิดย้อนกลับไปในช่วงต้นยุค 90 เมื่อเวิร์กสเตชันเดสก์ทอปโดยเฉลี่ยมีประสิทธิภาพน้อยกว่าโทรศัพท์ในกระเป๋าของคุณ 14.4k baud dial-up เป็น blazin 'และ 3.5 "1.44MB" floppies "เป็นสื่อที่ถอดได้หลัก แม้ในยุคปัจจุบันของ 3G / 4G ผู้ใช้อินเทอร์เน็ตไร้สายมักจะมีแผนข้อมูลที่ จำกัด ดังนั้นเมื่อปล่อยการอัปเกรดไบนารีที่น้อยลงที่ต้องดาวน์โหลดก็จะยิ่งดีขึ้น
อย่างไรก็ตามเช่นเดียวกับแนวคิดที่ดีการแยกส่วนต่อประสานอาจไม่ดีหากนำไปใช้อย่างไม่เหมาะสม ก่อนอื่นมีความเป็นไปได้ว่าโดยการแยกอินเทอร์เฟซในขณะที่รักษาวัตถุที่ใช้อินเทอร์เฟซเหล่านั้น (ตอบสนองการพึ่งพา) ค่อนข้างไม่เปลี่ยนแปลงคุณอาจท้ายด้วย "ไฮดรา" ญาติของ "พระเจ้าวัตถุ" ต่อต้านแบบ ธรรมชาติที่ทรงพลังของวัตถุนั้นถูกซ่อนไว้จากส่วนต่อประสานที่แคบ คุณจบลงด้วยสัตว์ประหลาดที่มีหัวหลายตัวที่อย่างน้อยก็ยากที่จะรักษาตามที่วัตถุของพระเจ้าจะต้องรวมทั้งค่าใช้จ่ายในการบำรุงรักษาอินเตอร์เฟสทั้งหมด ไม่มีอินเทอร์เฟซจำนวนมากที่คุณไม่ควรเกิน แต่แต่ละอินเตอร์เฟสที่คุณใช้กับวัตถุเดียวควรจะถูกนำหน้าด้วยการตอบคำถาม "อินเทอร์เฟซนี้มีส่วนร่วมกับวัตถุ 'หรือไม่
ประการที่สองอินเทอร์เฟซสำหรับแต่ละวิธีอาจไม่จำเป็นแม้ว่า SRP จะบอกอะไรคุณ คุณอาจท้ายด้วย "รหัสราวีโอลี่"; ชิ้นที่มีขนาดกัดมากมายที่ยากต่อการติดตามเพื่อค้นหาว่าสิ่งต่าง ๆ เกิดขึ้นจริง นอกจากนี้ยังไม่จำเป็นต้องแยกอินเทอร์เฟซด้วยสองวิธีหากผู้ใช้ปัจจุบันของอินเทอร์เฟซนั้นต้องการทั้งสองวิธี แม้ว่าหนึ่งในคลาสที่ขึ้นต่อกันต้องการเพียงหนึ่งในสองเมธอด แต่โดยทั่วไปแล้วก็เป็นที่ยอมรับได้ว่าจะไม่แยกอินเทอร์เฟซหากแนวคิดของมันมีความเชื่อมโยงสูงมาก (ตัวอย่างที่ดีคือ "วิธี antonymic"
การแยกอินเตอร์เฟสควรขึ้นอยู่กับคลาสที่ขึ้นอยู่กับอินเตอร์เฟส:
หากมีเพียงคลาสเดียวที่ขึ้นอยู่กับอินเทอร์เฟซอย่าแยกออกจากกัน หากคลาสไม่ได้ใช้หนึ่งหรือมากกว่าหนึ่งในวิธีการอินเตอร์เฟซและมันเป็นเพียงผู้บริโภคของอินเทอร์เฟซอัตราต่อรองที่คุณไม่ควรได้สัมผัสวิธีการเหล่านั้นในสถานที่แรก
หากมีมากกว่าหนึ่งคลาสที่ขึ้นอยู่กับอินเตอร์เฟสและผู้ติดตามทั้งหมดใช้วิธีการทั้งหมดของอินเตอร์เฟสอย่าแยกออก หากคุณต้องเปลี่ยนอินเทอร์เฟซ (เพื่อเพิ่มวิธีการหรือเปลี่ยนลายเซ็น) ผู้บริโภคปัจจุบันทั้งหมดจะได้รับผลกระทบจากการเปลี่ยนแปลงไม่ว่าคุณจะแยกหรือไม่ (แม้ว่าคุณจะเพิ่มวิธีที่ต้องพึ่งพาอย่างน้อยหนึ่งรายการให้พิจารณา อย่างรอบคอบหากการเปลี่ยนแปลงควรถูกนำมาใช้เป็นอินเทอร์เฟซใหม่แทนซึ่งอาจสืบทอดมาจากสิ่งที่มีอยู่เดิม)
หากมีมากกว่าหนึ่งคลาสขึ้นอยู่กับอินเทอร์เฟซและพวกเขาไม่ได้ใช้วิธีการเดียวกันทั้งหมดมันเป็นตัวเลือกสำหรับการแยก ดูที่ "การเชื่อมโยงกัน" ของอินเตอร์เฟส; ทำทุกวิธีต่อไปเป้าหมายการเขียนโปรแกรมที่เฉพาะเจาะจงมากขึ้นหรือไม่ หากคุณสามารถระบุวัตถุประสงค์หลักได้มากกว่าหนึ่งวัตถุประสงค์สำหรับอินเทอร์เฟซ (และผู้ใช้งาน) พิจารณาแยกอินเทอร์เฟซตามบรรทัดเหล่านั้นเพื่อสร้างอินเทอร์เฟซที่เล็กลงโดยมี "เหตุผลในการเปลี่ยนแปลง" น้อย