Tại sao hầu hết các trường (thành viên lớp) trong hướng dẫn Android bắt đầu bằng `m`?


446

Tôi biết về quy tắc trường hợp lạc đà, nhưng tôi bối rối với quy tắc m này. nó đứng để làm gì? Tôi là một nhà phát triển PHP. "Chúng tôi" sử dụng các chữ cái đầu tiên của biến như là dấu hiệu của loại, như 'b' cho boolean, 'i' cho số nguyên, v.v.

Có phải 'm' là một thứ Java? Liệu nó có đứng cho điện thoại di động? Trộn?


281
tiền tố đó không làm gì khác ngoài việc làm rối tung khả năng đọc ...
Dapeng

10
chỉ ra loại tiền tố là xấu và được gọi là ký hiệu Hungary, xem thc.org/root/phun/unmaintain.htmlkernel.org/doc/Documentation/CodingStyle
Muayyad Alsadi

10
bởi vì họ không có nhiều kiến ​​thức về phong cách mã java để bắt đầu
Victor Ionescu

10
Theo tôi, nếu bạn gặp khó khăn trong việc phân biệt các biến cục bộ với các biến thành viên, bạn có vấn đề lớn hơn nhiều so với việc tuân thủ quy ước mã. Đây là quy ước tôi sử dụng (đôi khi): Cuộc sống lâu dài, Tên dài. Cuộc sống ngắn ngủi, tên ngắn. Không bị nhầm lẫn cho đến nay.
Brandon

17
Một tiền tố ngu ngốc thực sự. Sử dụng IDE của bạn để tạo setters / getters và bạn kết thúc với getmName () và setmName ()! Ngoài ra các công cụ như Lombok cho thế hệ setters, getters, contrtionors, vv sẽ tạo tiền tố m. Trong tùy chọn của tôi, tiền tố m không thêm giá trị và nên được loại bỏ khỏi quy ước đặt tên.
userM1433372

Câu trả lời:


551

Ký hiệu này xuất phát từ Nguyên tắc kiểu mã của AOSP (Dự án nguồn mở Android) dành cho người đóng góp :

Thực hiện theo các quy ước đặt tên trường

  • Tên trường không công khai, không tĩnh bắt đầu bằng m.
  • Tên trường tĩnh bắt đầu bằng s.
  • Các lĩnh vực khác bắt đầu bằng một chữ cái viết thường.
  • Các trường tĩnh cuối cùng (hằng số) là ALL_CAPS_WITH_UNDERSCORES.

Lưu ý rằng hướng dẫn kiểu được liên kết là để mã được đóng góp cho Dự án mã nguồn mở Android.

Đây không phải là hướng dẫn về phong cách cho mã của các ứng dụng Android riêng lẻ.


33
Thật thú vị .. Phong cách mã Java của Google thực sự mâu thuẫn với Kiểu mã AOSP liên quan đến điều này.
Gautam

51
Tôi nghĩ trong những thời điểm này thật vô lý, đặc biệt là làm điều đó trong ứng dụng của bạn! "Các lớp và hàm của bạn phải đủ nhỏ để bạn không cần đến chúng. Và bạn nên sử dụng một môi trường chỉnh sửa làm nổi bật hoặc tô màu các thành viên để làm cho chúng khác biệt. Bên cạnh đó, mọi người nhanh chóng học cách bỏ qua tiền tố (hoặc hậu tố) để xem phần ý nghĩa của tên. Càng đọc mã, chúng ta càng thấy các tiền tố ít hơn. Cuối cùng, các tiền tố trở nên lộn xộn không nhìn thấy và một dấu hiệu của mã cũ hơn. " - Robert Martin trong Clean Code
mikugo

4
Mâu thuẫn với Hướng dẫn về Phong cách Java của Google - "Tên trường không cố định (tĩnh hoặc khác) được viết bằng lowCamelCase. ... Ví dụ: computedValues..."
AlikElzin-kilaka

Đối với các ứng dụng riêng lẻ, tôi nhớ một mẹo hay gợi ý sử dụng tên viết tắt chữ thường của tên ứng dụng thay vì 'm'.
abcoep

4
Vui lòng thêm nhận xét của bạn để thỉnh nguyện thư này để loại bỏ các quy tắc code.google.com/p/android/issues/detail?id=226814
likejudo

83

Rất nhiều dòng hướng dẫn mã hóa sử dụng m cho 'thành viên' của một lớp. Vì vậy, khi bạn lập trình, bạn có thể thấy sự khác biệt giữa các biến cục bộ và biến thành viên.


90
Tất cả các IDE hiện đại phân biệt người địa phương và thành viên theo màu sắc / phông chữ, đó là cách IMHO dễ đọc hơn mtiền tố.
Dzmitry Lazerka

5
đã đồng ý. Tôi thấy điều m rất phiền phức, nhưng chỉ vì IntelliJ tuyệt vời.
ZakTaccardi 7/2/2015

Vui lòng thêm nhận xét của bạn để thỉnh nguyện thư này để loại bỏ các quy tắc code.google.com/p/android/issues/detail?id=226814
likejudo

