มันตกลงหรือไม่สำหรับอินเตอร์เฟสที่ต้องพึ่งพาคลาสที่เป็นรูปธรรม?


9

ฉันกำลังสร้างส่วนติดต่อใน Java สำหรับตัวจัดการข้อผิดพลาดที่กำหนดเอง

ต้องการส่งผ่านข้อผิดพลาดวัตถุข้อโต้แย้ง แต่ฉันต้องการมันเป็นลูกของExceptionชั้น

จะใช้ชื่อคลาสที่กำหนดในอินเทอร์เฟซได้หรือไม่

มันจะทำให้อินเทอร์เฟซน้อยลงหรือไม่ขึ้นอยู่กับการใช้งานใด ๆ

ฉันพยายามทำสิ่งนี้:

public class CustomException {
    /* ... Implementation ... */
}

public interface Interface {

    void onError(CustomException ex);

}

คุณพยายามถามว่าการรับคลาสอื่นในอินเทอร์เฟซเป็นเรื่องปกติหรือไม่?
Snoop

@StevieV ไม่ฉันแก้ไขคำถามดู
nikachx

1
@AndresF มันเป็นเพียงตัวอย่างและสามารถนำไปใช้กับภาษา OO ใด ๆ เกี่ยวกับการใช้คลาสในอินเทอร์เฟซ
nikachx

3
บอกฉัน: เป็นCustomExceptionส่วนหนึ่งของการใช้งานหรือเป็นส่วนหนึ่งของอินเทอร์เฟซ?
user253751

2
@nikachx ฉันไม่เข้าใจความหมายของ "ปลอดภัย" ในสิ่งที่วิธีคือStringปลอดภัยกว่าCustomException? ทำไมมันถึงสำคัญถ้าCustomExceptionในทางกลับกันมีการพึ่งพาอื่น ๆ ?
Andres F.

คำตอบ:


2

ครั้งแรกที่ผมต้องชี้ให้เห็นความจริงที่ว่าCustomExceptionไม่ขยายจึงไม่ได้จริงๆExceptionException

ที่กล่าวว่า:

หากคุณไม่สนใจหลักการพึ่งพาการพึ่งพา (Dependency Inversion Principle ) ให้ปล่อยทิ้งไว้เหมือนเดิม มันตกลงที่ดีเลิศสำหรับอินเตอร์เฟซที่ขึ้นอยู่กับการเรียนที่เป็นรูปธรรมเช่นการเชื่อมต่อขึ้นอยู่กับหลาย ๆStringหรือObjectที่มีการเรียนคอนกรีต สิ่งที่เรามักจะเชื่อว่าคลาสที่เป็นของ Java SDK นั้นมีความเสถียรมากกว่า

ในทางตรงกันข้าม:

หากคุณต้องการติดตามกรมทรัพย์สินทางปัญญา (ซึ่งมีประโยชน์มากมายและเป็นคำแนะนำของฉัน) คุณต้องทำหนึ่งในสองสิ่งต่อไปนี้:

ตัวเลือกที่ 1

  • ทำให้CustomExceptionเป็นนามธรรม
  • เก็บvoid onError(CustomException ex)ตามที่มันเป็น

ตัวเลือก 2

  • สร้างCustomExceptionอินเตอร์เฟส
  • เก็บvoid onError(CustomException ex)ตามที่มันเป็น

ด้วยตัวเลือกใดตัวเลือกหนึ่งคุณจะต้องเข้ากับกรมทรัพย์สินทางปัญญาเนื่องจากอินเตอร์เฟสจะไม่ขึ้นอยู่กับคลาสคอนกรีตใด ๆ

ในแอปพลิเคชันโดยตรงของการผกผันของการพึ่งพาบทคัดย่อเป็นเจ้าของโดยชั้นบน / นโยบาย สถาปัตยกรรมนี้จัดกลุ่มส่วนประกอบ / นโยบายที่สูงขึ้นและบทคัดย่อที่กำหนดบริการที่ต่ำกว่าไว้ในแพ็คเกจเดียวกัน เลเยอร์ระดับล่างถูกสร้างขึ้นโดยการสืบทอด / การนำไปใช้ของคลาสนามธรรมหรืออินเทอร์เฟซเหล่านี้ Martin, Robert C. (2003)

  • หลักการและรูปแบบและวิธีการพัฒนาซอฟต์แวร์แบบว่องไว ศิษย์ฮอลล์. pp. 127–131 ไอ 978-0135974445

1
ไม่มีความแตกต่างระหว่างการยอมรับคลาสนามธรรมหรือคลาสคอนกรีต (ไม่ใช่ขั้นสุดท้าย) และความแตกต่างของอินเทอร์เฟซนั้นไม่มากไปกว่านั้น ตราบใดที่อินสแตนซ์ถูกส่งเป็นพารามิเตอร์และไม่ได้กำหนดค่าตายตัวในการนำไปใช้งานของคุณคุณจะมีพื้นฐานสำหรับ DI
Jacob Raihle

