Tại sao Microsoft tạo tham số, biến cục bộ và trường riêng có cùng quy ước đặt tên?


18

Tôi đã hỏi câu hỏi này cách đây khá lâu: Làm thế nào để bạn đặt tên cho các biến riêng tư của mình trong C #?

Trong một trong những câu trả lời, tôi đã được chỉ đến trang MSDN của Microsoft cho thấy các biến / trường riêng nên được đặt tên như thế này:

private int myInteger;

Nhưng một tham số sẽ là:

void SomeMethod(int myInteger)

và một biến cục bộ sẽ như thế này:

int myInteger;

Vì vậy, khi bạn tham khảo chúng như thế này

myInteger = 10;

bạn không có cách nào để biết bạn đang nói về cái nào

Bây giờ tôi đang bắt đầu một dự án mới và một trong những đồng nghiệp của tôi đang hỏi tôi tại sao chúng ta không làm gì đó để phân biệt ít nhất một vài trong số này.

Tôi đang tự hỏi điều tương tự. Tại sao tiêu chuẩn của Microsoft không giữ những khác biệt này?


10
Ý bạn là gì "bạn không có cách nào để biết bạn đang nói về ai"? Tất nhiên bạn làm - phạm vi.
Thomas Owens

2
Hướng dẫn đó dường như đã lỗi thời, mặc định chia sẻ lại (đã trở thành một hướng dẫn kiểu defacto) khuyên bạn nên thêm tiền tố vào các trường riêng với dấu gạch dưới, đó là điều tôi luôn luôn làm.

25
@kekekela: Nó hoàn toàn không lỗi thời; StyleCop sẽ gắn cờ rõ ràng bất kỳ trường hợp nào của các biến thành viên bắt đầu bằng dấu gạch dưới. Thành thật mà nói tôi thấy gạch dưới vô nghĩa và gây phiền nhiễu vì vỏ bọc truyền tải thông tin chính xác như nhau. Nếu bạn cần làm cho phạm vi rõ ràng, sau đó gán tiền tố với this..
Aaronaught

12
@Aaronaught Tôi tìm thấy một loạt "cái này". rải rác xung quanh mã của tôi vô nghĩa và khó chịu.

12
@kekekela: Nơi duy nhất tôi từng thấy mình phải làm điều đó là trong hàm tạo, và trong hàm tạo, nó có ý nghĩa hoàn hảo bởi vì bạn thực sự truyền vào các giá trị khởi tạo các trường thành viên ( this.component = component). Nếu bạn thấy mình có phạm vi mơ hồ ở nơi khác, thì bạn có "một đống 'cái này'. nằm rải rác xung quanh mã của bạn ", sau đó bạn có mã được viết kém.
Aaronaught

Câu trả lời:


14

Các quy ước đặt tên ban đầu có tiền tố m_ cho các thành viên của lớp, điều này đã được giảm xuống đơn giản là một dấu gạch dưới. Bạn sẽ thấy rất nhiều mã Microsoft C # cũ hơn sử dụng tiền tố gạch dưới. Tuy nhiên, tôi đã nghe trên Tech Ed một lần rằng dấu gạch dưới hàng đầu không tuân thủ CLS. Tôi cho rằng đây là lý do tại sao họ chuyển sang sơ đồ một tên đơn giản hơn. Trước đây (không chắc chắn) rằng các tên không nhạy cảm trong trường hợp của VB.Net cũng không tuân thủ CLS.

Đối với giá trị của nó, tôi vẫn sử dụng dấu gạch dưới hàng đầu cho các thành viên trong lớp. Mặc dù bạn có thể định hướng bằng cách sử dụng cái này (this.name trái ngược với tên), các lỗi vẫn vượt qua.

Bạn không phải làm mọi thứ mà MS bảo bạn làm.


1
Tôi nghĩ rằng bạn đã nhầm lẫn "tuân thủ CLR" với "tuân thủ CLS". Nếu một cái gì đó không tuân thủ CLR, nó sẽ không biên dịch. CLS chỉ là một cảnh báo rằng nó có thể không tương thích với các ngôn ngữ khác và về cơ bản chỉ ảnh hưởng đến các thành viên công cộng (về mặt kỹ thuật, những thứ có thể nhìn thấy bên ngoài tổ hợp của bạn).
Joel C

@Joel - Bạn đã đúng. Câu hỏi này liên quan đến nó: stackoverflow.com/questions/1195030/ từ
dave

2
Tôi vẫn sử dụng tiền tố "m_" ...
CesarGon

4
+1 "cho bạn không phải làm mọi thứ mà MS bảo bạn làm". Hãy suy nghĩ cho chính mình!
gbjbaanb

1
Nó chỉ không tuân thủ CLS nếu lĩnh vực này protected, không phảiprivate
Rachel

9

localparametercác biến được đặt tên theo cùng một cách vì phạm vi của chúng là như nhau

Đối với các biến riêng tư, có nhiều ý kiến ​​khác nhau về điều đó. Tôi đã luôn sử dụng các tiêu chuẩn được tìm thấy ở đây , trong đó chỉ định sử dụng hàng đầu _trước các biến riêng tư, mặc dù tác giả nói rằng đó _là một chút tranh cãi và Microsoft khuyến nghị chống lại nó.

Wikipedia nói rằng trong C và C ++

Các tên bắt đầu bằng dấu gạch dưới kép hoặc dấu gạch dưới và chữ in hoa được dành riêng để thực hiện (trình biên dịch, thư viện chuẩn) và không nên được sử dụng (ví dụ: __reserved hoặc _Reserved).

Vì vậy, có lẽ đó là lý do đằng sau Microsoft khuyến nghị chống lại điều đó, mặc dù khá nổi tiếng là nhiều nhà phát triển của Microsoft sử dụng _tiền tố cho các biến riêng tư của họ.


2
Điểm hay về tham số và biến cục bộ có cùng phạm vi (+1). Không ai khác đề cập đến điều đó. Hệ quả là nếu bạn cần một biến cục bộ có cùng tên với tham số, bạn chỉ có thể sử dụng tham số. Cá nhân mặc dù tôi thấy gạch dưới xấu xí và thiếu chính xác. Trong khi đó thischắc chắn đề cập đến các đối tượng hiện tại. Tôi không hiểu sự thù hận this. Có phải vì nó bị hiểu lầm?
Jason S

4

Tôi không thể nói cho bạn biết tại sao họ không giữ họ khác biệt. Có vẻ như không ai có thể trừ khi ai đó tham gia vào việc tạo ra các tiêu chuẩn tình cờ thấy câu hỏi này.

Nhiều người tạo ra các quy ước của riêng họ bằng cách thêm tiền tố vào các biến đối tượng bằng _hoặc m_, nhưng tôi thực sự không nghĩ nó quan trọng. Bạn có thể suy luận rất nhiều từ bối cảnh và IDE ngày nay đủ thông minh để giúp bạn giải quyết. Ví dụ, Visual Studio với addon ReSharper sẽ hiển thị cho bạn các biến cục bộ và biến thể hiện trong các màu khác nhau.

Nếu việc bạn phân biệt giữa hai phạm vi thực sự có vấn đề, bạn có thể sử dụng this.tiền tố để tham chiếu biến thể hiện:

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.
    }
}

Không có bất kỳ plugin nào khác, Visual Studio sẽ mặc định giúp bạn với Intellisense:

ảnh chụp màn hình

(Cửa sổ bật lên vẫn có thể được ReSharper tạo kiểu ở đó, nhưng ReSharper không thêm bất cứ thứ gì vào các tính năng của Intellisense tích hợp, do đó, trong khi cổ phiếu có thể hơi khác một chút, nó vẫn có cả hai tùy chọn trong đó. )

Bạn cũng có thể sử dụng các công cụ phân tích mã như FxCopStyleCop để giúp bạn nắm bắt các vấn đề tiềm ẩn với việc đặt tên và phạm vi.


Để giải thích một chút this, tôi luôn thích this, bởi vì nó chắc chắn đề cập đến trường hợp hiện tại bất cứ ngôi nhà nào bạn đang ở, vì vậy nó là chính xác. Các quy ước gạch dưới hoặc gạch dưới chỉ là như vậy - các quy ước có thể hoặc không thể tham chiếu đến các biến thể hiện và chúng được tạo ra dự phòng this. Nơi duy nhất tôi thấy gạch dưới hữu ích là trong VB không phân biệt chữ hoa chữ thường để phân biệt tên đối tượng và lớp. Nhưng đó là một câu chuyện hoàn toàn khác.
Jason S

4

Tại sao tiêu chuẩn của Microsoft không giữ những khác biệt này?

Những người ở Microsoft đã viết một cuốn sách có tên Nguyên tắc thiết kế khung trong đó giải thích một số quy ước, bao gồm cả lý do tại sao một số thứ được bọc bằng lạc đà , và những thứ khác được đặt trong pascal .

Chỉnh sửa (thêm chi tiết từ cuốn sách):

