อะไรคือเหตุผลเบื้องหลัง“ I” แบบแผนการตั้งชื่อนำหน้าสำหรับอินเตอร์เฟสใน. NET?


10

ฉันรู้ว่าการประชุม "ฉัน" เป็นเรื่องที่เกิดขึ้นตั้งแต่ COM แต่ฉันไม่เคยเข้าใจเลยว่าทำไมมันถึงไม่ได้รับการพิจารณาเหมือนการประชุมตั้งชื่ออื่น ๆ ทุกครั้งก่อนที่.

การบริโภคที่ชาญฉลาดสิ่งเดียวที่แยกอินเทอร์เฟซออกจากกันคือคลาสนามธรรมคือพวกมันสามารถสืบทอดได้หลายทาง แต่ทุกอย่างหลังจาก Visual Studio 2003 ได้แสดงลายเซ็นประเภทในคำแนะนำเครื่องมือมันไม่มีประโยชน์เหมือนกับสัญลักษณ์ฮังการีอื่น ๆ ทั้งหมดที่ถูกทิ้งไป

ฉันคิดว่าอาจเป็นเช่นนั้นเพื่อให้คุณสามารถใช้งานอินเทอร์เฟซพื้นฐานที่มีชื่อเดียวกันเช่นการMessageสืบทอดIMessageแต่ไลบรารี NET ส่วนใหญ่ได้หายไปสำหรับการเพิ่มคำว่า "Base" ที่ท้าย (เช่นSystem.Collections.ReadOnlyCollectionBase) แทน - และสิ่งนี้ทำให้รู้สึกความหมายมากขึ้น

การทำงานร่วมกันของ COM น่าจะเป็นอีกเหตุผลหนึ่งที่เป็นไปได้ - แต่ไม่ใช่ว่าคลาสของ wrapper ที่มันสร้างนั้นมีความแปลกประหลาดอย่างสมบูรณ์ใน. NET ดังนั้นฉันจึงสงสัยว่านั่นเป็นการพิจารณาด้านสุนทรียภาพ

ในโครงการใหม่ของฉันฉันลืมการประชุมทั้งหมดและรู้สึกดี มีบางอย่างที่ฉันขาดหายไปหรือไม่?


1
คุณไม่ได้รับส่วนต่อประสานเพื่อเติมเต็มความแตกต่างที่ยิ่งใหญ่
แดเนียล Little

นอกจากนี้ดูเหมือนว่าชอบการตั้งค่าเช่น IList และรายการซึ่งตรงข้ามกับรายการและ ArrayList พวกเขาอาจทำเพราะ IList ไม่ใช่ ListBase แต่จริงๆแล้วคือ ListInterface (ไม่ใช่ List of interface interface) หากคุณได้รับสิ่งที่ฉันหมายถึง
แดเนียล Little

@Lavinski In .NET IListเป็นคำทั่วไปสำหรับคอลเลกชันที่ต่อเนื่องและต่อเนื่องการเข้าถึงแบบสุ่มในขณะที่Listการเข้าถึงแบบต่อเนื่องที่ต่อเนื่องและต่อเนื่องจะเพิ่มขึ้นเรื่อยๆ ผมคิดว่า F # มีมันขวาใน aliasing ListจะResizeArray; นั่นเป็นชื่อที่สื่อความหมายได้มากกว่า IListถ้าListอย่างนั้นก็คงไม่เป็นเช่นนั้น
Rei Miyasaka

2
IBaseBall และ IBaseBallBase เหมาะสมกับฉันมากกว่า BaseBallBase และ BaseBallBaseBase (ตัวอย่างที่โง่เขลาฉันรู้: D)
e-MEE

@ e-MEE โง่อย่างเท่าเทียมกันจะเป็น IIRC ซึ่งอาจเป็นอินเทอร์เฟซสำหรับโพรโทคอลการแชทของ IRC หรือตัวย่อของ "ถ้าฉันจำไม่ผิด"
Rei Miyasaka

คำตอบ:


12

ฉันคิดว่านี่อาจเป็นกรณีเดียวเมื่อคำนำหน้ามีประโยชน์

คลาสและอินเทอร์เฟซมีความหมายที่แตกต่างกันจริง ๆ และเนื่องจากทั้งสองเป็นชนิดจึงผสมกันได้ง่าย
เมื่อฉันเห็นการประกาศในชั้นเรียนฉันสามารถบอกได้ทันทีว่ามันมาจากอะไรและใช้อย่างไร :

public sealed class ActivityCollection : List<Activity>, 
    IList<Activity>, ICollection<Activity>, IEnumerable<Activity>, 
    IList, ICollection, IEnumerable

มันจะยากกว่าที่จะเข้าใจถ้านิยามดูเหมือน

public sealed class ActivityCollection : ListClass<Activity>, 
    List<Activity>, Collection<Activity>, Enumerable<Activity>, 
    List, Collection, Enumerable

และคุณจะโทรListClassอย่างไร เห็นได้ชัดว่าไม่ใช่เพียงListBaseเพราะมันสามารถใช้งานได้ด้วยตัวเอง
ดังนั้นเราต้องแก้ปัญหาที่เราเพิ่งคิดค้นหรือปรับใช้คำนำหน้าที่แยกคลาสออกจากอินเตอร์เฟสซึ่งเป็นสิ่งที่นักออกแบบ. NET Framework ทำ

นอกจากนี้โดยส่วนตัวแล้วฉันพบว่ามีประโยชน์เมื่อฉันสามารถบอกได้จากลายเซ็นวิธีการที่ใช้งานได้กับส่วนต่อประสาน

public void PrintLines (IEnumerable<string> source)

