คำถามติดแท็ก interfaces

คำถามเกี่ยวกับข้อควรพิจารณาเกี่ยวกับการออกแบบส่วนต่อประสานเช่นการเขียนโปรแกรมไปยังส่วนต่อประสาน

11
ทำไม PHP ถึงมีอินเตอร์เฟส?
ฉันสังเกตเห็นว่าใน PHP5 มีการเพิ่มส่วนต่อประสานกับภาษา อย่างไรก็ตามเนื่องจาก PHP ถูกพิมพ์อย่างหลวม ๆ ดูเหมือนว่าประโยชน์ส่วนใหญ่ของการใช้ส่วนต่อประสานจะหายไป ทำไมสิ่งนี้จึงรวมอยู่ในภาษา

8
Default vs Impl เมื่อใช้งานอินเตอร์เฟสใน Java
หลังจากอ่านชื่อแพคเกจควรเป็นเอกพจน์หรือพหูพจน์หรือไม่? มันเกิดขึ้นกับฉันว่าฉันไม่เคยเห็นการอภิปรายที่เหมาะสมซึ่งครอบคลุมหนึ่งในสัตว์เลี้ยงของฉัน: การตั้งชื่อการใช้งานอินเทอร์เฟซ สมมติว่าคุณมีอินเทอร์เฟซOrderที่ตั้งใจจะนำไปใช้ในหลากหลายวิธี แต่มีเพียงการเริ่มต้นเมื่อโครงการถูกสร้างขึ้นครั้งแรก คุณไปเพื่อDefaultOrderหรือOrderImplหรือตัวแปรอื่น ๆ เพื่อหลีกเลี่ยงการแยกขั้วเท็จ? และคุณจะทำอย่างไรเมื่อมีการใช้งานเพิ่มขึ้นมา? และที่สำคัญที่สุด ... ทำไม

