เหตุใด Microsoft จึงสร้างพารามิเตอร์ตัวแปรโลคัลและฟิลด์ส่วนบุคคลจึงมีหลักการตั้งชื่อเหมือนกัน


18

ฉันถามคำถามนี้เมื่อไม่นานมานี้: คุณตั้งชื่อตัวแปรส่วนตัวใน C # ได้อย่างไร

ในหนึ่งในคำตอบฉันถูกชี้ไปที่หน้า MSDN ของ Microsoft ที่แสดงว่าตัวแปร / ฟิลด์ส่วนตัวควรตั้งชื่อดังนี้:

private int myInteger;

แต่พารามิเตอร์จะเป็น:

void SomeMethod(int myInteger)

และตัวแปรท้องถิ่นจะเป็นเช่นนี้:

int myInteger;

ดังนั้นเมื่อคุณอ้างอิงพวกเขาเช่นนี้

myInteger = 10;

คุณไม่มีทางรู้ว่าคุณกำลังพูดถึงเรื่องไหนอยู่

ตอนนี้ฉันเริ่มโครงการใหม่และเพื่อนร่วมงานคนหนึ่งของฉันถามฉันว่าทำไมเราไม่ทำอะไรเพื่อแยกความแตกต่างอย่างน้อยบางอย่าง

ฉันสงสัยในสิ่งเดียวกัน ทำไมมาตรฐานของ Microsoft จึงไม่แตกต่างกัน?


10
คุณหมายถึงอะไร "คุณไม่มีทางรู้ว่าคุณกำลังพูดถึงเรื่องอะไร" แน่นอนคุณทำ - ขอบเขต
Thomas Owens

2
ดูเหมือนว่าคำแนะนำนั้นล้าสมัยค่าเริ่มต้นของตัวแก้ไข resharper (ซึ่งกลายเป็นสิ่งที่เป็นแนวทางแบบ defacto) แนะนำให้ใส่คำนำหน้าของเขตข้อมูลส่วนบุคคลด้วยการขีดเส้นใต้ซึ่งเป็นสิ่งที่ฉันทำไว้ตลอดไป

25
@kekekela: มันไม่ล้าสมัยอย่างแน่นอน StyleCop จะตั้งค่าสถานะอินสแตนซ์ของตัวแปรสมาชิกใด ๆ ที่ขึ้นต้นด้วยขีดล่างอย่างชัดเจน ตรงไปตรงมาฉันพบว่าขีดเส้นใต้นั้นไร้สาระและน่ารำคาญเพราะตัวกล่องนั้นสื่อให้เห็นข้อมูลเดียวกัน this.หากคุณต้องการที่จะทำให้ขอบเขตอย่างชัดเจนได้รับมอบหมายแล้วคำนำหน้าด้วย
Aaronaught

12
@Aaraught ฉันพบสิ่งที่ซ้ำซ้อน "นี่" กระจัดกระจายรอบรหัสของฉันไม่มีจุดหมายและระคายเคือง

12
@kekekela: ที่เดียวที่ฉันเคยพบว่าตัวเองต้องทำคืออยู่ในคอนสตรัคเตอร์และในคอนสตรัคเตอร์มันมีเหตุผลที่สมบูรณ์แบบเพราะคุณกำลังผ่านคุณค่าที่กำหนดค่าเริ่มต้นสำหรับเขตข้อมูลสมาชิก ( this.component = component) หากคุณพบว่าตัวเองมีขอบเขตที่ไม่ชัดเจนในที่อื่นเช่นคุณมี "ซ้ำซ้อน" นี้ กระจัดกระจายรอบรหัสของคุณ "จากนั้นคุณมีรหัสที่เขียนไม่ดี
Aaronaught

คำตอบ:


14

