Android

Cách đặt tên instance cho đúng khi code Java và Android

Khi các bạn nhờ giúp đỡ, có gửi code cho tôi đọc qua thì thực tế là tôi rất khó chịu với cách đặt tên instances và methods của khá nhiều bạn. Một số bạn dùng cả tiếng Anh và tiếng Việt, làm tôi đọc hơi bị “quáng gà”. Dù sao tôi vẫn có thiện cảm với các bạn có tư duy lập trình tốt nhưng tiếng Anh chưa cứng, thể hiện qua cách đặt tên methods, chẳng hạn getTenBaiHat(). Nhưng mong bạn hạn chế lại, nếu tiếng Anh bạn chưa cứng và chưa có thời gian trau dồi thì cứ dùng tiếng Việt hết, như layTenBaiHat() thay cho getTenBaiHat(), nghe nó xuôi tai hơn.

Tuy nhiên, cách đặt tên sau lại gây cảm giác rất khó chịu, và nếu một ngày đẹp trời, bạn push source lên GitHub thì những ai ở nước ngoài vào đọc sẽ tặng bạn gạch đá hoặc ít nhất cũng chửi rủa vì nó khá kì cục. Đó là txtvHoTen, edtNgaySinh, btnDangKi… Thực ra tôi hiểu ý các bạn, là đặt tên như vậy để biết đối tượng mình thao tác là cái gì. Chẳng hạn txtvHoTen nghĩa là nó là một cái TextView, edtNgaySinh là một EditText, btnDangKi nghĩa là một Button. Nhưng khi thao tác quen rồi, bạn chỉ nhìn các chữ txtv, edt, btn theo hướng quán tính, còn thực chất cái bạn để ý chính là HoTen, NgaySinh, DangKi và lúc đó trong đầu bạn biết chúng là loại View gì mà không cần những chữ txtv, edt, btn rắc rối và hoàn toàn không cần thiết. Bởi bạn vẫn còn rất tỉnh táo để bố trí cái DangKi là một Button chứ không phải là một EditText.

Ngoài ra thì các bạn khác đặt tên biến theo kiểu Button dangKi, EditText ngaySinh, TextView hoTen. Cách này mặc dù hơi khó nhìn một chút nhưng nó vẫn được chấp nhận đối với cộng đồng quốc tế. Đối với các ngôn ngữ như Swift, Javascript, Python và Kotlin thì người ta dùng kiểu đặt tên vừa rồi luôn chứ không dùng kiểu đặt tên thông dụng theo quy chuẩn như đối với Java trong đó bao gồm Android. Hôm nay, tôi sẽ giới thiệu cách đặt tên của Java, và cách đặt tên này vô cùng dễ nhìn và dễ hiểu, và tôi hi vọng là các bạn sau khi đọc bài viết này thì cũng chuyển qua đặt tên theo phong cách đó khi code Android. Nếu bạn để ý thì khi code ví dụ cho Android, tôi bao giờ cũng dùng cách đặt tên này.

JavaAndroidInstanceNames

1. Tên non-static field member instances.

Trước hết bạn phải biết field member là cái gì. Lí thuyết thì dài dòng, tôi nghĩ bạn sẽ dễ hình dung hơn khi nhìn đoạn code dưới đây.

Các mTextView1, mTextView2, mButton được gọi là field member. Như vậy bạn đã hình dung được field member là gì rồi đúng không? Nó là instance của một Object class nằm trong một class khác. Chẳng hạn ở đây, mButton là một instance của Button class nằm trong MainActivity class. Điều này quá đỗi quen thuộc rồi bởi lập trình là gọi class lẫn nhau mà. Theo quy ước chung của cộng đồng quốc tế, các field member instance có tên bắt đầu bằng chữ m rồi mới tới tên bạn muốn đặt. Ồ, vậy thấy nó giống kiểu

đúng không? Cũng đúng, nhưng ở đây người ta quy định thêm chữ m để khi nhìn vào thì biết ngay đó là field member. Có thể tới phút giây này bạn chưa thấy được tầm quan trọng của chữ m đó, nhưng chờ tí đi, sau khi thấy các loại instance khác thì bạn sẽ “bị cuốn” theo lối đặt tên này ngay. Hạ hồi phân giải.

Không nhất thiết là sau m phải là tên class. Chẳng hạn, nếu bạn làm một Activity hiển thị tên và tuổi của người nào đó, thì bạn cứ thoải mái đặt:

Do đó bạn thấy là khi dùng thì bạn chả cần nhấn mạnh cái instance đó thuộc class nào, chẳng hạn mName thuộc TextView class. Rõ ràng không cần thiết, vì khi gọi tới instance mName, cho nó “thi triển” method nào đó thì cái IDE sẽ đưa đúng các methods của TextView ra mà suggest cho bạn. Tin hay không thì tùy, khi lấy biến ra, bạn không hề để ý tới cái chữ txtv hay btn mà chỉ để ý tới cái tên cụ thể của instance mà thôi, mà cụ thể trong trường hợp này là Name và Age.

