ทำไมเราไม่นำหน้า Enums, คลาส Abstract และ Structs?


11

ชุมชน C # ได้ใช้คำนำหน้า "I" อย่างแพร่หลายเพื่อแสดงถึงอินเทอร์เฟซที่แม้แต่โปรแกรมเมอร์ที่ไม่มีประสบการณ์มากที่สุดก็รู้ที่จะใช้

แล้วทำไมเราถึงไม่ใส่คำนำหน้า enums, คลาส abstract หรือ structs (อาจเป็น "E", "A" และ "S" ตามลำดับ)?

ตัวอย่างเช่นถ้าเราทำเครื่องหมายคลาสนามธรรมทั้งหมดด้วย "A" มันจะให้ข้อมูลที่มีค่าเกี่ยวกับประเภทนั้นซึ่งในขณะที่มันสามารถอนุมานได้ก็ไม่ชัดเจนทันที

โปรดทราบว่าฉันไม่ได้สนับสนุนการเปลี่ยนแปลงนี้ฉันแค่พยายามเข้าใจว่าทำไมเราไม่ทำสิ่งนี้

กระทู้นี้ตอบว่าทำไมเราถึงใช้คำนำหน้า "ฉัน" แต่ไม่ตอบว่าทำไมเราไม่ใช้คำนำหน้าอื่น ๆ


3
ฉันจะลงคะแนนเพื่อปิดซ้ำ แต่คำตอบคือ SO stackoverflow.com/questions/111933/…
Euphoric

1
@ ความสุข: คำถามนี้เฉพาะเจาะจงมากขึ้น
reinierpost


ควรหลีกเลี่ยง IMO Enums (แทนที่ด้วยสมาชิกแบบสแตติกแบบอ่านอย่างเดียวสาธารณะ (รูปแบบ enum)) คลาสนามธรรมควรมีคำต่อท้าย "ฐาน" และ struct ควรมีตัวพิมพ์เล็กเป็นแบบแผนการตั้งชื่อ แต่เนื่องจาก. NET ไม่ทำเช่นนั้น เพียงแค่สับสนถ้าคุณสร้างตัวพิมพ์เล็กเพราะมันจะไม่สอดคล้องกัน
Dave Cousineau

ทำไมคุณไม่หลีกเลี่ยงการใช้ enums เพื่อสร้าง psuedo enums
สตีเฟ่น

คำตอบ:


27

จุดประสงค์ของการตั้งชื่อการประชุมสำหรับอินเทอร์เฟซคือการให้การตัดสินใจที่รวดเร็วและไม่ต้องใช้สมองเกี่ยวกับสิ่งที่เรียกใช้อินเทอร์เฟซที่ชั้นเรียนของคุณใช้ หากคุณมีFrobnicatorแต่ต้องประกาศส่วนต่อประสานสำหรับการแยกหรือไม่ว่าด้วยเหตุผลอะไรก็ตามการตัดสินใจโทรหานั้นIFrobnicatorไม่จำเป็นต้องมีสติคิดและนี่เป็นสิ่งที่ดี

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

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


5
+1 นี่คือคำตอบที่ฉันอยากจะเขียน ฉันต้องการชี้ให้เห็นว่าที่คลาสนามธรรมมีการประชุมตั้งชื่อ cromulent อย่างสมบูรณ์แบบที่ระดับนามธรรมเป็นชื่อAnimalBaseและรสชาติที่แตกต่างกันมีAnimalGiraffe, AnimalLionฯลฯ
Binary Worrier