4
@DzmitryLazerka trong hầu hết các công cụ đánh giá mã bạn không có mức độ nổi bật này. Vì vậy, nó có ý nghĩa trong một dự án nguồn mở lớn.
JWqvist

@DzmitryLazerka còn đọc mã trong notepad hay github thì sao?
dùng924

57

mTiền tố là gì?

mlà viết tắt của biến thành viên hoặc dữ liệu thành viên. Sử dụng mtiền tố cho các trường không công khai và không tĩnh.

Khi nào nên sử dụng?

private String mCityName;
private float mTemperature;

Khi nào không sử dụng?

public static int mFirstNumber;
public static final String mDATABASE_NAME;

Những gì tôi làm?

Cá nhân, tôi không sử dụng nó. Nó làm cho mã phức tạp hơn và hỗn loạn dễ đọc. Nếu bạn vẫn đang sử dụng Notepad để mã hóa thì tôi không có từ nào, nhưng các IDE hiện đại có khả năng làm nổi bật và tô màu các biến thành viên và biến cục bộ hoặc bất cứ thứ gì khác.

Phần kết luận

Sử dụng? "Có" hoặc "Không" là lựa chọn cá nhân của bạn.


1
bạn cũng có thể sử dụng nó cho public static int, nhưng sử dụng sthay vì m: public static int sFirstNumber;, xem stackoverflow.com/a/49453184/7767664
user924

31

Nếu đó là biến thành viên trong các lớp, 'm' có nghĩa là 'thành viên'. Nhiều lập trình viên Java làm điều đó, mặc dù với các IDE hiện đại, không cần thiết vì bạn đã tô sáng, di chuột qua các chú giải công cụ, v.v.


9
Tôi sẽ lập luận rằng ngay cả với một IDE hiện đại, thật tốt khi các tiền tố thành viên có m hoặc m_ với mục đích đưa ra tất cả các biến thành viên cho một lớp ở cùng một vị trí khi sử dụng hoàn tất mã. Điều này có nghĩa là khi bạn đang làm việc trong một lớp, bạn có thể chỉ cần nhấn vào không gian m_ + ctrl để có danh sách tất cả các thành viên.
Thợ làm móng

38
Nailer, bạn có thể đạt được điều tương tự bằng cách sử dụng này. + không gian ctrl :)
Romain Guy

3
Ngoài ra, nếu bạn in ra danh sách mã, điều đó rất hữu ích - bạn không có chú giải công cụ để giúp bạn ngoài đó (vâng, tôi thích in mã ra và đọc chúng trên một chiếc ghế dễ dàng hoặc thậm chí trên giường đôi khi).
B. Clay Shannon

3
@domenicop Tôi không phải là tiền tố chuyên nghiệp, tuy nhiên tôi đoán rằng ý tưởng này là để phân biệt giữa các loại thuộc tính trong một lớp. Điều đó đang được nói, tôi thường không sử dụng các thuộc tính không tĩnh công khai ở bất cứ đâu, ngoại trừ trong các lớp chỉ chứa các thuộc tính đó và không có logic nghiệp vụ (các lớp bản ghi). Trong trường hợp này, m là vô dụng vì không có logic kinh doanh trong lớp. Do đó, tốt hơn hết là xóa nó để dễ đọc bên ngoài lớp (khi bạn tham chiếu các trường này).
Joffrey

2
Theo tôi, nếu bạn không thể dễ dàng phân biệt giữa các trường, tham số và biến mà không sử dụng các tiền tố như vậy, điều đó có nghĩa là có lỗi với mã. Nhiều khả năng lớp hoặc phương thức chỉ là quá lớn.
Konrad Morawski 7/07/2015

9

Theo sách Clean Code, nó không phải là một mã sạch.

Bạn không cần phải thêm tiền tố vào các biến thành viên với m . Bên cạnh đó, mọi người nhanh chóng học cách bỏ qua tiền tố hoặc hậu tố để xem phần ý nghĩa của tên.


9

Nếu bạn có vấn đề như

IDE của bạn để tạo setters / getters và bạn kết thúc với getmName () và setmName ()

Đừng quên làm tiếp ( Cài đặt / Trình chỉnh sửa / Kiểu mã / Java / Tạo mã ):

nhập mô tả hình ảnh ở đây

Cập nhật: chúng tôi không sử dụng cái gì đó như thế này trong Kotlin (vì vậy tốt hơn là chuyển sang dùng nó và không sử dụng tiền tố nữa)


6

Tôi nghĩ rằng nó rất riêng biệt mà các quy ước mã được sử dụng. Tôi thích đặt tên các biến của mình bằng các tiền tố sau:

  • m - Biến phương thức
  • c - Biến lớp
  • p - Biến tham số

Nhưng tôi đoán rằng mỗi lập trình viên có phong cách riêng của họ.