4
แนวคิดการใช้งาน Model-View-Presenter
ฉันพยายามเข้าใจวิธีนำ decoupling ที่ดีระหว่าง UI และโมเดลมาใช้ แต่ฉันมีปัญหาในการหาตำแหน่งที่จะแบ่งเส้นตรง ฉันได้ดู Model-View-Presenter แล้ว แต่ฉันไม่แน่ใจว่าจะนำไปใช้อย่างไร ตัวอย่างเช่นมุมมองของฉันมีหลายกล่องโต้ตอบ .. ควรมีคลาส View พร้อมอินสแตนซ์ของแต่ละกล่องโต้ตอบหรือไม่? จากนั้นในกรณีนั้นกล่องโต้ตอบควรโต้ตอบกับผู้นำเสนออย่างไร กล่าวคือ ถ้าไดอะล็อกแต่ละรายการต้องการขอข้อมูลจาก Model ผ่าน Presenter กล่องโต้ตอบนั้นควรได้รับการอ้างอิงไปยัง Presenter อย่างไร ผ่านการอ้างอิงไปยังมุมมองที่ให้ไว้ในระหว่างการก่อสร้าง? ฉันคิดว่าบางทีมุมมองที่ควรจะเป็นระดับคงที่? จากนั้นกล่องโต้ตอบ GetView และรับผู้นำเสนอจากที่นั่น ... ฉันกำลังคิดเกี่ยวกับการตั้งค่าผู้นำเสนอด้วยความเป็นเจ้าของมุมมองและรูปแบบ (ตรงข้ามกับมุมมองที่มีผู้นำเสนอและผู้นำเสนอมีรูปแบบ) และผู้นำเสนอลงทะเบียนการเรียกกลับสำหรับกิจกรรมในมุมมอง แต่นั่นทำให้ดูเหมือนมาก คู่เพิ่มเติม (หรือภาษาขึ้นอยู่กับอย่างน้อย) ฉันพยายามที่จะ: ทำให้เป็น decoupled มากที่สุด ทำให้เป็นไปได้ที่จะจับคู่ Presenter / Model กับมุมมองของภาษาอื่น ๆ (ฉันไม่ได้ทำเรื่องระหว่างภาษา แต่ฉันรู้ว่ามันเป็นไปได้โดยเฉพาะยิ่งvoid(void)ฉันสามารถติดแอพ C # …

3
ถ้าฉันใช้อินเทอร์เฟซจะเรียกว่าการสืบทอด?
ถ้าชั้นเรียนของฉันimplementsมีอินเตอร์เฟซฉันจะบอกได้ไหมว่าฉันกำลังติดตามมรดกอยู่? ฉันรู้ว่าเมื่อเรียนextendsอีกชั้นหนึ่งแล้วมันเป็นมรดก

5
การนำอินเตอร์เฟสไปใช้เมื่อคุณไม่ต้องการคุณสมบัติใดคุณสมบัติหนึ่ง
ตรงไปตรงมาสวย ฉันกำลังใช้อินเทอร์เฟซ แต่มีคุณสมบัติหนึ่งที่ไม่จำเป็นสำหรับคลาสนี้และอันที่จริงแล้วไม่ควรใช้ แนวคิดแรกของฉันคือทำสิ่งที่ชอบ: int IFoo.Bar { get { raise new NotImplementedException(); } } ฉันคิดว่าไม่มีอะไรผิดปกติกับเรื่องนี้ แต่มันก็ไม่รู้สึก "ถูก" มีใครเคยเจอสถานการณ์ที่คล้ายกันมาก่อนหรือไม่ ถ้าเป็นเช่นนั้นคุณเข้าหามันได้อย่างไร?

6
ดีกว่าที่จะมี 2 วิธีด้วยความหมายที่ชัดเจนหรือเพียง 1 วิธีใช้คู่?
หากต้องการทำให้อินเทอร์เฟซง่ายขึ้นจะดีกว่าgetBalance()ไหมที่ไม่มีวิธี? การส่งผ่าน0ไปยังcharge(float c);จะให้ผลลัพธ์เดียวกัน: public class Client { private float bal; float getBalance() { return bal; } float charge(float c) { bal -= c; return bal; } } อาจจดบันทึกในjavadoc? หรือเพียงแค่ปล่อยให้ผู้ใช้ระดับชั้นเรียนรู้วิธีการรับยอดคงเหลือ
30 interfaces  cqrs 

4
เหตุใด. .compareTo () ในอินเทอร์เฟซในขณะที่. equals () อยู่ในคลาสใน Java
ฉันต้องการทราบว่าทำไมถึง.compareTo()อยู่ในComparableอินเทอร์เฟซในขณะที่วิธีการเช่น.equalsนั้นอยู่ในObjectชั้นเรียน สำหรับฉันดูเหมือนว่า.compareTo()จะไม่มีวิธีการเช่นนั้นอยู่ในObjectชั้นเรียนอยู่แล้ว ที่จะใช้.compareTo()คุณใช้Comparableอินเตอร์เฟซและใช้.compareTo()วิธีการเพื่อวัตถุประสงค์ของคุณ สำหรับทาง.equals()วิธีการคุณเพียงแค่แทนที่วิธีการในชั้นเรียนของคุณเนื่องจากชั้นเรียนทั้งหมดได้รับมรดกจากObjectชั้นเรียน คำถามของฉันคือเหตุใดจึงมีวิธีการ.compareTo()ในอินเทอร์เฟซที่คุณใช้งานมากกว่าในคลาสอย่างObject? เช่นเดียวกันทำไมจึงเป็น.equals()วิธีการในชั้นเรียนObjectและไม่ได้อยู่ในอินเตอร์เฟซบางอย่างที่จะดำเนินการ?

10
เชื่อมต่อกับคลาสนามธรรม
เพื่อนร่วมงานของฉันและฉันมีความเห็นต่างกันเกี่ยวกับความสัมพันธ์ระหว่างคลาสพื้นฐานและอินเทอร์เฟซ ฉันเชื่อว่าคลาสไม่ควรใช้อินเทอร์เฟซเว้นแต่ว่าคลาสนั้นสามารถใช้ได้เมื่อต้องการการใช้อินเทอร์เฟซ กล่าวอีกนัยหนึ่งฉันชอบที่จะเห็นรหัสเช่นนี้: interface IFooWorker { void Work(); } abstract class BaseWorker { ... base class behaviors ... public abstract void Work() { } protected string CleanData(string data) { ... } } class DbWorker : BaseWorker, IFooWorker { public void Work() { Repository.AddCleanData(base.CleanData(UI.GetDirtyData())); } } DbWorker คือสิ่งที่ได้รับอินเตอร์เฟส IFooWorker เนื่องจากเป็นการใช้งานอินเทอร์เฟซที่รวดเร็ว สมบูรณ์ตามสัญญา …

6
ทำความเข้าใจกับ“ การเขียนโปรแกรมไปยังส่วนต่อประสาน”
ฉันเจอคำว่า "การเขียนโปรแกรมไปยังอินเทอร์เฟซแทนที่จะใช้งาน" มากและฉันคิดว่าฉันเข้าใจความหมายของมัน แต่ฉันต้องการให้แน่ใจว่าฉันเข้าใจถึงประโยชน์และการใช้งานที่เป็นไปได้ "การเขียนโปรแกรมไปยังอินเทอร์เฟซ" หมายความว่าเมื่อเป็นไปได้เราควรอ้างถึงระดับนามธรรมของคลาส (อินเทอร์เฟซคลาสนามธรรมหรือบางครั้งเป็นซูเปอร์คลาสของการเรียงลำดับบางอย่าง) แทนที่จะอ้างถึงการใช้งานที่เป็นรูปธรรม ตัวอย่างทั่วไปใน Java คือการใช้: List myList = new ArrayList();ArrayList myList = new ArrayList();แทน ฉันมีคำถามสองข้อเกี่ยวกับเรื่องนี้: ฉันต้องการให้แน่ใจว่าฉันเข้าใจถึงประโยชน์หลักของวิธีนี้ ฉันคิดว่าประโยชน์ส่วนใหญ่มีความยืดหยุ่น การประกาศวัตถุเป็นข้อมูลอ้างอิงระดับสูงมากกว่าการนำไปปฏิบัติอย่างเป็นรูปธรรมช่วยให้มีความยืดหยุ่นและบำรุงรักษาได้มากขึ้นตลอดวงจรการพัฒนาและตลอดทั้งรหัส ถูกต้องหรือไม่ ความยืดหยุ่นเป็นประโยชน์หลักหรือไม่? มีวิธีเพิ่มเติมในการ 'เขียนโปรแกรมไปยังส่วนต่อประสาน' หรือไม่? หรือ "การประกาศตัวแปรเป็นอินเตอร์เฟสแทนที่จะใช้อย่างเป็นรูปธรรม" เป็นการนำแนวคิดนี้ไปปฏิบัติเท่านั้น ฉันไม่ได้พูดคุยเกี่ยวกับการเชื่อมต่อสร้าง Java ฉันกำลังพูดถึงหลักการ OO "การเขียนโปรแกรมไปยังส่วนต่อประสานไม่ใช่การใช้งาน" ในหลักการนี้"อินเตอร์เฟซ" ของโลกหมายถึง "supertype" ใด ๆ ของคลาส - อินเทอร์เฟซคลาสนามธรรมหรือซูเปอร์คลาสธรรมดาซึ่งเป็นนามธรรมและคอนกรีตน้อยกว่าคลาสย่อยที่เป็นรูปธรรมมากขึ้น

11
การประกาศอินเตอร์เฟสในไฟล์เดียวกับคลาสพื้นฐานมันเป็นการปฏิบัติที่ดีหรือไม่?
เพื่อให้สามารถเปลี่ยนได้และทดสอบได้ปกติบริการที่มีตรรกะต้องมีส่วนต่อประสานเช่น public class FooService: IFooService { ... } การออกแบบที่ชาญฉลาดฉันเห็นด้วยกับสิ่งนี้ แต่หนึ่งในสิ่งที่รบกวนฉันด้วยวิธีนี้คือสำหรับบริการเดียวคุณจะต้องประกาศสองสิ่ง (คลาสและส่วนต่อประสาน) และในทีมของเราโดยปกติสองไฟล์ (หนึ่งไฟล์ สำหรับคลาสและอีกอันสำหรับอินเตอร์เฟส) ความไม่สะดวกสบายอีกประการคือความยากลำบากในการนำทางเนื่องจากการใช้ "ไปที่คำจำกัดความ" ใน IDE (VS2010) จะชี้ไปที่อินเทอร์เฟซ (เนื่องจากคลาสอื่นอ้างอิงถึงอินเทอร์เฟซ) ไม่ใช่คลาสจริง ฉันคิดว่าการเขียน IFooService ในไฟล์เดียวกับ FooService จะลดความแปลกประหลาดข้างต้น ท้ายที่สุด IFooService และ FooService มีความเกี่ยวข้องกันมาก นี่เป็นวิธีปฏิบัติที่ดีหรือไม่? มีเหตุผลที่ดีที่ IFooService จะต้องอยู่ในไฟล์ของตัวเองหรือไม่?

9
การตั้งชื่ออินเทอร์เฟซ: คำนำหน้า 'Can-' เทียบกับคำต่อท้าย 'สามารถ'
เป็นเรื่องปกติที่จะใช้ '-able' เป็นคำต่อท้ายสำหรับอินเทอร์เฟซเช่น สามารถยิงได้แบบหมุนได้ ฉันคิดว่า 'Can-' อาจจะดีกว่าเพราะอาจเป็นคำอธิบายที่มากกว่า ใช่มันเป็นถ้อยคำมากขึ้นและเพิ่มเสียงให้กับชื่ออินเตอร์เฟส โดยเฉพาะอย่างยิ่งคำกริยาแฝงสามารถนำมาใช้ เช่น 1หมายถึง Shootable หมายความว่าวัตถุสามารถยิงได้ (ปืนอาจใช้สิ่งนี้) หรือหมายความว่าสามารถยิงได้ (บอร์ดเป้าหมายอาจใช้สิ่งนี้) ด้วยคำนำหน้า 'Can-' อดีตจะเป็น "CanShoot" และส่วนหลังจะเป็น "CanBeShotAt" หรือ "CanShootAt" เช่น 2เอกสาร 'CanBePrinted' และเครื่องพิมพ์ 'CanPrint' หรือเราควรใช้ '-Able' และให้เอกสารอธิบายบริบทหรือไม่ ความคิดเห็นใด ๆ
29 api  interfaces 

2
รูปแบบ (anti) รูปแบบต่อไปนี้คืออะไร? อะไรคือข้อดีและข้อเสีย?
ในช่วงสองสามเดือนที่ผ่านมาฉันสะดุดเทคนิค / รูปแบบต่อไปนี้สองสามครั้ง อย่างไรก็ตามฉันไม่สามารถหาชื่อเฉพาะได้และฉันก็ไม่แน่ใจ 100% เกี่ยวกับข้อดีและข้อเสียทั้งหมด รูปแบบไปดังนี้: ภายในอินเตอร์เฟส Java ชุดของวิธีการทั่วไปจะถูกกำหนดตามปกติ อย่างไรก็ตามการใช้คลาสภายในอินสแตนซ์เริ่มต้นจะถูกปล่อยออกมาผ่านส่วนต่อประสาน public interface Vehicle { public void accelerate(); public void decelerate(); public static class Default { public static Vehicle getInstance() { return new Car(); // or use Spring to retrieve an instance } } } สำหรับฉันดูเหมือนว่าข้อได้เปรียบที่ใหญ่ที่สุดคือความจริงที่ว่าผู้พัฒนาต้องการทราบเกี่ยวกับอินเทอร์เฟซไม่ใช่การใช้งานเช่นในกรณีที่เขาต้องการสร้างอินสแตนซ์อย่างรวดเร็ว Vehicle someVehicle = Vehicle.Default.getInstance(); …

2
การใช้คลาสนามธรรมและอินเทอร์เฟซที่เป็นนามธรรม
แม้ว่าสิ่งนี้จะไม่ได้บังคับในมาตรฐาน C ++ แต่ดูเหมือนว่าวิธี GCC เช่นใช้คลาสผู้ปกครองรวมถึงนามธรรมที่บริสุทธิ์คือการรวมตัวชี้ไปยังตาราง v สำหรับคลาสนามธรรมนั้นในทุกอินสแตนซ์ของคำถาม . โดยปกติแล้วสิ่งนี้จะขยายขนาดของอินสแตนซ์ของคลาสนี้โดยตัวชี้สำหรับคลาสพาเรนต์ทั้งหมดที่มี แต่ฉันสังเกตเห็นว่าคลาส C และโครงสร้างจำนวนมากมีอินเทอร์เฟซหลักมากมายซึ่งโดยทั่วไปแล้วเป็นคลาสนามธรรมที่บริสุทธิ์ ฉันจะแปลกใจถ้าทุกครั้งที่พูดDecimalถูกป่องด้วย 6 ตัวชี้ไปยังทุกมันเป็นอินเทอร์เฟซต่าง ๆ ดังนั้นถ้า C # ทำอินเตอร์เฟสแตกต่างกันอย่างน้อยในการใช้งานทั่วไป (ฉันเข้าใจว่ามาตรฐานตัวเองอาจไม่ได้กำหนดการนำไปใช้) และการใช้งาน C ++ มีวิธีหลีกเลี่ยงการขยายขนาดวัตถุเมื่อเพิ่มผู้ปกครองเสมือนบริสุทธิ์ให้กับชั้นเรียนหรือไม่?

8
การออกแบบส่วนต่อประสานที่จำเป็นต้องเรียกใช้ฟังก์ชันในลำดับเฉพาะ
ภารกิจคือการกำหนดค่าชิ้นส่วนของฮาร์ดแวร์ภายในอุปกรณ์ตามข้อกำหนดคุณสมบัติป้อนข้อมูลบางอย่าง สิ่งนี้ควรจะทำได้ดังนี้: 1) รวบรวมข้อมูลการกำหนดค่า สิ่งนี้สามารถเกิดขึ้นได้ในเวลาและสถานที่ต่างกัน ตัวอย่างเช่นโมดูล A และโมดูล B สามารถร้องขอ (ในเวลาที่ต่างกัน) ทรัพยากรบางอย่างจากโมดูลของฉัน 'ทรัพยากร' เหล่านั้นเป็นสิ่งที่กำหนดค่าจริง 2) หลังจากเป็นที่ชัดเจนว่าจะไม่มีการรับคำร้องขออีกต่อไปคำสั่งเริ่มต้นซึ่งให้ข้อมูลสรุปของทรัพยากรที่ร้องขอต้องถูกส่งไปยังฮาร์ดแวร์ 3) หลังจากนั้นสามารถ (และต้อง) การกำหนดค่าโดยละเอียดของทรัพยากรดังกล่าวให้แล้วเสร็จ 4) นอกจากนี้หลังจาก 2) สามารถ (และต้อง) กำหนดเส้นทางของทรัพยากรที่เลือกไปยังผู้โทรที่ประกาศไว้ สาเหตุที่พบบ่อยสำหรับข้อบกพร่องแม้กระทั่งสำหรับฉันซึ่งเป็นผู้เขียนสิ่งนี้จะผิดคำสั่งนี้ ฉันสามารถใช้แบบแผนการตั้งชื่อการออกแบบหรือกลไกใดในการทำให้ส่วนต่อประสานสามารถใช้งานได้โดยผู้ที่เห็นรหัสเป็นครั้งแรก
24 c++  interfaces 

5
คุณพัฒนาและปรับรุ่นอินเทอร์เฟซอย่างไร
สมมติว่าคุณมีอินเทอร์เฟซIFoo: public interface IFoo { void Bar(string s); int Quux(object o); } ใน API รุ่นที่ 2 ของคุณคุณจะต้องเพิ่มวิธีGlargการในอินเทอร์เฟซนี้ คุณจะทำเช่นนั้นได้อย่างไรโดยไม่ทำลายผู้ใช้ API ที่มีอยู่และรักษาความเข้ากันได้ย้อนหลัง นี่คือจุดมุ่งหมายหลักที่. NET แต่สามารถนำไปใช้กับกรอบและภาษาอื่น ๆ เช่นกัน

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