อนุสัญญาการตั้งชื่อแบบใดที่จะใช้สำหรับพารามิเตอร์ฟังก์ชัน C #


14

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

ตัวอย่าง,

void MyFunc(BaseClass myPara)
{
  DerivedClass _mypara = (BaseClass)myPara;
}

หรือในทางตรงกันข้าม

void MyFunc(BaseClass _myPara)
{
  DerivedClass mypara = (BaseClass)_myPara;
}

หรืออนุสัญญาอื่น ๆ


1
อะไรก็ตามที่คุณได้รับคำตอบด้านล่างนี้มีเครื่องมือเล็กน้อยในการวิเคราะห์และบังคับใช้กฎแบบโวหาร: archive.msdn.microsoft.com/sourceanalysis
Patrick Hughes

คำตอบ:


11

คำนำหน้าพารามิเตอร์หรือตัวแปรท้องถิ่นที่มีเครื่องหมายขีดล่างนั้นไม่ได้เป็นสำนวนที่ค่อนข้างมากใน C # มันไม่ง่ายที่จะอ่านและไม่ได้ใช้บ่อยนัก (แม้ว่าจะถูกกฎหมายแล้วก็ตาม

ชื่อที่ดีที่สุดสำหรับพารามิเตอร์และตัวแปรคือชื่อที่สื่อความหมาย คุณต้องคิดว่าทำไมคุณถึงเปลี่ยนประเภทเหตุผลสำหรับนักแสดงคืออะไร จากนั้นคุณควรจะได้ชื่อที่แตกต่างกัน 2 ชื่อ เช่นคุณผ่าน "คน" และแปลงเป็น "ลูกค้า" จากนั้นคุณสามารถใช้บุคคลและ / หรือลูกค้าในชื่อตัวแปรได้

หากคุณนึกไม่ออกว่ามีชื่อแตกต่างกัน 2 ชื่อฉันจะใช้ชื่อ "เป็น" ในชื่อ ( มีคำถามในไซต์นี้เมื่อสองสามวันก่อนเกี่ยวกับเรื่องนี้ ) เช่นคุณจะใช้ "myParaAsDerived" สำหรับตัวแปรโลคอล

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