@JacobRaihle คุณหมายความว่าอย่างไรโดยผ่านอินสแตนซ์ที่กำหนดรหัสยากลำบากในการนำไปใช้
Tulains Córdova

ฉันพูดว่า "ตราบใดที่มันผ่านไปแล้วและไม่ได้เขียนโค้ดยาก" สิ่งที่ฉันหมายถึงคือเนื่องจากInterfaceอินเทอร์เฟซยอมรับCustomExceptionและปล่อยให้ผู้เรียกจัดหาหนึ่งผู้เรียกมีอิสระที่จะให้คลาสใด ๆ ที่ขยายCustomExceptionแม้ว่าCustomExceptionจะเป็นคลาสคอนกรีต - ซึ่งคงเป็นไปไม่ได้หากInterfaceรับผิดชอบต่อการสร้าง มัน. การผกผันของการควบคุมนี้ moreso กว่าการทำงานกับอินเทอร์เฟซ (แม้ว่าจะช่วยได้อย่างแน่นอน) เป็นสิ่งที่ฉันคิดว่า DI เป็นเรื่องเกี่ยวกับ
Jacob Raihle

@JacobRaihle "ในแอปพลิเคชันโดยตรงของการพึ่งพาการกลับกันบทคัดย่อเป็นเจ้าของโดยชั้นบน / นโยบายสถาปัตยกรรมนี้จัดกลุ่มส่วนประกอบ / นโยบายที่สูงขึ้นและบทคัดย่อที่กำหนดบริการที่ต่ำกว่าเข้าด้วยกันในแพ็คเกจเดียวกัน โดยการสืบทอด / การนำคลาสนามธรรมหรืออินเตอร์เฟสไปใช้ " Martin, Robert C. (2003) การพัฒนาซอฟต์แวร์หลักการรูปแบบและการปฏิบัติที่คล่องตัว ศิษย์ฮอลล์. pp. 127–131 ไอ 978-0135974445
Tulains Córdova

จุดของคลาสนามธรรมคืออะไรถ้าคุณสามารถให้ค่าดีฟอลต์ที่สมเหตุสมผลได้? คุณเสียอะไรจากการจัดหาสิ่งนั้น? อย่าเพียงแค่อ้างหนังสือ
Jacob Raihle

2

Tulains นั้นถูกต้อง - อินเตอร์เฟสขึ้นอยู่กับคลาสที่เป็นรูปธรรมตลอดเวลา พวกเขาตั้งใจจะสร้างสัญญาสำหรับข้อกังวลของตนเองเท่านั้น สัญญานั้นอาจเกี่ยวข้องกับการรับและส่งคืนข้อมูลทุกชนิด

โปรดจำไว้ว่าในภาษาระดับสูงกว่าประเภทดั้งเดิมแม้จะไม่ดั้งเดิม ดังนั้นคุณจะทำงานกับประเภทคอนกรีตต่อไป!


0

ฉันคิดว่าชื่อคุณหมายถึงชั้นเรียนจริงของตัวเอง หากคุณพยายามระบุชื่อคลาสข้อยกเว้นตามจริงเพื่อเริ่มต้นข้อยกเว้นที่สอดคล้องกันผ่าน Reflection นี่ไม่ใช่วิธีที่ถูกต้อง

ถ้าคุณต้องการใช้คลาสที่กำหนดเองในอินเทอร์เฟซแน่นอนว่าคุณสามารถใช้คลาสของคุณเองในอินเตอร์เฟสของคุณเองได้ คลาสจะกลายเป็นส่วนหนึ่งของส่วนต่อประสานสาธารณะของไลบรารี / API ของคุณ โครงสร้างข้อมูลและข้อยกเว้นเป็นตัวอย่างที่ดีของคลาสที่มักใช้โดยอินเทอร์เฟซ

หากคุณต้องการใช้ข้อยกเว้นที่แตกต่างกันขึ้นอยู่กับบริบทคุณอาจสนใจใช้ยาชื่อสามัญ


ไม่ฉันไม่ได้หมายถึงการสะท้อน ใช่ตามที่คุณกล่าวถึงข้อยกเว้นและโครงสร้างข้อมูลสามารถใช้ในส่วนต่อประสานได้เนื่องจากมันมีข้อมูลอยู่และไม่ใช่แพลตฟอร์มหรือขึ้นอยู่กับคลาสอื่น ๆ ขอบคุณ.
nikachx

2
คำตอบที่ถามคำถาม OP ... เพียงแค่ถามในความคิดเห็นจากนั้นให้คำตอบของคุณ
Snoop

1
@StevieV: ย่อหน้าแรกเป็นคำถามเชิงโวหารมากกว่า และตามที่แสดงโดยความคิดเห็นของ OP ฉันจริง ๆ ตอบคำถามของ OP
Arseni Mourzenko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.