Tuy nhiên, cũng cần phân biệt field member và property. Property được đặt tên theo cách “thông thường”, chẳng hạn, nếu như Name và Age là property của Student thì bạn không nên đặt chữ m vào, mà nên đặt là:

Như vậy, name và age là properties chứ không phải là field member. Vậy làm sao để phân biệt? Cũng đơn giản thôi. Những class nào thuộc dạng data class thì THƯỜNG (nhưng không phải lúc nào cũng vậy) chỉ chứa properties và các getters và setters cùng một số methods khác. Lí thuyết có vẻ khó hiểu nhưng khi làm vài class thì tôi tin là bạn sẽ nắm rõ chỗ này. Về mặt sử dụng cũng như tính gắn với instance của class thì field members và properties không khác gì nhau. Lưu ý là cả field member và property đều có thể được nằm trong constructor nên nếu bạn nghĩ chỉ có property nằm trong constructor thì bạn đang sai rồi đó. Về mặt phạm vi, properties có thể public, hoặc package-private, protected và private nhưng field members không bao giờ là public mà chỉ có thể là package-private, protected hoặc private mà thôi.

Nhưng bạn cũng phải phân biệt field members và local members. Field members là biến toàn class, sẽ xuất hiện khi instance của class được tạo và mất đi khi class bị diệt. Còn local members là instance nằm nội bộ trong một method, chẳng hạn:

Trước đây, cách đặt tên field member kiểu này còn được áp dụng khi viết ứng dụng C++, đặc biệt là khi dùng với Qt theo kiểu Hungarian notations. Tuy nhiên, cách này hiện tại không còn thịnh hành nữa.

2. Static field members:

Bên trên là những non-static field members. Khác với non-static members, sự tồn tại của static members gắn với bản thân class chứ không phải là instance của class. Chẳng hạn:

Thế nào là static member thì có lẽ tôi không cần trình bày nhiều vì nếu bạn đã code được một app dù mang tính ví dụ hay thực tế thì cũng phải hiểu static là gì. Ở đây thì bạn đặt chữ s trước tên thực của biến, chẳng hạn như bên trên.

Lưu ý cách đặt tên này không liên quan tới static method. Chẳng hạn:

Như vậy, khi bạn nhìn thấy tên một instance, bạn biết ngay nó là một property, hay một field member, hay một static field member để bạn có thể xử lí được. Việc cái instance đó thuộc class nào chẳng còn quan trọng nữa, vì đã có IDE suggest các method cho bạn rồi, bạn có cần phải nhớ đâu.

3. Constants:

Trong Java, các “công-xăng” được đặt tên theo quy ước là gồm toàn các chữ cái in hoa. Và vì chữ nào cũng in hoa nên việc thay đổi kí tự để phân tách từ là điều không thể. Do đó, bạn sẽ tìm kí tự thay thế cho khoảng trống (space) và ở đây kí tự được chọn là kí tự “_” (underscore) rất đỗi quen thuộc. Và lưu ý là constants nào cũng nên là static. Tất nhiên có những “công-xăng” không cần static nhưng nói chung chúng nên là static để đỡ phải tạo bản sao cho các instance khác nhau của class. Chẳng hạn:

Các constants mang tính local, nằm trong một method thì cũng nên được đặt tên theo hướng trên, khác ở chỗ chúng chỉ gồm chữ thường. Chẳng hạn:

4. Ví dụ tổng hợp:

Dưới đây là một class có tất cả các loại instance vừa kể trên với cách đặt tên tương ứng. Bạn có thể tham khảo.

Hi vọng bạn đã hiểu cách đặt tên này và sẽ chuyển sang sử dụng nó thay cho cách đặt tên “không phù hợp với thông lệ quốc tế” nữa. Và quy định này là của Google ban hành và tất cả các commit vào AOSP đều phải tuân thủ. Nếu bạn đủ trình nhưng lại đặt tên kiểu txtv, edt hay btn mà commit vào AOSP thì các cao nhân sẽ loại ra ngay lập tức. Chúc các bạn code vui vẻ sau kì nghỉ lễ vui vẻ.

2 thoughts on “Cách đặt tên instance cho đúng khi code Java và Android”

  1. Lỗi 1, em toàn dùng ButterKnife sinh ra từ file layout nên lúc nào cũng sinh ra kiểu tv, btn, edt, … mà nhìn nó cũng quen rồi :)) . Mà em xem code trên github vẫn thấy mấy ông tây cũng có thế mà anh.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.