เพียงตรวจสอบอีกครั้ง (ฉันไม่คุ้นเคยกับ C #) ขีดเส้นใต้ชั้นนำจริงๆ "ถูกต้อง" ถูกกฎหมายใน C #? ใน C และ C ++ ตัวบ่งชี้ที่มีเครื่องหมายขีดล่าง (หรือสองเท่า) ถูกสงวนไว้ดังนั้นแม้ว่าจะถูกกฎหมายในแง่หนึ่งคุณก็ไม่ควรกำหนดตัวระบุของคุณเองเช่นนั้น csharp.comsci.us/etymology/identifiers.htmlแนะนำ C # อาจคล้ายกัน (ดูด้านล่าง "ข้อ จำกัด " สุดท้าย) แต่ไม่ได้พูดว่า "สงวน" จริง ๆ
Steve314

เครื่องหมายขีดล่างชั้นนำถูกกฎหมายอย่างสมบูรณ์ใน C # และไม่ได้สงวนไว้ภายใต้อนุสัญญาใด ๆ ที่ฉันรู้
Steve

9

ใช้ครั้งแรก

void MyFunc(BaseClass _myPara)
{
} 

เห็นได้ชัดว่าผิด! เนื่องจากมาตรฐานการเข้ารหัส c # จำนวนมากใช้คำนำหน้า“ _” ในทุกชื่อฟิลด์ ! รหัสคุณต้องเข้าใจง่ายโดยโปรแกรมเมอร์คนอื่น ๆ ดังนั้นโค้ดไม่ควรเขียนในลักษณะที่จะทำให้โปรแกรมเมอร์ C # เข้าใจผิดมาก

ได้รับประโยชน์ทั้งหมดของวิธีการขนาดเล็กโดยส่วนตัวฉันไม่เห็นความต้องการใด ๆ สำหรับการประชุมการตั้งชื่อเพื่อแยกตัวแปรท้องถิ่นจากพารามิเตอร์ หากวิธีการของคุณมีพารามิเตอร์จำนวนมากและตัวแปรในตัวเครื่องซึ่งคุณไม่สามารถบอกได้ว่าเกิดอะไรขึ้นหากไม่มีข้อตกลงการตั้งชื่อคุณจะมีปัญหาใหญ่กว่า (นี่ครอบคลุมในClean Code Book หนังสือ Java แต่ฉันยังพบว่ามันมีประโยชน์มากในฐานะโปรแกรมเมอร์ C #)


4

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

กฎทั่วไปที่ดีพร้อมการตั้งชื่อตัวแปรเป็นเช่นนั้น

  • หากคุณมีชื่อวัตถุประเภทเดียวโดยฟังก์ชั่น:

    var builder = new PizzaBuilder();
  • หากคุณมีมากกว่าหนึ่งชื่อพวกเขาด้วยฟังก์ชั่นและความเชี่ยวชาญพิเศษ:

    var pizzaBuilder = new PizzaBuilder();
    var milkShakeBuilder = new MilkShakeBuilder();
    

p_ (หรือเพียงแค่ p) สำหรับพารามิเตอร์เป็นการประชุมเก่าที่มีการใช้งานมากใน C ++ และ C มันมีแนวโน้มที่จะไปกับ l_ สำหรับท้องถิ่นและ (ใน C ++) m_ สำหรับสมาชิกตัวแปร ฉันเคยเห็นมันใน Pascal, Modula 2 และ Ada ด้วยดังนั้นมันจึงไม่ใช่แค่เรื่องครอบครัว C แม้ว่ามันจะเป็นความรักหรือเกลียดก็ตาม ฉันใช้มันเกือบจะหมดสติข้ออ้างของฉันที่ว่า Steve Haighs ให้เหตุผลว่า "เป็น" เช่นวิธีการตั้งค่ามักจะทำm_Whatever = p_Whatever;- ให้ทั้งสองตัวระบุชื่อที่แตกต่างกันอย่างมีความหมายจะเป็นที่น่าอึดอัดใจ แต่ฉันก็เริ่มตั้งคำถามว่ากรณีเหล่านั้นเป็นเรื่องธรรมดามากพอที่จะแสดงให้เห็นถึงการประชุมที่สอดคล้องกันหรือไม่
Steve314

4

ข้อกำหนดการตั้งชื่อภาษา C # จะทำให้คุณ:

  • การใช้ PascalCasing สำหรับเมธอดคุณสมบัติสาธารณะและชื่อคลาส
  • การใช้ IPascalCasing (สังเกตที่ I ตอนเริ่มต้น) สำหรับชื่ออินเตอร์เฟส
  • การใช้ camelCasing สำหรับพารามิเตอร์เมธอดและตัวแปรโลคัล
  • การใช้ _underscoredCamelCasing สำหรับฟิลด์ไพรเวตของคลาส

และโปรดอยู่ให้ห่างจากสัญกรณ์ฮังการี มันไม่มีจุดหมายและไม่ปฏิบัติตามอนุสัญญา C #


เขตข้อมูลส่วนตัวจะมีปาสคาลหากเป็นแบบคงที่
sara

2

การเน้นย้ำในการตั้งชื่อตัวแปรอาจไม่จำเป็นเนื่องจากเรามีคำหลัก "นี่" เพื่ออ้างอิงถึงตัวแปรระดับชั้นโดยเฉพาะ หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับอนุสัญญาการตั้งชื่อตัวแปรจากผู้เชี่ยวชาญฉันขอแนะนำให้คุณดูที่กระดาษที่มีชื่อเสียชื่อ "Ottinger's Rules for Variable and Class Naming" โดย Tim Ottinger บทความที่ได้รับการสนับสนุนโดยผู้ให้คำปรึกษาที่สะอาด .

Ottinger ระบุว่ารหัสของคุณจะต้องสามารถอ่านได้อย่างเป็นมนุษย์เท่าที่จะเป็นไปได้เช่นร้อยแก้วที่เขียนขึ้นอย่างดีดังนั้น ...

public void Function(string p_Parameter1, string p_Parameter2)

... จะอ่านง่ายขึ้นเช่น ...

public void Function(string parameter1, string parameter2)

... โดยที่พารามิเตอร์ 1 และ 2 เป็นชื่อที่สื่อความหมายสำหรับตัวแปรที่เกี่ยวข้อง

นี่คือลิงค์ที่ควรค่าแก่การดู: ลิงค์


-3

ฉันเชื่อในพารามิเตอร์ suffixing: string s_, int i_, etc

ฉันยังเชื่อว่าชื่อ parm ควรสั้นและกว้างที่สุดเท่าที่จะเป็นไปได้

ตอนนี้ด้วยเหตุผล:

  • ในฟังก์ชั่นคุณไม่ต้องการที่จะแก้ไขพารามิเตอร์ในทางใด ๆ หากคุณต้องการรุ่นที่แก้ไขให้สร้างตัวแปรใหม่เพื่อติดมันการตั้งชื่อของ parms พร้อมคำต่อท้ายจะทำให้แน่ใจว่าคุณไม่ได้กำหนดให้พวกเขาหากคุณจ่ายเงิน ความสนใจ
  • ข้อยกเว้นของกฎนี้เกิดขึ้นเมื่อ parm ถูกอ้างอิงหรือออก แม้ว่าฉันจะยังคงใช้คำต่อท้ายกับสิ่งเหล่านั้น
  • ทำไมชื่อสามัญสั้น ๆ คุณควรบันทึกการทำงานของคุณเพื่อที่คุณจะได้รู้ว่า s_ คืออะไรในความหมายเชิงอธิบาย ดังนั้นเมื่อใช้นอกสถานที่การใช้ยาชื่อสามัญสั้น ๆ จะมีประโยชน์เมื่อคุณกำลังสร้างกลุ่มของฟังก์ชั่นที่คล้ายกันหรือการตัดส่วนของฟังก์ชั่นเพื่อส่งไปยังฟังก์ชันอื่นเป็นจุดเริ่มต้นสำหรับการปรับเปลี่ยน
  • ประโยชน์ที่แท้จริงของชื่อทั่วไปคือคุณไม่ต้องจำสิ่งที่คุณเรียกว่าพารามิเตอร์นั้นในกรณีส่วนใหญ่ คุณรู้ว่าคุณได้รับสายดังนั้นมัน s_ ฯลฯ และไม่ต้องสงสัยว่ามันเป็น 'ชื่อไฟล์' หรือเป็น 'filepath' หรือเป็น 'fullpath' เป็นสตริงเท่านั้นดังนั้นจึงเป็น 's_'

ทุกอย่างมีการแลกเปลี่ยนไม่ว่าคุณจะใช้อะไรหรือไม่ก็ตามจะขึ้นอยู่กับว่ามันเข้ากับสไตล์ปัจจุบันของคุณอย่างไร


6
-1: a) คุณกำลังใส่คำนำหน้าไม่ใช่คำต่อท้าย ข) มันเป็นสัญกรณ์ฮังการีและควรจะไปทางของที่จะทำ
ปีเตอร์เค.

1
C # type ไม่ปลอดภัยหรือไม่
pyvi

1
@Peter K. - ดูเหมือนว่าฉันจะชอบsและiเป็นชื่อสั้น ๆ เพราะนี่เป็นเพียงตัวอย่าง IOW ฉันไม่คิดว่านี่จะเป็นภาษาฮังการีเลย - ฉันคิดว่าคุณตีความชื่อสั้น ๆ ผิด ๆ ซึ่งเป็นเพียงแค่สิ่งที่คลาสสิกstring sหรือสิ่งที่int iไม่สามารถนึกถึงชื่อที่ดีกว่าได้ แต่มีคำต่อท้ายที่ติดอยู่ .
Steve314

@ Steve314: อาคุณอาจจะถูก! ลองดูว่ามาร์คตอบกลับไหม
ปีเตอร์เค.

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