อนุสัญญาการตั้งชื่อดั้งเดิมมีคำนำหน้า m_ สำหรับสมาชิกชั้นเรียนสิ่งนี้ลดลงเป็นขีดล่างแบบง่าย คุณจะเห็นรหัส C # Microsoft รุ่นเก่าจำนวนมากโดยใช้คำนำหน้าขีดล่าง อย่างไรก็ตามฉันได้ยินใน Tech Ed หนึ่งครั้งว่าขีดเส้นใต้นำไม่สอดคล้องกับ CLS ฉันคิดว่านี่เป็นเหตุผลว่าทำไมพวกเขาย้ายไปที่รูปแบบหนึ่งชื่อที่เหมาะกับทุกคนที่เรียบง่าย เคยเป็น (ไม่แน่ใจในตอนนี้) ว่าชื่อที่ไม่สำคัญของตัวพิมพ์เล็ก VB.Net ก็ไม่สอดคล้องกับ CLS

สำหรับสิ่งที่คุ้มค่าฉันยังคงใช้ขีดเส้นใต้ชั้นนำสำหรับสมาชิกชั้นเรียน แม้ว่าคุณสามารถแก้ปัญหาโดยใช้ชื่อนี้ (ชื่อนี้ซึ่งต่างกับชื่อ) แต่ข้อบกพร่องยังคงผ่าน

คุณไม่ต้องทำทุกอย่างที่ MS บอกให้ทำ


1
ฉันคิดว่าคุณสับสน "เข้ากันได้กับ CLR" กับ "เข้ากันได้กับ CLS" หากสิ่งที่ไม่สอดคล้องกับ CLR มันจะไม่รวบรวม CLS เป็นเพียงคำเตือนว่าอาจเข้ากันไม่ได้กับภาษาอื่นและโดยทั่วไปจะมีผลกับสมาชิกสาธารณะเท่านั้น
Joel C

@Joel - คุณถูกต้อง คำถามนี้เกี่ยวกับมัน: stackoverflow.com/questions/1195030/…
dave

2
ฉันยังคงใช้คำนำหน้า "m_" ...
CesarGon

4
+1 "สำหรับคุณไม่ต้องทำทุกอย่างที่ MS บอกให้คุณทำ" คิดด้วยตัวเอง!
gbjbaanb

1
มันไม่เพียงแค่เป็นไปตามมาตรฐาน CLS เท่านั้นถ้าเป็นprotectedเช่นนั้นไม่ใช่private
ราเชล

9

localและparameterตัวแปรถูกตั้งชื่อในลักษณะเดียวกันเพราะขอบเขตเท่ากัน

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

Wikipediaระบุว่าใน C และ C ++

ชื่อที่ขึ้นต้นด้วยเครื่องหมายขีดล่างคู่หรือขีดล่างและตัวอักษรใหญ่ถูกสงวนไว้สำหรับการใช้งาน (คอมไพเลอร์, ไลบรารีมาตรฐาน) และไม่ควรใช้ (เช่น __reserved หรือ _Reserved)

ดังนั้นบางทีนั่นอาจเป็นเหตุผลที่ทำให้ Microsoft แนะนำว่าแม้ว่าจะเป็นที่รู้กันดีว่า devs ของ Microsoft จำนวนมากใช้_คำนำหน้าสำหรับตัวแปรส่วนตัวของพวกเขาอย่างไรก็ตาม


2
จุดดีเกี่ยวกับพารามิเตอร์และตัวแปรท้องถิ่นที่มีขอบเขตเดียวกัน (+1) ไม่มีใครพูดถึงมันอีกแล้ว ข้อพิสูจน์ที่ว่าถ้าคุณต้องการตัวแปรโลคอลที่มีชื่อเดียวกับพารามิเตอร์คุณสามารถใช้พารามิเตอร์ได้ โดยส่วนตัวแล้วฉันพบว่าขีดเส้นใต้น่าเกลียดและไม่แน่นอน ในขณะที่thisหมายถึงวัตถุปัจจุบันอย่างแน่นอน thisฉันไม่เข้าใจความเกลียดชังสำหรับ เป็นเพราะมันเข้าใจผิดหรือเปล่า?
Jason S

4

