IMHO, không bao giờ (*) có ý nghĩa thực sự khi sử dụng Hệ thống Hungary (tiền tố kiểu dữ liệu).Hoặc là bạn sử dụng một ngôn ngữ tĩnh hoặc một ngôn ngữ động, nhưng với cả trình biên dịch hoặc trình thông dịch sẽ xử lý hệ thống kiểu. Chú thích loại biến bằng phương tiện tên biến chỉ có thể gây ra sự mơ hồ (ví dụ: hãy tưởng tượng một phao gọi là intSomething
).
Điều này hoàn toàn khác đối với Ứng dụng Hungary, tức là tiền tố với một số loại hình sử dụng. Tôi cho rằng thực hành tốt là sử dụng loại ký hiệu này, ví dụ: 'usValue' cho giá trị không an toàn (tức là không được xác nhận). Điều này cho thấy một gợi ý trực quan về cách sử dụng và ngăn bạn trộn lẫn các cách sử dụng biến khác nhau có cùng kiểu nhưng không được sử dụng cùng nhau (hoặc khi chúng được sử dụng cùng nhau, bạn ít nhất có ý tưởng cho những gì đang được sử dụng và họ tạo ra một blip trên radar kiểm tra mã của bạn).
Tôi thường xuyên sử dụng một thứ như vậy trong MATLAB, ví dụ: idxInterest
để chỉ ra rằng mảng tăng gấp đôi không phải là giá trị dữ liệu thô, mà chỉ là các chỉ mục (vào một mảng khác) mà được quan tâm theo cách này hay cách khác. Tôi thường xuyên sử dụng selInterest
(sel
từ lựa chọn) để làm tương tự với các chỉ mục lôgic (Tôi đồng ý điều này có thể trông giống như Hệ thống biên giới Hungary), nhưng trong nhiều trường hợp cả hai có thể được sử dụng trong cùng một ngữ cảnh.
Tương tự như vậy cho vòng lặp: Tôi thường xuyên sử dụng các mảng đa chiều (ví dụ 4D), trong trường hợp lẻ tôi chạy một (par)for
trên một kích thước, các vòng lặp được gọi là iFoo
, jBar
, kBaz
... trong khi giới hạn trên của họ thường là nFoo
, nBar
, nBaz
, ... (hoặc numFoo
, ...). Khi thực hiện thao tác chỉ mục phức tạp hơn, bạn có thể dễ dàng thấy chỉ mục nào thuộc về thứ nguyên nào (bằng tiền tố bạn biết thứ nguyên số được sử dụng, bởi tên đầy đủ bạn biết thứ nguyên đó đại diện cho cái gì). Điều này làm cho mã dễ đọc hơn nhiều.
Bên cạnh đó, tôi thường xuyên sử dụng dFoo=1;
, dBar=2;
, ... để biểu thị số thứ nguyên cho một tập hợp các biến nhất định. Bằng cách đó, bạn có thể dễ dàng thấy rằng một cái gì đó như meanIncome = mean(income, dBar)
có nghĩa là income
trên Bar
s, trong khi meanIncome = mean(income, 2)
không chuyển tải cùng một thông tin. Vì bạn cũng phải đặt các biến số d
, nó cũng đóng vai trò như tài liệu về các biến của bạn.
Mặc dù không đúng về mặt kỹ thuật để thực hiện điều gì đó như iFoo + jBar
hoặc kBaz + dBar
, nó nêu ra một số câu hỏi khi những điều này xảy ra trong mã của bạn và chúng cho phép bạn kiểm tra phần đó thận trọng hơn. Và đó là những gì thực tế (ứng dụng) ký hiệu Hungary là tất cả về.
(*) Khoảnh khắc duy nhất có thể có ý nghĩa nào đó, là nơi khung/ngôn ngữ hoàn chỉnh của bạn yêu cầu bạn sử dụng nó. Ví dụ. API win32 sử dụng nó, vì vậy khi bạn giao tiếp trực tiếp với nó, bạn nên sử dụng các tiêu chuẩn đó để giữ sự nhầm lẫn ở mức tối thiểu. Tuy nhiên, tôi cho rằng nó có thể làm cho thậm chí càng nhiều hoặc thậm chí có ý nghĩa hơn để tìm một khuôn khổ/ngôn ngữ khác. Lưu ý rằng đây là một cái gì đó khác nhau từ sigils như được sử dụng trong Perl, một số phương ngữ BASIC vv. Những điều này cũng truyền đạt loại, nhưng trong nhiều triển khai, đây là định nghĩa kiểu để không hoặc ít mơ hồ là có thể. Đó là một câu hỏi khác cho dù đó là thực hành tốt để sử dụng loại khai báo kiểu đó (và tôi không thực sự chắc chắn về lập trường của chính mình trong điều này).
đặt các loại đối tượng khác vào một chức năng không dành cho nó, âm thanh với tôi giống như rất nhiều lỗi sâu xuống đường. –
@DirkBoer Phụ thuộc. Cách tiếp cận hướng đối tượng nói chỉ phụ thuộc vào giao diện của các đối tượng (những gì chúng cư xử như thế nào), thay vì kiểu của chúng (chúng là gì). – Kos