7
Xem xét rằng hầu hết các nhà phát triển Java sử dụng IDE cho phép thiết lập các kiểu trực quan khác nhau cho các biến lớp, phương thức, tĩnh và tham số, tôi thấy hữu ích hơn nhiều khi có các biến / phương thức tĩnh được gạch chân, biến lớp in nghiêng, v.v. bạn có thể thiết lập phông chữ và màu sắc của riêng bạn. Và nó sẽ luôn hoạt động cho dù bạn sử dụng tiền tố nào. Nhưng, tất nhiên, điều kỳ diệu đã biến mất khi bạn rời khỏi IDE.
ccpizza

4

Để chứng minh rằng bạn chắc chắn không nên xử lý quy ước này để đặt tên biến trong mã của mình, tôi chuyển một ảnh chụp màn hình từ Android Studio cha mẹ dưới đây.

Tìm các biến đó bên trong một đối tượng được sắp xếp đặc biệt để đặt các biến m thấp hơn các biến gốc của bạn . Vì vậy, bằng cách đặt tên chúng trong mã của bạn với tiền tố "m", bạn ẩn chúng trong một đống từ chính mình .

nhập mô tả hình ảnh ở đây


3

Lợi ích tôi tìm thấy của kiểu mã này là khi tự động hoàn thành một số tham chiếu đến một biến, tôi biết rằng tôi có thể nhập "m" để chỉ xem các biến thành viên.


2

Như đã đề cập trước đó, nó được tạo kiểu cho các biến khác nhau. Nhưng nó cũng rất hữu ích cho việc tạo mã. Nếu bạn nhấn "Alt + Chèn", bạn sẽ nhận được các cửa sổ cho các thuộc tính thế hệ mã phổ biến nhất. Nếu bạn muốn tạo phương thức "get" cho biến của mình, bạn sẽ nhận được.

public class Foo{
   private int bar;

   public int getBar(){
       return this.bar;
   }

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

}

Nhưng nếu bạn khai báo "m, s", bạn sẽ nhận được:

public class Foo{
private int mBar;

public int getBar(){
   return mBar;
}

public void setBar(int bar){
   mBar = bar;
}
}

Nó sẽ được tạo tự động và "m" hoặc "s" bị xóa khỏi hàm tạo của bạn, lấy, đặt tên phương thức. Sau đó, "get" 'và "set" cho trường sẽ được tạo mà không có "m". Andoroid Fle-> Cài đặt-> Kiểu mã-> Java-> Mã hóa. Và làm như trên một bức tranh. Có lẽ nó sẽ giúp. Xin lỗi cho anh em của tôi. Cấu hình android


2

Dường như đó là sở thích cá nhân của một số kỹ sư Android / Google đầu tiên để bắt đầu các biến thành viên với 'm' và vì vậy họ đã khuyến nghị điều đó.

Bây giờ quy tắc này đang bị ép buộc bởi các nhà phát triển trong các công ty không phải là người đóng góp AOSP, đơn giản vì trang đó được coi là quy tắc Kiểu Mã của Android. Có rất ít nếu có lợi ích trong quy tắc đó. Google nên xem xét loại bỏ nó. Nếu không, vui lòng xác định rằng đối với Ứng dụng Android, Quy tắc kiểu mã là tùy chọn.

Vui lòng thêm nhận xét hỗ trợ của bạn vào bản kiến ​​nghị này để xóa quy tắc https://code.google.com.vn/p/android/issues/detail?id=226814


2

Vì vấn đề dễ đọc, quy ước về mcác biến thành viên và scho các trường tĩnh không nên được sử dụng nữa nếu bạn đang sử dụng một IDE hiện đại như Android Studio. Android Studio có thể phân biệt giữa những người mà không cần thêm mhoặc s.


1

Cũng có thể nói rằng nó là viết tắt của "của tôi", vì trong Class / Instance đang nói "Biến này là của tôi và không ai khác có thể lấy nó". Khác với tĩnh, trong khi nó chỉ có thể có sẵn cho Lớp, nó được chia sẻ bởi tất cả các phiên bản của lớp đó. Giống như nếu bạn đang vẽ các vòng tròn, bạn cần biết bán kính của mỗi vòng tròn lớn như thế nào

    private double mRadius;

nhưng đồng thời bạn muốn có một bộ đếm để theo dõi tất cả các vòng tròn, bên trong lớp vòng tròn bạn có thể có

    private static int sCircleCount;

và sau đó chỉ cần có các thành viên tĩnh để tăng và giảm số lượng các vòng tròn bạn hiện có.


1

Sau đây là các quy ước đặt tên,

  • Tên trường không công khai, không tĩnh bắt đầu bằng m.
  • Tên trường tĩnh bắt đầu bằng s.
  • Các lĩnh vực khác bắt đầu bằng một chữ cái viết thường.
  • Các trường tĩnh cuối cùng (hằng số) là ALL_CAPS_WITH_UNDERSCORES.

Thí dụ:

public class MyClass {
    public static final int SOME_CONSTANT = 42;
    public int publicField;
    private static MyClass sSingleton;
    int mPackagePrivate;
    private int mPrivate;
    protected int mProtected;
}
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.