มันอาจจะคุ้มค่าที่จะกล่าวถึงอินเทอร์เฟซ Java จำนวนมากที่ไม่ได้ใช้ 'I' เช่นListเนื่องจากมีการตั้งชื่อทางเทคนิคมากArrayListและLinkedListเป็นชื่อของการใช้งาน (C # ผมเชื่อว่ามีIListเป็นอินเตอร์เฟซและListเป็นรายการอาร์เรย์)
Katana314

ฉันสงสัยว่ามันอาจจะเป็นประโยชน์หรือไม่กลับไปเมื่อใดเพื่อให้ Microsoft ได้แนะนำว่าตัวแปรของประเภทโครงสร้าง "ที่ไม่แน่นอน" จะได้รับคำนำหน้าเฉพาะเพื่อหลีกเลี่ยงความสับสนว่าPoint p = myPoints[3]; p.X += 3;จะมีผลกระทบmyPoints[3].Xหรือไม่ ย้อนหลังฉันจะต้องการให้ C # ใช้var->fieldสำหรับการเข้าถึงคลาสและvar.fieldสำหรับการเข้าถึงฟิลด์ของโครงสร้าง แต่แน่นอนไม่ ถึงกระนั้นก็ดูเหมือนว่าวิธีที่แตกต่างได้อย่างรวดเร็วของการแยกพวกเขาจะเป็นประโยชน์
supercat

1

ฉันคิดว่ามันไม่ได้ใช้มากเพราะ:

  • ส่วนใหญ่แล้วมันไม่ได้มีความสำคัญมากนักหากเป็น enum หรือคลาสนามธรรมหรือ struct
  • ถ้ามันเป็น mater ฉันอาจจะเห็นมันจากการใช้งานและหาวิธีอื่นอย่างรวดเร็ว
  • ถ้าฉันเปลี่ยนมันเป็น enum คลาสนามธรรมหรือ struct ฉันก็ต้องเปลี่ยนมัน
  • สำหรับคนที่ไม่ทราบว่าการประชุมเป็นเสียงที่บริสุทธิ์
  • ผู้คนอาจจะละทิ้งความคิดทั้งหมดเพราะพวกเขาได้รับการสอนว่าไม่ใช้สัญกรณ์ฮังการี มีและยังมีคนที่บอกว่าคุณไม่ควรใช้สัญกรณ์ Hungarion โดยไม่แยกความแตกต่างระหว่าง Apps Hungarian และ Systems Hungarian สามารถพบการสนทนาที่ดีในคำถาม SOนี้ ไม่ใช่แค่คำตอบแรกที่น่าสนใจ แต่มีคำตอบและความคิดเห็นที่ยอดเยี่ยม จากคำถามเดียวกันนี้บทความนี้โดย Joel Spolsky (เลื่อนไปที่ย่อหน้า "ฉันฮังการี")

กล่าวโดยย่อ: โดยทั่วไปมูลค่าเพิ่มไม่ได้รวมอยู่ในต้นทุน

จากกระสุนนัดสุดท้ายและการตีความบางอย่างคุณสามารถสรุปได้ ระบบฮังการี (ประเภทคำนำหน้า) ไม่ดีและไม่ควรใช้ แอป Hungarian (ชนิดนำหน้า) ใช้งานอยู่

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

ฉันเดาว่าผู้คนสังเกตเห็นว่ามันเป็นวัสดุสำหรับการเชื่อมต่อบ่อยกว่าและนั่นเป็นสาเหตุว่าทำไมมันจึงกลายเป็นกฎทั่วไปสำหรับอินเทอร์เฟซ


-1

แค่ความคิด (ใช้งานได้หวังว่า):

มีแนวโน้มที่ชัดเจนในการ 'เข้ารหัสไปยังส่วนต่อประสาน' มากกว่าคลาสที่เป็นรูปธรรม "ทุกวันนี้" มันเกือบจะเป็นประโยชน์มากกว่าที่จะมีการตั้งชื่อแบบแผนสำหรับชั้นเรียนเช่นเริ่มต้นด้วย 'C' แทนที่จะมีตัวอักษร 'I' สำหรับอินเทอร์เฟซ

ฉันเพิ่งจบโครงการ Java ที่อินเตอร์เฟซทั้งหมดถูกเรียกว่าแบบจำลองจริง ๆ .. การประชุมชื่ออินเทอร์เฟซคือการสิ้นสุดชื่อด้วย 'รุ่น' ... แล้วมี 'DataTransferObject / DTO' บางชนิดใช้อินเตอร์เฟสเป็น :

public interface SomethingModel{
}

public class Something implements SomethingModel{
    //lets not line up braces and make it hard to read
    //at least it saves one line
}

ในขณะที่ C #

public interface ISomething{}

public class SomethingModel : ISomething
{
   //i can read this
}

ให้รางวัลแก่สมองของฉันเพื่อรักษาความเจ็บปวดไว้ตรงนั้น แต่ฉันเห็นได้ว่ามันอาจช่วยให้คิดว่าเป็นเงื่อนไขของการเขียนโปรแกรมไปยังส่วนต่อประสานได้อย่างไร

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