Đặt tên trong code như nào cho bớt ngu?

3952

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh

1. Khái niệm đầu tiên

Chuyện đặt tên thì chả ai dạy ở trường DH cả, toàn hứng như nào thì đặt như vậy thôi. Nếu ông nào nói với tôi trường ông dạy cách đặt tên, quy tắc các kiểu thì chúc mừng ông thế thôi.

  "Code dễ đọc" là như thế nào?

  Vừa học vừa chơi! Top 15+ game lập trình miễn phí

Tên thì bất cứ đâu trong code của bạn. Tên biến, tên hàm, tên lớp, packages… Vậy thì đặt tên như nào cho chuẩn? Hồi mới đi làm, sếp nói 1 câu nhớ tới bây giờ: Em cứ đặt tên dài cũng được, miễn là nó giải thích luôn tên đó để làm cái gì, còn hơn là đặt abc  i hay j mà chả biết mục đích nó là gì cả. Càng đơn giản càng tốt. Ví dụ bây giờ ta đặt tên ngày tháng năm trong C++:

int a, b, c;

Tôi tự hiểu a là ngày, b là tháng, c là năm! Đem code cho thầy đọc méo hiểu đúng không? Vậy đấy là cái ngu nhiều ông dễ mắc phải.

Sửa lại:
int ngay, thang, nam;

Ít nhất 3 cái biến kiểu nguyên trên cũng đã giải thích luôn nó để lưu cái gì.

Sách gốc đặt:

int elapsedTimeInDays;

int daysSinceCreation;

int daysSinceModification;

int fileAgeInDays;

Trông nó clear chưa? Vậy quy tắc đầu tiên tôi muốn nhét vào mũi bạn là đặt tên thì đặt cho dễ hiểu vào, không sau thằng đọc code bạn nó lại “dm thằng lol cái méo gì thế này”

Bây giờ thử đọc đoạn code sau:

std::vector<int> getThem() {

    std::vector<int> list1;

       for (int i = 0; i < theList.size(); i++)

        if (theList[0] == 4)

                list1.push_back(theList[i]);

    return list1;    

}

Các ông hiểu mẹ gì không? theList là cái méo gì?  Tại sao lại so sánh với 4?

Rồi méo hiểu đúng không. Thế nên bây giờ đọc đoạn code sau xem thế nào:

#define FLAGGED 4

std::vector<int> getFlaggedCells() {

    std::vector<int> flaggedCells;

    for (int i = 0; i < gameBoards.size(); i++)

        if (theList[0] == FLAGGED)

                flaggedCells.push_back(theList[i]);

    return flaggedCells;

}

Đọc từng dòng: Đầu tiên là định nghĩa 4 có nghĩa là FLAGGED. Sau đó đổi tên hàm thành getFlaggedCell. Hàm này trả về danh sách cell flagged. Cái flggedCell là cái cần trả về. Lấy từng phần tử tỏng gameBoard so sánh với FLAGGED để xem nó có phải là flagged hay không. Đấy, cùng 1 logic máy hiểu như nhau, nhưng rõ ràng với người thì chỉ hiểu được cái hàm khi ông ta đã đặt lại các thứ 1 cách clean!

2. Tiền tố trong tên

Trước mới vào nghề IT, tôi thường hay thêm cái prefix ở đầu. Ví dụ:

class Date {

int day;

};

Tôi sửa thành:

class Date {

int mDay;

};

Nói chung đây là 1 quy tắc hay áp dụng ngay cả java nữa. Nhưng bạn thích đặt hay không tuỳ bạn, miễn phải ghi nhớ như sau:

Giả sử trung C++ ta có hàm setDay:

void Date::setDay (int day) {

mDay = day;

}

Giả sử bạn muốn dùng biến day trong class Date trên thì bạn sẽ phải dùng con trỏ this như này:

void Date::setDay (int day) {

this.day = day;

}

để phân biệt day ở trong là day của class Date, còn day kia là tham số truyền vào.

Nếu bạn quên không dùng this thì coi như tự gán nó vào nó. Kết quả là sai! May mắn bây giờ các IDE có màu sắc phân biệt cho dev đỡ nhầm rồi. Tuy nhiên các newbie mới vào nghề thì vẫn hay lơ mơ mà nhầm lắm.

Chốt lại bạn muốn dùng tiền tố cũng được, không dùng cũng được nhưng phải tỉnh. Sách nói là bạn không nên dùng, đừng cố làm nó phức tạp. Nhưng tôi nghĩ dự án ông sếp yêu cầu thì vẫn phải dùng thôi. CLingme tụi tôi chẳng hạn, có 1 lô lốc yêu cầu đặt prefix luôn :))

ví dụ tôi thường thêm m_o cho object, m_i cho biến integer, m_c cho biến char,…

3. Interface và implementation

Interface là cái mẽ gì? Đơn giản tôi hay dùng nó trong C++ như này:

class TheFunyFuck;

class ITheFuckAllDelegate {

public:

virtual void onFuck(TheFunyFuck* sender) = 0;

};

Thì cái lớp IFuckAllDelegate được gọi là lớp interface – giao diện =)) sao lại là giao diện? Giao diện là cái bạn trông thấy tên hàm mà méo thấy phần code của hàm. Hàm virutal ảo thì làm gì có code, ông nào kế thừa lại lớp IFuckAllDelegate thì mới bắt buộc phải viết code. Ở đây quy tắc là nếu như lớp đó là Interface thì bắt đầu bằng I.

Implementation là việc xử lý lại interface đó. Tôi cũng chưa gặp bao giờ việc viết code cho nó nên cũng chưa rõ cách đặt tên thế nào cho chuẩn. Ví dụ trong sách, anh em tự nghiên cứu:

ShapeFactoryImp

4. Tên lớp

Tên lớp là danh từ hay cụm danh từ và bắt đầu bằng chữ cái viết hoa. Ví dụ:
class Sinhvien;

class Giaovien;

Méo ai đặt tên là:
class Lambaitap;

class Daysinhvien;

class cailogithon;

5. Tên phương thức

Tên phương thức là động từ hay cụm động từ, bắt đầu bằng chữ cái thường. Ví dụ các bạn hay thấy hàm set và get:

void setName(string name);

string getName();

Méo ai lại đặt như này:

void SetName(string name);

Còn trường hợp hàm tạo và quá tải hàm thì làm như nào? Ví dụ bạn có hàm tạo phân số như này:

Phanso(string tuso, string mauso);

Phanso(int tuso, int mauso);

Phanso(float tuso, float mauso);

Thì bọn nó khuyên là nên làm như  này:

void FromInt(int tuso, int mauso);

void FromFloat(int tuso, int mauso);

void FromString(string tuso, string mauso);

Và khi dùng thì chỉ cần gọi:

Phanso pt;

pt =pt.FromInt(2, 3);

Kiểu nó thế :)) Cái này thì ở C++ tôi thấy không hay dùng, nhưng java thì lắm lắm.

Thôi chốt là tên lớp thì là danh từ và viết hoa chữ đầu. Tên phương thức là động từ và viết thường chữ đầu ha 🙂

Tiếp nữa là đừng có cố đặt những cái tên mỹ miều mà ý nghĩa chả là mấy.

Nói về con người bạn nghĩa là gì, thì nghĩa đó chính là con người bạn. (

Say what you mean. Mean what you say) dịch hơi tù =))

Bài này tôi viết ngắn vậy thôi, viết dài thành viết dại. Happy!

Bài viết gốc được đăng tải tại quynhlaptrinhc.wordpress.com

Có thể bạn quan tâm: