Sử dụng dấu gạch dưới trong các biến Java và tên phương thức [đã đóng]


83

Thậm chí ngày nay tôi thường thấy dấu gạch dưới trong các biến và phương thức Java, một ví dụ là các biến thành viên (như "m_count" hoặc "_count"). Theo như tôi nhớ, sử dụng dấu gạch dưới trong những trường hợp này được Sun gọi là phong cách xấu.

Nơi duy nhất chúng nên được sử dụng là trong các hằng số (như trong "public final static int IS_OKAY = 1;"), vì các hằng số phải là chữ hoa chứ không phải chữ hoa camel. Ở đây, dấu gạch dưới sẽ làm cho mã dễ đọc hơn.

Bạn có nghĩ rằng việc sử dụng dấu gạch dưới trong Java là kiểu xấu không? Nếu vậy (hoặc không), tại sao?

Câu trả lời:


146

Nếu bạn không có mã nào sử dụng nó bây giờ, tôi khuyên bạn nên tiếp tục điều đó. Nếu codebase của bạn sử dụng nó, hãy tiếp tục điều đó.

Điều lớn nhất về phong cách mã hóa là tính nhất quán . Nếu bạn không có gì nhất quán, thì các đề xuất của nhà cung cấp ngôn ngữ có thể là một nơi tốt để bắt đầu.


3
Chúng tôi sử dụng các quy ước mã hóa mà không sử dụng dấu gạch dưới. Dù sao, nhìn vào các khung công tác và mã cũ hơn, tôi thường thấy dấu gạch dưới. Câu hỏi mà tính nhất quán quy định so với quy ước rõ ràng là câu trả lời cho sự nhất quán nhưng không phải là điểm tôi nghĩ đến khi đặt câu hỏi.
Georgi

1
Tiếp tục sử dụng ký tự '_' sẽ là một việc làm không tốt. Cách làm việc này dẫn đến chi phí bảo trì bổ sung và bạn sẽ phải thông báo những quy ước đặc biệt này cho từng nhà phát triển mới tham gia nhóm.
Halil

1
điều này giống như đặt tên giao diện theo cách này: ReadableInterface- hoàn toàn dư thừa. Trong các IDE hiện đại, bạn không cần phải chỉ định loại biến hoặc phạm vi của nó - tô màu và nhảy nhanh sẽ thực hiện tất cả công việc cho bạn. Vì vậy, IMO đây là một phong cách tồi khi bạn nhập các ký tự thừa và buộc mọi người phải đọc / duy trì nó.
kiedysktos

120
sunDoesNotRecommendUnderscoresBecauseJavaVariableAndFunctionNamesTendToBeLongEnoughAsItIs ();

as_others_have_said_consistency_is_the_important_thing_here_so_chose_w Anything_you_think_is_more_readable ();

Câu hỏi rằng tính nhất quán quy định so với quy ước rõ ràng là phải được trả lời cho nhất quán nhưng không phải là điểm tôi nghĩ đến khi đặt câu hỏi. Dù sao thì cũng có lúc nên để lại dấu vết cũ, hả?
Georgi 29-08

2
Nếu quy ước đặt tên "xung đột" đã được sử dụng, tôi nghĩ nó phụ thuộc vào lượng mã mà chúng ta đang nói đến. Tôi không khuyên bạn nên viết lại hàng nghìn dòng mã chỉ để chuyển từ old_convention sang newConvention, với điều kiện là quy ước cũ được sử dụng nhất quán.
Anders Sandvig 29/09/08

CƯỜI LỚN! Điều đó đang được nói, khi mã được dán trong các trình chỉnh sửa có tính năng kiểm tra chính tả, thì các từ 'sai chính tả' sẽ được gạch dưới, do đó làm mờ dấu gạch dưới. Đây là một lý do chính đáng để không sử dụng dấu gạch dưới. Ngoài ra, trường hợp Camel ngắn hơn. Cuối cùng, phím shift dễ sử dụng trên các chữ cái hơn ở hàng trên (tức là phím shift '-').
Tihamer