ฉันไม่สามารถบอกคุณได้อย่างแน่นอนว่าทำไมพวกเขาถึงไม่ต่างกัน เป็นไปได้ว่าไม่มีใครสามารถทำได้เว้นแต่จะมีคนที่มีส่วนร่วมในการสร้างมาตรฐานเพื่อดูคำถามนี้

หลายคนสร้างแบบแผนของตัวเองโดยการเติมตัวแปรอินสแตนซ์ด้วย_หรือm_แต่ฉันไม่คิดว่ามันจะสำคัญ คุณสามารถสรุปได้มากมายจากบริบทและ IDE วันนี้ฉลาดพอที่จะช่วยคุณได้ Visual Studio ที่มีส่วนเสริม ReSharper จะแสดงให้คุณเห็นตัวแปรท้องถิ่นและตัวแปรอินสแตนซ์ในสีที่ต่างกัน

หากเป็นเรื่องสำคัญที่คุณต้องแยกความแตกต่างระหว่างขอบเขตทั้งสองคุณสามารถใช้ส่วนthis.นำหน้าเพื่ออ้างถึงตัวแปรอินสแตนซ์:

public class Test
{
    private int myInteger;

    void SomeMethod(int myInteger)
    {
        this.myInteger = 10; // sets instance variable to 10
        myInteger = 10; // does not affect the instance variable.
    }
}

หากไม่มีปลั๊กอินอื่น ๆ Visual Studio จะช่วยคุณในการเริ่มต้นด้วย Intellisense:

ภาพหน้าจอ

(ป๊อปอัพอาจยังมีสไตล์โดย ReSharper ที่นั่น แต่ ReSharper ไม่ได้เพิ่มคุณสมบัติใด ๆ ของ Intellisense ในตัวดังนั้นในขณะที่สต็อกอาจดูแตกต่างกันเล็กน้อย แต่ก็ยังมีตัวเลือกทั้งสองอยู่ในนั้น )

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


เพื่ออธิบายรายละเอียดเล็กน้อยthisฉันมักจะชอบthisเพราะมันหมายถึงอินสแตนซ์ปัจจุบันที่บ้านคุณอยู่ดังนั้นจึงแม่นยำ ขีดหรือขีดประชุมม. เป็นเพียงที่ - thisการประชุมที่อาจจะหรืออาจจะไม่ได้หมายถึงตัวแปรเช่นและพวกเขาจะทำซ้ำซ้อนโดย ที่เดียวที่ฉันเห็นว่าขีดเส้นใต้มีประโยชน์คือในกรณีที่ไม่คำนึงถึง VB เพื่อแยกความแตกต่างของชื่อวัตถุและคลาส แต่นั่นเป็นเรื่องราวอื่นทั้งหมด
Jason S

4

ทำไมมาตรฐานของ Microsoft จึงไม่แตกต่างกัน?

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

แก้ไข (เพิ่มรายละเอียดจากหนังสือ):

ในหนังสือเล่มนี้พวกเขาพูดถึงการศึกษาการใช้งานเช่นเดียวกับบทเรียนบางส่วนจากการได้รับกลุ่ม Turbo Pascal นอกจากนี้ในขณะที่ไม่ใช่ทุกภาษาจะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (เช่น VB) แต่ภาษาอื่น ๆ (เช่น C #) ดังนั้นควรมีความสอดคล้องในการตั้งชื่อ หนึ่งไม่สามารถขึ้นอยู่กับความแตกต่างในกรณีเดียวที่จะแยกแยะรายการ หากใครยึดติดกับอนุสัญญาที่ใช้โดยกรอบงานที่เหลือมันจะนำไปสู่ความสับสนน้อยลงโดย devs

บทที่ 3 แนวทางการตั้งชื่อ
มาตรา 3.1 เป็นการประชุมใหญ่

camelCasingสำหรับชื่อพารามิเตอร์
PascalCasingสำหรับเนมสเปซประเภทและชื่อสมาชิก ในกรณีที่มี 2 IOStreamตัวอักษรย่อเป็นส่วนหนึ่งของชื่อให้พวกเขานิยามกันเช่น

ส่วนที่ 3.5 ครอบคลุมคลาสการตั้งชื่อโครงสร้างและอินเทอร์เฟซ
ส่วนที่ 3.6 ครอบคลุมสมาชิกประเภทการตั้งชื่อ
ส่วนที่ 3.7 ครอบคลุมพารามิเตอร์การตั้งชื่อ


4
คุณสนใจที่จะสรุปสำหรับพวกเราที่ไม่มีหนังสือเล่มนี้หรือไม่?
Kramii Reinstate Monica

ฉันเห็นด้วยกับ Kramii บทสรุปจะยอดเยี่ยมมาก!
Vaccano

@ Kramil, Vaccano ดูเหมือนว่าฉันจะต้องไปตรวจสอบที่ห้องสมุดอีกครั้ง โดยปกติฉันจะทำเช่นนั้นเมื่อเริ่มงานใหม่และการอภิปรายหันไปตั้งชื่อและมาตรฐานการเข้ารหัส
Tangurena

1
lol ดังนั้น "หนึ่งไม่สามารถขึ้นอยู่กับความแตกต่างในกรณีเดียวที่จะแยกแยะความแตกต่างรายการ" จากนั้นก็จะพูดใช้ camelCase หรือ PascalCase เพื่อแยกความแตกต่างรายการ
gbjbaanb

1

เนื่องจากมันค่อนข้างจะแตกต่างเนื่องจากขึ้นอยู่กับบริบทที่เขียน

ตัวอย่างเช่นคุณเคยใช้พารามิเตอร์เป็นตัวแปรสมาชิกหรือไม่? หรือตัวแปรท้องถิ่นเป็นพารามิเตอร์? แล้วตัวแปรของสมาชิกเป็นตัวแปรในตัวล่ะ?

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

  • ตัวแปรโลคัลถูกนิยามภายในขอบเขตของเมธอดหรือในขอบเขตการบล็อกโค้ดเท่านั้น

  • พารามิเตอร์ถูกกำหนดไว้ในลายเซ็นวิธีการเสมอ

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


0

ฉันไม่สามารถตอบคำถามของคุณเกี่ยวกับมาตรฐานของ Microsoft หากคุณต้องการมาตรฐานในการแยกความแตกต่างสิ่งเหล่านี้การใช้งานที่ฉันมาตรฐานสำหรับพารามิเตอร์ PL / SQL เป็น prefixing ชื่อพารามิเตอร์ที่มีin_, out_, io_สำหรับ in-, นอกและในนอกพารามิเตอร์ v_ตัวแปรที่มีในท้องถิ่นเพื่อฟังก์ชั่นจะมีคำนำหน้าด้วย


0

บริษัท ส่วนใหญ่ฉันรู้ว่ามีมาตรฐานการเข้ารหัสที่ระบุขีดล่างหรือตัวอักษรตัวเล็ก m (สำหรับ "สมาชิก" ฉันถือว่า) เป็นคำนำหน้าสำหรับตัวแปรสมาชิก

ดังนั้น

_varName

หรือ

mVarName


2
ใช่ แต่ MS เลิกใช้ m สำหรับสมาชิกซึ่งเป็นสิ่งที่ OP กำลังดำเนินอยู่
Christopher Bibbs

"บริษัท ส่วนใหญ่" ไม่รวม Microsoft ซึ่งเป็น บริษัท ที่คำถามนี้เกี่ยวกับ
Aaronaught

1
ฉันไม่ทราบว่า Micrsoft MSDN ใช้สำหรับมาตรฐานการเข้ารหัสภายในที่ Microsoft
JeffO

1
@JeffO: คุณขวาก็ไม่ได้ แต่แนวทางการเข้ารหัสภายในของพวกเขาพูดในสิ่งเดียวกัน
Aaronaught

0

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

แต่ที่ถูกกล่าวว่าฉันประหลาดใจเล็กน้อยที่ยังไม่มีใครพูดถึงเรื่องนี้ แต่ลืมเกี่ยวกับ Microsoft และแบบแผนการตั้งชื่อของพวกเขา (บางคนอาจพูดว่าตอนนี้เพราะฉันต้องวิ่งไปประชุมและออกจากที่เปิดโดยไม่ส่ง มัน). สัญกรณ์ฮังการีก็เป็นแบบแผนการตั้งชื่อที่เริ่มต้นที่ Microsoft (หรือเป็น Xerox หรือไม่ฉันจำไม่ได้เมื่อ Simonyi เกิดขึ้นกับมัน) ฉันไม่สามารถนึกถึงทุกคนที่ฉันรู้ว่าไม่ได้สาปแช่งชื่อของเอกสารฮังการีมาจนถึงทุกวันนี้ เรารู้สึกรำคาญกับมันมากในสถานที่ที่ฉันทำงานว่าเรามาด้วยมาตรฐานของเราเองที่เราใช้ภายใน มันสมเหตุสมผลมากกว่าสำหรับเราและเร่งการทำงานของเราเล็กน้อย (จริงๆแล้วมันค่อนข้างใกล้เคียงกับสิ่งที่ Microsoft แนะนำตอนนี้ แต่ทุกอย่างเป็นปาสกาลด้วยข้อยกเว้นของตัวแปรส่วนตัว)

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

ตั้งแต่ Aaronaught ขอการอ้างอิงเกี่ยวกับ Charles Simonyi และสัญกรณ์ฮังการี: http://en.wikipedia.org/wiki/Charles_Simonyi

http://en.wikipedia.org/wiki/Hungarian_notation

http://msdn.microsoft.com/en-us/library/aa260976(v=VS.60).aspx

http://ootips.org/hungarian-notation.html

http://www.hitmill.com/programming/vb/Hungarian.html

http://web.mst.edu/~cpp/common/hungarian.html

สองล่าสุดเป็นเพียงตัวอย่างของสัญกรณ์ฮังการีและลิงก์ ootips เป็นเพียงคำพูดที่เกี่ยวข้องกับความคิดเห็นในเรื่อง โปรดทราบว่ามีระบบของฮังการี แต่ยังเท่าที่ฉันทราบได้รับความนิยมจากโปรแกรมเมอร์ของ Microsoft (แม้ว่า Simonyi จะแตกต่างจากแอพสำหรับรูปแบบแอพ แต่ฉันไม่รู้ว่าใครเป็นคน)


1
1) Microsoft ไม่ได้คิดค้นโดย Microsoft และ 2) "Hungarian" ที่คุณอ้างถึงนั้นเป็นคนประเภทฮังการีมากกว่าเป็นชาวฮังการีความหมาย
Aaronaught

ฉันไม่เคยพูดว่า Microsoft มาพร้อมกับมัน ฉันจริง ๆ แล้วบอกว่า Charles Simonyi เกิดขึ้นกับมัน Microsoft ผลักมันหนัก แต่ฉันไม่เคยบอกว่าพวกเขาสร้างมันขึ้นมา (อันที่จริงฉันบอกว่าฉันไม่แน่ใจว่าเขาสร้างขึ้นในช่วง Xerox หรือ Microsoft ของเขาหรือไม่) ฉันให้มันเป็นตัวอย่างของสิ่งที่ บริษัท ขนาดใหญ่ (Microsoft) แนะนำว่าเป็นสิ่งที่ควรทำ ประเด็นของฉันในเรื่องทั้งหมดนี้คือ OP ไม่ควรกังวลเกี่ยวกับการตั้งชื่อแบบแผนที่ บริษัท ที่เขาไม่ทำงานเพื่อบอกว่าเป็น "วิธีที่ถูกต้อง" (เว้นแต่เขาจะทำงานให้กับ Microsoft ในกรณีนี้เขาควรสนใจ)
JaCraig

[อ้างจำเป็น]
Aaronaught

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