Trong cuốn sách, họ đề cập đến việc thực hiện các nghiên cứu về khả năng sử dụng, cũng như một số bài học kinh nghiệm từ việc mua lại nhóm Turbo Pascal. Ngoài ra, trong khi không phải tất cả các ngôn ngữ đều phân biệt chữ hoa chữ thường (chẳng hạn như VB), các ngôn ngữ khác là (chẳng hạn như C #), do đó, một ngôn ngữ nên nhất quán trong cách đặt tên của một người. Người ta không thể phụ thuộc vào sự khác biệt trong trường hợp một mình để phân biệt các mặt hàng. Nếu một người tuân theo các quy ước được sử dụng bởi phần còn lại của khung, nó sẽ dẫn đến ít nhầm lẫn hơn bởi các nhà phát triển.

Chương 3, Hướng dẫn đặt tên.
Mục 3.1 là quy ước viết hoa.

camelCasingdành cho tên tham số.
PascalCasingdành cho không gian tên, loại và tên thành viên. Trong trường hợp có các từ viết tắt 2 chữ cái như một phần của tên, hãy giữ chúng viết hoa cùng nhau, chẳng hạn như IOStream.

Phần 3.5 bao gồm các lớp đặt tên, cấu trúc và giao diện.
Mục 3.6 bao gồm các thành viên loại đặt tên.
Mục 3.7 bao gồm các tham số đặt tên.


4
Bạn có quan tâm đến việc tóm tắt cho những người trong chúng ta không sở hữu cuốn sách này không?
Kramii phục hồi Monica

Tôi đồng ý với Kramii. Một bản tóm tắt sẽ là tuyệt vời!
Núi lửa

@Kramil, Vaccano, Có vẻ như tôi sẽ phải kiểm tra nó ra khỏi thư viện một lần nữa. Thông thường tôi chỉ làm như vậy khi bắt đầu một công việc mới và các cuộc thảo luận chuyển sang các tiêu chuẩn đặt tên và mã hóa.
Tangurena

1
lol, vì vậy "Người ta không thể phụ thuộc vào sự khác biệt trong trường hợp một mình để phân biệt các mục", sau đó tiếp tục nói sử dụng camelCase hoặc PascalCase để phân biệt các mục.
gbjbaanb

1

Bởi vì chúng khá dễ phân biệt vì chúng phụ thuộc vào bối cảnh chúng được viết.

Ví dụ, bạn đã bao giờ sử dụng một tham số như một biến thành viên chưa? Hoặc một biến cục bộ như một tham số? Làm thế nào về một biến thành viên như là một địa phương?

  • Tất cả các biến thành viên nằm trong "cơ thể" của một lớp. Tôi thực sự không mua đối số mà bạn cần phải thêm tiền tố vào thành viên khi bạn có thể sử dụng thisđể phân biệt nó với một biến cục bộ có cùng tên, nếu không thì không cần thiết.

  • Một biến cục bộ cũng chỉ được định nghĩa bên trong phạm vi của phương thức hoặc trong phạm vi khối mã.

  • Một tham số luôn được định nghĩa trong chữ ký phương thức.

Nếu bạn nhận được tất cả các loại biến này lẫn lộn hoặc trộn lẫn với nhau thì bạn thực sự nên suy nghĩ nhiều hơn về thiết kế mã của mình để làm cho nó dễ đọc hoặc dễ khám phá hơn. Cung cấp cho họ tên tốt hơn và tự mô tả hơn myInteger.


0

Tôi không thể trả lời câu hỏi của bạn về các tiêu chuẩn của Microsoft. Nếu bạn muốn có một tiêu chuẩn để phân biệt những điều này, tôi sử dụng tiêu chuẩn cho các thông số PL / SQL được tiền tố tên tham số với in_, out_, io_, cho các thông số trong-, dùng ngoài trời và trong dùng ngoài trời. Các biến là cục bộ của hàm được bắt đầu bằng a v_.


0

Hầu hết các công ty mà tôi biết đều có các tiêu chuẩn mã hóa chỉ định dấu gạch dưới hoặc chữ thường m (đối với "thành viên" tôi giả sử) làm tiền tố cho các biến thành viên của họ.

Vì thế

_varName

hoặc là

mVarName


2
Có, nhưng MS không chấp nhận việc sử dụng m cho các thành viên, đó là những gì OP đang nhận được.
Christopher Bibbs

"Hầu hết các công ty" không bao gồm Microsoft, công ty mà câu hỏi này đề cập đến.
Aaronaught

1
Tôi đã không nhận ra rằng Micrsoft MSDN dành cho các tiêu chuẩn mã hóa nội bộ tại Microsoft.
JeffO

1
@JeffO: Bạn nói đúng, không phải vậy, nhưng hướng dẫn mã hóa nội bộ của họ nói điều tương tự .
Aaronaught

0

Giống như những người khác đã chỉ ra, bạn thường có thể biết đó là mục nào trong phạm vi mà mục được sử dụng. Bạn thực sự không thể có tham số và biến cục bộ trong cùng một phạm vi và nếu bạn muốn biến riêng, chỉ cần sử dụng this.myInteger. Vì vậy, tôi không nghĩ Microsoft lo lắng về điều đó quá nhiều vì bạn có thể dễ dàng phân biệt giữa họ nếu muốn.

Nhưng điều đó đã được nói, tôi hơi ngạc nhiên khi chưa có ai nói điều này, mà quên đi Microsoft và các quy ước đặt tên của họ (bây giờ ai đó có thể đã nói điều đó khi tôi phải chạy đến một cuộc họp và bỏ ngỏ điều này mà không gửi nó). Ký hiệu Hungary cũng là một quy ước đặt tên bắt đầu tại Microsoft (hoặc đó là Xerox? Tôi không bao giờ có thể nhớ khi Simonyi nghĩ ra nó). Tôi không thể nghĩ về bất cứ ai mà tôi biết rằng không nguyền rủa tên của ký hiệu Hungary cho đến ngày nay. Chúng tôi trở nên rất khó chịu với nó tại nơi tôi làm việc mà chúng tôi đã đưa ra tiêu chuẩn của riêng mình mà chúng tôi sử dụng trong nội bộ. Nó có ý nghĩa hơn đối với chúng tôi và tăng tốc công việc của chúng tôi một chút (nó thực sự khá gần với những gì Microsoft gợi ý bây giờ, nhưng mọi thứ đều là trường hợp pascal ngoại trừ các biến riêng tư).

Điều đó đang được nói, tiêu chuẩn mới hơn mà Microsoft sử dụng (hỗn hợp vỏ lạc đà và vỏ pascal) không quá tệ. Nhưng nếu bạn và đồng nghiệp của bạn không thích nó, hãy đưa ra bộ tiêu chuẩn của riêng bạn (gọi chung là tốt nhất). Điều này tất nhiên phụ thuộc vào việc công ty của bạn đã có một bộ tiêu chuẩn hay chưa. Nếu họ làm, hãy bám lấy họ. Nếu không hãy đến với những gì làm việc cho bạn và đồng nghiệp của bạn. Chỉ cần giữ cho nó hợp lý. '

Vì Aaronaught yêu cầu trích dẫn về Charles Simonyi và Ký hiệu Hungary: http://en.wikipedia.org/wiki/Charles_Simonyi

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

http://msdn.microsoft.com/en-us/l 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

Hai cuối cùng chỉ là ví dụ về ký hiệu Hungary và liên kết ootips chỉ là một số trích dẫn liên quan đến một số ý kiến ​​về chủ đề này. Lưu ý rằng cũng có Ký hiệu Hungary hệ thống, nhưng theo như tôi biết, đã trở nên phổ biến từ các lập trình viên của Microsoft (mặc dù không giống như Simonyi cho biến thể ứng dụng, tôi không biết ai).


1
1) Tiếng Hungary không được phát minh bởi Microsoft và 2) "tiếng Hungary" mà bạn đang đề cập là kiểu Hungary chứ không phải tiếng Hungary ngữ nghĩa.
Aaronaught

Tôi chưa bao giờ nói rằng Microsoft đã đưa ra nó. Tôi thực sự đã nói Charles Simonyi đã đưa ra nó (cụ thể là các ứng dụng ký hiệu tiếng Đức). Microsoft đã thúc đẩy nó rất nhiều, nhưng tôi chưa bao giờ nói họ đã tạo ra nó (thực tế tôi đã nói rằng tôi không chắc liệu anh ta đã tạo ra nó trong những ngày Xerox hay Microsoft của mình). Tôi đã đưa ra nó như một ví dụ về một cái gì đó mà một công ty lớn (Microsoft) đề xuất là cách mọi thứ nên được thực hiện. Quan điểm của tôi trong tất cả những điều này là OP không nên lo lắng về việc đặt tên cho các công ước mà một công ty mà anh ấy không làm việc nói là "cách làm đúng" (trừ khi anh ấy làm việc cho Microsoft, trong trường hợp anh ấy nên quan tâm).
JaCraig

[cần dẫn nguồn]
Aaronaught

1
Um yeah, chúng tôi không cần một trích dẫn về ký hiệu Hungary là gì. [Cần dẫn nguồn] là dành cho tất cả các yêu cầu không rõ ràng trong câu trả lời của bạn.
Aaronaught
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.