@Tihamer Những người khác sẽ cho rằng snake_casebiểu mẫu này dễ đọc hơn. Đặc biệt với những từ ngắn (1-2 chữ cái), tôi chắc chắn sẽ phản bác rằng đây là trường hợp. Đối với "khó gõ", việc gõ một từ với lotOfMixedCaseWithinIt cũng không thực sự thuận tiện. Tôi ủng hộ rằng đó là vấn đề của những gì bạn đã quen. Tuy nhiên, trong Java, tôi nói "sử dụng biểu mẫu chung" theo khuyến nghị của JLS / etc. Trong Ruby / Python / C, hãy sử dụng trường hợp con rắn. Và như vậy ...
Per Lundberg

37

Quy tắc:

  1. Làm những gì mã bạn đang chỉnh sửa
  2. Nếu # 1 không áp dụng, hãy sử dụng camelCase, không có dấu gạch dưới

31

Tôi không nghĩ rằng việc sử dụng _ hoặc m_ để chỉ ra các biến thành viên là không tốt trong Java hoặc bất kỳ ngôn ngữ nào khác. Theo ý kiến ​​của tôi, nó cải thiện khả năng đọc mã của bạn vì nó cho phép bạn xem một đoạn mã và nhanh chóng xác định tất cả các biến thành viên từ người dân địa phương.

Bạn cũng có thể đạt được điều này bằng cách buộc người dùng phải thêm trước các biến cá thể bằng "this" nhưng tôi thấy điều này hơi hà khắc. Theo nhiều cách, nó vi phạm DRY vì nó là một biến thể hiện, tại sao lại đủ điều kiện cho nó hai lần.

Phong cách cá nhân của riêng tôi là sử dụng m_ thay vì _. Lý do là có cả các biến toàn cục và biến tĩnh. Lợi thế của m _ / _ là nó phân biệt được phạm vi biến. Vì vậy, bạn không thể sử dụng lại _ cho toàn cục hoặc tĩnh và thay vào đó tôi chọn g_ và s_ tương ứng.


1
Câu hỏi này là hỏi về Java gạch dưới nói chung, không phải chỉ hỏi chúng ở các biến thành viên (mặc dù đây là một ví dụ trong câu hỏi).
Georgi

10
Vì vậy, bạn đánh dấu cho tôi nhận xét về một tập hợp con của câu hỏi? Có vẻ hơi cực đoan
JaredPar 30/09/08

1
@JaredPar - bạn là người duy nhất đưa ra gợi ý tạo kiểu thay thế tốt. +1 cho điều đó.
djangofan

Viết this.foo (hoặc this-> foo trong C ++) có lẽ sẽ là một cách rõ ràng hơn nhiều để phân biệt local và các trường / biến thành viên.
Kevin

7

"Phong cách xấu" là rất chủ quan. Nếu một quy ước nhất định phù hợp với bạn và nhóm của bạn, tôi nghĩ điều đó sẽ đủ tiêu chuẩn cho một phong cách xấu / tốt.

Để trả lời câu hỏi của bạn: Tôi sử dụng dấu gạch dưới ở đầu để đánh dấu các biến riêng. Tôi thấy nó rõ ràng và tôi có thể quét mã nhanh chóng và tìm ra những gì đang xảy ra.

(Tôi hầu như không bao giờ sử dụng "this", ngoại trừ để ngăn chặn một cuộc đụng độ tên.)


Giống như bạn đã nói, phong cách là rất chủ quan. Tôi có xu hướng sử dụng thiskhá phóng khoáng để chỉ một biến thành viên nếu tôi nghĩ rằng nó cần được chú ý đến. Tuy nhiên, tôi không phải là người sốt sắng về nó.
Chris Cudmore 29/09/08

6

sử dụng 'm_' hoặc '_' ở phía trước một biến giúp dễ dàng phát hiện các biến thành viên trong các phương thức xuyên suốt một đối tượng.

Như một lợi ích phụ, nhập 'm_' hoặc '_' sẽ làm cho intellsense bật chúng lên đầu tiên;)


5
Nếu bạn đang lập trình Java, rất có thể bạn sẽ có một IDE sẽ tô màu các biến thành viên của bạn bằng một màu khác. "m_" thật khó chịu.
JeeBee 29/09/08

Tôi thích "của nó" hơn vì nó đọc tốt:if (itsEmail.equals(email))
davetron5000. 29/09/08

7
Tôi thích điều này. cho tên thành viên. Tuyệt đối không thể nhầm lẫn.
S.Lott

5
  • Tôi tình cờ thích dấu gạch dưới hàng đầu cho các biến cá thể (riêng tư), nó có vẻ dễ đọc và dễ phân biệt hơn. chúng mà bạn cho là phá vỡ quy ước đặt tên của bạn:
  • private int _my_int; public int myInt;? _my_int? )

-như tôi thích _style của cái này và nghĩ rằng nó có thể đọc được, tôi thấy nó được cho là rắc rối hơn đáng giá, vì nó không phổ biến và nó có khả năng không khớp với bất kỳ thứ gì khác trong codebase bạn đang sử dụng.

-tạo mã tự động (ví dụ: bộ tạo mã, bộ định tuyến của eclipse) có khả năng không hiểu điều này, vì vậy bạn sẽ phải sửa nó bằng tay hoặc kết hợp với eclipse đủ để nó nhận ra.

Cuối cùng, bạn đang đi ngược lại phần còn lại của prefs trên thế giới (java) và có thể gặp một số khó chịu từ điều đó. Và như các áp phích trước đã đề cập, tính nhất quán trong cơ sở mã giải quyết tất cả các vấn đề trên.


3
Việc thiết lập Eclipse để hiểu các tùy chọn tiền tố (hoặc hậu tố) của bạn khá đơn giản. Trong Preferences-> Java-> Code Style có một bảng nơi bạn có thể đặt quy ước tên biến cho các trường, trường tĩnh, trường cuối cùng tĩnh, tham số và biến cục bộ. Tất cả các trình tạo mã dường như tôn trọng các cài đặt này.
metasim

5

Có một lý do tại sao việc sử dụng dấu gạch dưới được coi là một phong cách xấu ngày xưa. Khi một trình biên dịch thời gian chạy là một thứ không thể mua được và các màn hình có độ phân giải đáng kinh ngạc 320x240 pixel, thường không dễ dàng để phân biệt giữa _name__name.


Đây là lý do tại sao OCaml sẽ không bao giờ chạy trên các máy cũ.
David Tonhofer

4

Thật tuyệt khi có một cái gì đó để phân biệt các biến private và public, nhưng tôi không thích '_' trong cách viết mã chung. Nếu tôi có thể giúp nó trong mã mới, tôi tránh sử dụng chúng.


4

Đây là một liên kết đến các đề xuất của Sun cho Java. Không phải bạn phải sử dụng những thứ này hoặc thậm chí mã thư viện của chúng theo sau tất cả chúng, nhưng đó là một khởi đầu tốt nếu bạn đang làm lại từ đầu. Công cụ như Eclipse đã tích hợp sẵn các bộ định dạng và công cụ dọn dẹp có thể giúp bạn tuân thủ các quy ước này (hoặc các quy ước khác mà bạn xác định).

Đối với tôi, '_' quá khó để nhập :)


3

Đó là sự pha trộn của các phong cách mã hóa. Một trường phái tư tưởng là viết đầu các thành viên riêng tư bằng dấu gạch dưới để phân biệt họ.

setBar( int bar)
{
   _bar = bar;
}

thay vì

setBar( int bar)
{
   this.bar = bar;
}

Những người khác sẽ sử dụng dấu gạch dưới để chỉ ra một biến cục bộ tạm thời sẽ vượt ra khỏi phạm vi khi kết thúc cuộc gọi phương thức. (Tôi thấy điều này khá vô ích - một phương pháp tốt không nên dài đến vậy, và tuyên bố là ĐÚNG RỒI! Vì vậy tôi biết nó vượt ra khỏi phạm vi) Chỉnh sửa: Chúa cấm một lập trình viên từ trường này và một lập trình viên từ trường member ! Nó sẽ là địa ngục.

Đôi khi, mã được tạo sẽ mở đầu các biến bằng _ hoặc __. Ý tưởng là không có con người nào làm điều này, vì vậy nó an toàn.


Trong trường hợp của bạn, tôi sử dụng như sau: setBar (int aBar) {bar = aBar; } Có thể đọc được, không có cái này. hoặc _bar ...
Georgi

Điều đó đủ công bằng, nhưng sau đó aBar xuất hiện trong chữ ký phương thức trong API và tôi nghĩ nó trông lộn xộn.
Chris Cudmore 30/09/08

1
Tôi thực sự đã gặp phải trường hợp mã được tạo tự động khớp với một trong các từ khóa ngôn ngữ, vì vậy cách tốt nhất để tránh điều này là thêm dấu _ ở đầu.
Joe Plante

2

Tôi nghĩ rằng bất kỳ phong cách nào phá vỡ các nguyên tắc về phong cách riêng của một ngôn ngữ (mà không có lý do chính đáng) là xấu và do đó "xấu".

Không còn nghi ngờ gì nữa, đoạn mã bạn đã xem được viết bởi một người từng làm việc trên một ngôn ngữ mà dấu gạch dưới được chấp nhận.

Một số người không thể thích ứng với các phong cách mã hóa mới ...


Tôi hầu như đồng ý với triết lý "làm như những người khác làm" khi viết mã, nhưng không phải là tuyệt đối. Tôi nghĩ rằng có một lập luận rất mạnh mẽ rằng, với độ dài mã định danh hợp lý, thì solid_cased_variables dễ đọc hơn CamelCasedVariables. Lời biện minh của tôi là giảm tải nhận thức một cách trực quan là một việc nhỏ, nhưng vẫn hữu ích. Mọi người đánh giá cao khoảng trắng trong mã, khi đọc tài liệu và nghe nhạc. Tôi nghĩ rằng trường hợp lạc đà là một sự phản đối với khoảng trắng nhân danh 'hiệu quả'. Hiệu quả cho ai?
David J.

2

Lý do mọi người làm điều đó (theo kinh nghiệm của tôi) là để phân biệt giữa các biến thành viên và tham số hàm. Trong Java, bạn có thể có một lớp như thế này:

public class TestClass {
  int var1;

  public void func1(int var1) {
     System.out.println("Which one is it?: " + var1);
  }
}

Nếu bạn tạo biến thành viên _var1 hoặc m_var1, bạn sẽ không có sự mơ hồ trong hàm.

Vì vậy, đó là một phong cách, và tôi sẽ không gọi nó là xấu.


Trong trường hợp này, tôi thường đổi tên tham số là "aVar1". Ngược lại với "the var1".
Lluis Martinez

1

Cá nhân tôi nghĩ rằng một ngôn ngữ không nên đưa ra các quy tắc về phong cách viết mã. Đó là vấn đề về sở thích, cách sử dụng, sự tiện lợi, khái niệm về khả năng đọc.
Bây giờ, một dự án phải thiết lập các quy tắc mã hóa, để có sự nhất quán giữa các danh sách. Bạn có thể không đồng ý với những quy tắc này, nhưng bạn nên tuân thủ nếu bạn muốn đóng góp (hoặc làm việc theo nhóm).

Ít nhất, các IDE như Eclispe là bất khả tri, cho phép đặt các quy tắc như tiền tố hoặc hậu tố biến, nhiều kiểu đặt dấu ngoặc nhọn và quản lý khoảng trắng, v.v. Vì vậy, bạn có thể sử dụng nó để định dạng lại mã của mình hướng dẫn .

Lưu ý: Tôi là một trong số những người giữ thói quen cũ của họ từ C / C ++, viết mã Java với tiền tố m_ cho các biến thành viên (và s_ cho các biến tĩnh), đặt tiền tố boolean bằng một chữ cái đầu b, sử dụng ký tự hoa đầu tiên cho tên hàm và căn chỉnh dấu ngoặc nhọn. .. Nỗi kinh hoàng cho những người theo trào lưu chính thống Java! ;-)
Thật thú vị, đó là các quy ước được sử dụng ở nơi tôi làm việc ... có lẽ vì nhà phát triển ban đầu chính đến từ thế giới MFC! :-D


0

đó chỉ là phong cách của riêng bạn, không có gì là mã kiểu xấu và không có gì là mã kiểu tốt, chỉ cần khác biệt mã của chúng tôi với những mã khác.

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.