Tôi hoàn toàn ủng hộ tiền tố được thực hiện tốt .
Tôi nghĩ (Hệ thống) ký hiệu Hungary chịu trách nhiệm cho hầu hết các "rap xấu" mà tiền tố nhận được.
Ký hiệu này phần lớn là vô nghĩa trong các ngôn ngữ được gõ mạnh, ví dụ như trong C ++ "lpsz" để cho bạn biết rằng chuỗi của bạn là một con trỏ dài đến một chuỗi kết thúc nul, khi: kiến trúc được phân đoạn là lịch sử cổ đại, các chuỗi C ++ là bởi các con trỏ quy ước chung để chấm dứt. mảng char và thực sự không khó để biết rằng "customerName" là một chuỗi!
Tuy nhiên, tôi sử dụng tiền tố để chỉ định sử dụng một biến (về cơ bản là "Ứng dụng tiếng Hungary", mặc dù tôi thích tránh thuật ngữ tiếng Hungary do nó có liên kết xấu và không công bằng với System Hungary) và đây là cách tiết kiệm thời gian rất tiện dụng và phương pháp giảm lỗi .
Tôi sử dụng:
- m cho các thành viên
- c cho hằng số / chỉ đọc
- p cho con trỏ (và pp cho con trỏ tới con trỏ)
- v cho dễ bay hơi
- s cho tĩnh
- i cho các chỉ mục và các vòng lặp
- e cho các sự kiện
Trường hợp tôi muốn làm cho loại rõ ràng, tôi sử dụng các hậu tố tiêu chuẩn (ví dụ: Danh sách, ComboBox, v.v.).
Điều này làm cho lập trình viên nhận thức được việc sử dụng biến bất cứ khi nào họ nhìn thấy / sử dụng nó. Có thể cho rằng trường hợp quan trọng nhất là "p" cho con trỏ (vì cách sử dụng thay đổi từ var sang var-> và bạn phải cẩn thận hơn nhiều với con trỏ - NULL, số học con trỏ, v.v.), nhưng tất cả những cái khác đều rất tiện dụng.
Ví dụ: bạn có thể sử dụng cùng một tên biến theo nhiều cách trong một hàm duy nhất: (ở đây là một ví dụ về C ++, nhưng nó áp dụng như nhau cho nhiều ngôn ngữ)
MyClass::MyClass(int numItems)
{
mNumItems = numItems;
for (int iItem = 0; iItem < mNumItems; iItem++)
{
Item *pItem = new Item();
itemList[iItem] = pItem;
}
}
Bạn có thể thấy ở đây:
- Không có sự nhầm lẫn giữa thành viên và tham số
- Không có sự nhầm lẫn giữa index / iterator và các mục
- Sử dụng một tập hợp các biến liên quan rõ ràng (danh sách mục, con trỏ và chỉ mục) để tránh nhiều cạm bẫy của các tên chung (mơ hồ) như "đếm", "chỉ mục".
- Tiền tố giảm nhập (ngắn hơn và hoạt động tốt hơn với tự động hoàn thành) so với các lựa chọn thay thế như "itemIndex" và "itemPtr"
Một điểm tuyệt vời khác của các trình lặp "iName" là tôi không bao giờ lập chỉ mục một mảng với chỉ mục sai và nếu tôi sao chép một vòng lặp bên trong một vòng lặp khác, tôi không phải cấu trúc lại một trong các biến chỉ số vòng lặp.
So sánh ví dụ đơn giản phi thực tế này:
for (int i = 0; i < 100; i++)
for (int j = 0; j < 5; j++)
list[i].score += other[j].score;
(khó đọc và thường dẫn đến việc sử dụng "i" trong đó "j" được dự định)
với:
for (int iCompany = 0; iCompany < numCompanies; iCompany++)
for (int iUser = 0; iUser < numUsers; iUser++)
companyList[iCompany].score += userList[iUser].score;
(dễ đọc hơn nhiều và loại bỏ tất cả sự nhầm lẫn về lập chỉ mục. Với tính năng tự động hoàn thành trong các IDE hiện đại, đây cũng là cách nhanh chóng và dễ dàng để nhập)
Lợi ích tiếp theo là các đoạn mã không yêu cầu bất kỳ bối cảnh nào được hiểu. Tôi có thể sao chép hai dòng mã vào email hoặc tài liệu và bất kỳ ai đọc đoạn mã đó đều có thể cho biết sự khác biệt giữa tất cả các thành viên, hằng, con trỏ, chỉ mục, v.v. Tôi không phải thêm "oh, và hãy cẩn thận vì 'Dữ liệu' là một con trỏ tới một con trỏ ", vì nó được gọi là 'ppData'.
Và với cùng một lý do, tôi không cần phải rời mắt khỏi dòng mã để hiểu nó. Tôi không phải tìm kiếm trong mã để tìm xem 'dữ liệu' là cục bộ, tham số, thành viên hay hằng số. Tôi không phải di chuyển bàn tay của mình sang chuột để tôi có thể di con trỏ qua 'dữ liệu' và sau đó chờ một chú giải công cụ (đôi khi không bao giờ xuất hiện) để bật lên. Vì vậy, các lập trình viên có thể đọc và hiểu mã nhanh hơn đáng kể , vì họ không lãng phí thời gian tìm kiếm lên xuống hoặc chờ đợi.
(Nếu bạn không nghĩ rằng mình lãng phí thời gian tìm kiếm lên xuống để tìm ra công cụ, hãy tìm một số mã bạn đã viết cách đây một năm và không nhìn vào đó. Mở tệp và nhảy xuống một nửa mà không đọc nó. bạn có thể đọc từ thời điểm này trước khi bạn không biết liệu có thành viên, tham số hay cục bộ nào không. Bây giờ hãy chuyển đến một vị trí ngẫu nhiên khác ... Đây là điều tất cả chúng ta làm cả ngày khi chúng ta bước qua mã của người khác hoặc cố gắng hiểu làm thế nào để gọi chức năng của họ)
Tiền tố 'm' cũng tránh ký hiệu "này->" xấu xí và dài dòng, và sự không nhất quán mà nó đảm bảo (ngay cả khi bạn cẩn thận, bạn thường kết thúc bằng một hỗn hợp 'này-> dữ liệu' và 'dữ liệu' trong cùng một lớp, vì không có gì bắt buộc một cách viết chính tả của tên).
Ký hiệu 'này' nhằm giải quyết sự mơ hồ - nhưng tại sao bất cứ ai cũng cố tình viết mã có thể mơ hồ? Sự mơ hồ sẽ dẫn đến một lỗi sớm hay muộn. Và trong một số ngôn ngữ, 'điều này' không thể được sử dụng cho các thành viên tĩnh, vì vậy bạn phải giới thiệu 'trường hợp đặc biệt' theo phong cách mã hóa của mình. Tôi thích có một quy tắc mã hóa đơn giản duy nhất áp dụng ở mọi nơi - rõ ràng, rõ ràng và nhất quán.
Lợi ích lớn cuối cùng là với Intellisense và tự động hoàn thành. Hãy thử sử dụng Intellisense trên Windows Form để tìm sự kiện - bạn phải cuộn qua hàng trăm phương thức lớp cơ sở bí ẩn mà bạn sẽ không bao giờ cần phải gọi để tìm sự kiện. Nhưng nếu mọi sự kiện đều có tiền tố "e", chúng sẽ tự động được liệt kê trong một nhóm dưới "e". Do đó, tiền tố hoạt động để nhóm các thành viên, consts, sự kiện, vv trong danh sách intellisense, làm cho nó nhanh hơn và dễ dàng hơn để tìm thấy tên bạn muốn. (Thông thường, một phương thức có thể có khoảng 20-50 giá trị (địa phương, params, thành viên, consts, sự kiện) có thể truy cập trong phạm vi của nó. Nhưng sau khi nhập tiền tố (tôi muốn sử dụng một chỉ mục ngay bây giờ, vì vậy tôi nhập 'i. .. '), tôi được trình bày chỉ với 2-5 tùy chọn tự động hoàn thành.' Nhập thêm '
Tôi là một lập trình viên lười biếng, và quy ước trên giúp tôi tiết kiệm rất nhiều công việc. Tôi có thể viết mã nhanh hơn và tôi ít mắc lỗi hơn vì tôi biết mọi biến nên được sử dụng như thế nào.
Lập luận chống lại
Vậy, khuyết điểm là gì? Đối số điển hình chống lại tiền tố là:
"Đề án tiền tố là xấu / xấu" . Tôi đồng ý rằng "m_lpsz" và ilk của nó được suy nghĩ kém và hoàn toàn vô dụng. Đó là lý do tại sao tôi khuyên bạn nên sử dụng một ký hiệu được thiết kế tốt được thiết kế để hỗ trợ các yêu cầu của bạn, thay vì sao chép một cái gì đó không phù hợp với ngữ cảnh của bạn. (Sử dụng các công cụ thích hợp cho công việc).
"Nếu tôi thay đổi cách sử dụng một cái gì đó tôi phải đổi tên nó" . Vâng, tất nhiên là bạn làm, đó là tất cả những gì về tái cấu trúc và tại sao các IDE có các công cụ tái cấu trúc để thực hiện công việc này một cách nhanh chóng và không đau đớn. Ngay cả khi không có tiền tố, việc thay đổi cách sử dụng một biến gần như chắc chắn có nghĩa là tên của nó phải được thay đổi.
"Tiền tố chỉ làm tôi bối rối" . Như mọi công cụ cho đến khi bạn học cách sử dụng nó. Khi bộ não của bạn đã quen với các kiểu đặt tên, nó sẽ tự động lọc thông tin và bạn sẽ không thực sự bận tâm rằng các tiền tố còn ở đó nữa. Nhưng bạn phải sử dụng một sơ đồ như thế này trong một hoặc hai tuần trước khi bạn thực sự trở nên "thông thạo". Và đó là khi nhiều người nhìn vào mã cũ và bắt đầu tự hỏi làm thế nào họ từng quản lý mà không có sơ đồ tiền tố tốt.
"Tôi chỉ có thể nhìn vào mã để xử lý công cụ này" . Có, nhưng bạn không cần lãng phí thời gian để tìm mã khác hoặc ghi nhớ từng chi tiết nhỏ của nó khi câu trả lời ngay tại chỗ mà mắt bạn đã tập trung vào.
(Một số) thông tin đó có thể được tìm thấy chỉ bằng cách đợi một tooltip bật lên trên biến của tôi . Đúng. Khi được hỗ trợ, đối với một số loại tiền tố, khi mã của bạn biên dịch sạch sẽ, sau khi chờ đợi, bạn có thể đọc qua một mô tả và tìm thông tin mà tiền tố sẽ được truyền tải ngay lập tức. Tôi cảm thấy rằng tiền tố là một cách tiếp cận đơn giản hơn, đáng tin cậy hơn và hiệu quả hơn.
"Nó gõ nhiều hơn" . Có thật không? Một nhân vật nữa? Hoặc là nó - với các công cụ tự động hoàn thành IDE, nó thường sẽ giảm việc nhập, bởi vì mỗi ký tự tiền tố thu hẹp đáng kể không gian tìm kiếm. Nhấn "e" và ba sự kiện trong lớp của bạn bật lên trong intellisense. Nhấn "c" và năm hằng số được liệt kê.
"Tôi có thể sử dụng this->
thay vì m
" . Vâng, vâng, bạn có thể. Nhưng đó chỉ là một tiền tố xấu xí và dài dòng hơn nhiều! Chỉ có nó mang một rủi ro lớn hơn nhiều (đặc biệt là trong các nhóm) bởi vì trình biên dịch nó là tùy chọn , và do đó việc sử dụng nó thường không nhất quán. m
mặt khác là ngắn gọn, rõ ràng, rõ ràng và không phải là tùy chọn, do đó khó khăn hơn nhiều để sử dụng nó.