มันเหมือนสัญญาณที่จะบอกฉัน: เฮ้ฉันสามารถทำสิ่งนี้ได้! ฉันสามารถให้อาหารวิธีที่ตรงกับสัญญา

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

โดยวิธีการที่ไม่เพียง แต่อินเตอร์เฟซที่มีคำนำหน้าในระบบประเภท. NET อย่าลืมพารามิเตอร์ประเภททั่วไป:

public delegate TResult Func<in T, out TResult>(
    T arg
)

นี่เป็นสถานการณ์อื่นเมื่อเป็นประโยชน์อย่างมากที่สามารถแยกความแตกต่างระหว่างคลาสและประเภทอื่น


2
คุณสามารถเข้าใจได้อย่างง่ายดายว่าการรู้ว่า "คลาสแรกคือการสืบทอดคลาสที่สองขึ้นไปเป็นอินเตอร์เฟส"
Saeed Neamati

3
ดูเหมือนจะเป็นเหตุผลที่น่าเชื่อถือ Java ดูเหมือนว่าจะได้รับการแก้ไขอีกเล็กน้อยโดยการใช้คำหลักเพื่อชี้แจงรายการ: class Dog extends Mammal implements MailmanChaser. @Seed คุณสามารถมีคลาสที่ไม่สืบทอดจากสิ่งใดดังนั้นประเภทแรกในรายการจึงเป็นอินเทอร์เฟซแทนที่จะเป็นคลาสพื้นฐาน
Rei Miyasaka

+1 สำหรับส่วนตัวหนา แต่ฉันสามารถนึกถึงสถานที่อื่นที่การประชุมที่ใช้คำนำหน้าจะเป็นประโยชน์: เพื่อแยกความแตกต่างระหว่างเขตข้อมูลที่ห่อหุ้มความเป็นเจ้าของเฉพาะของint[](หรือวัตถุชนิดอื่นที่ไม่แน่นอน) ซึ่งสามารถกลายพันธุ์ได้ แชร์และสิ่งที่หุ้มในความเป็นเจ้าของร่วมของสิ่งint[]นั้นแม้ว่าประเภทของมันจะยอมให้มีการกลายพันธุ์ แต่ก็ไม่มีใครได้รับอนุญาตให้กลายพันธุ์
supercat

6

ฉันไม่คิดว่าคุณขาดอะไรไปมันเป็นแค่นิสัยในอดีต

ฉันเห็นด้วยกับคุณเช่นกันและได้ลดระดับ 'I' ลงในโครงการขนาดเล็กถึงขนาดกลางที่ไม่มีผลกระทบที่เป็นอันตราย


2
สิ่งที่แปลกคือว่าพวกเขาโยนออกมาในทางปฏิบัติอื่น ๆ ที่ล้าสมัยยกเว้นการประชุมนี้ ประวัติศาสตร์ไม่ได้อธิบายอย่างใดอย่างหนึ่ง ฉันยังคงรู้สึกว่าต้องมีเหตุผลเว้นแต่ว่ามันเป็นเพียงแค่การเมืองภายใน - แต่ถึงอย่างนั้นฉันก็ไม่สามารถเห็นเหตุผลที่ใคร ๆ ก็จะรู้สึกเสียใจกับการที่ฉันตกหล่น
Rei Miyasaka

2

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

อย่างไรก็ตามโดยส่วนตัวฉันเห็นด้วยอย่างยิ่งกับคุณในจุดที่เราสามารถใช้Animal Baseสำหรับอินเทอร์เฟซและAnimalสำหรับชั้นเรียนได้

ในทางกลับกันบางครั้งมีสองสิ่งที่ขัดแย้งกันมากซึ่งทีมตัดสินใจที่จะจัดให้มีการประชุมเพื่อป้องกันความขัดแย้งเพิ่มเติมแม้จะมีการตัดสินใจอยู่แล้ว ยกตัวอย่างเช่นใน ASP.NET MVC ทั้งผู้ชมบางส่วนและเลย์เอาต์ (หน้าหลัก) ก็เป็นเหมือนปกติดูในขณะที่พวกเขาทำหน้าที่การทำงานที่แตกต่างกัน ดังนั้นไมโครซอฟท์ทั้งๆที่เน้นไม่ได้ที่จะใช้ในการตั้งชื่อขีดขอให้ขีดเลย์เอาต์และบางส่วนผู้ชมด้วยการขีดเส้นใต้


มีอะไรผิดปกติกับAnimalInterfaceแทนที่จะAnimalBase? มันไม่ใช่คลาสพื้นฐานมันเป็นอินเตอร์เฟส
Scott Whitlock

3
แต่เกิดอะไรขึ้นกับ IAnimal แทนที่จะเป็น AnimalInterface แน่ใจว่าเราไปตลอดทางจนถึงจุดเริ่มต้น - ซึ่งเพิ่งไปแสดงว่าสัญลักษณ์ 'ฮังการี' บางอย่างมีประโยชน์ การขว้างพวกเขาออกไปทั้งหมด (ยกเว้น I และ T) เป็นความงุนงงมากกว่าความพยายามอย่างรอบคอบเพื่อค้นหาระบบที่ดีกว่า
gbjbaanb

2
@ScottWhitlock: สำหรับฉันIAnimalมันอ่านง่ายกว่าAnimalInterfaceมาก ชื่อที่ละเอียดกว่าจะดีกว่ายกเว้นในกรณีที่สามารถใช้การประชุมสั้น ๆ แบบง่าย ๆ สำหรับบางสิ่งที่เกิดขึ้นบ่อยครั้งพอ และอินเทอร์เฟซเป็นกรณีดังกล่าว
maaartinus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.