2012-01-09 26 views
9

Trước hết, tôi đã xem qua các bài đăng sau để tránh câu hỏi trùng lặp.Bạn có sử dụng tiền tố ký hiệu Hungary trong các ngôn ngữ thông dịch không?

https://stackoverflow.com/questions/1184717/hungarian-notation
Why shouldn't I use "Hungarian Notation"?
Are variable prefixes (“Hungarian notation”) really necessary anymore?
Do people use the Hungarian Naming Conventions in the real world?

Bây giờ, tất cả những bài viết có liên quan đến C#, C++, Java - ngôn ngữ mạnh mẽ gõ.
Tôi hiểu rằng không cần tiền tố khi loại được biết trước khi biên dịch.
Tuy nhiên, câu hỏi của tôi là:

Bạn có nên sử dụng tiền tố trong ngôn ngữ dựa trên thông dịch hay không, vì bạn không thể thấy loại đối tượng trước khi chạy?

Chỉnh sửa: Nếu ai đó có thể làm cho bài đăng này trở thành một wiki cộng đồng, vui lòng thực hiện. Tôi hầu như không quan tâm đến danh tiếng (hoặc danh tiếng tiêu cực) từ bài đăng này.

Trả lời

4

Lý do loại truyền đạt ký hiệu Hungary ("hệ thống Hungary") được cau mày trong Python là đơn giản. Nó gây hiểu nhầm. Một biến có thể được gọi là iPhones (số nguyên của điện thoại, có thể :-) nhưng bởi vì nó là Python, không có gì ở tất cả để giữ cho bạn từ đặt một cái gì đó khác hơn là một số nguyên vào nó! Và có thể bạn sẽ tìm thấy bạn cần phải làm điều đó vì một lý do nào đó. Và sau đó tất cả các mã sử dụng nó là rất gây hiểu lầm cho người nào đó cố gắng hiểu nó, trừ khi tất nhiên bạn trên toàn cầu thay đổi tên của biến.

Ký hiệu này nhằm giúp bạn theo dõi các loại biến trong ngôn ngữ được nhập tĩnh và được cho là hữu ích trong một thời gian. Nhưng bây giờ nó đã lỗi thời, ngay cả đối với các ngôn ngữ được gõ tĩnh, dựa trên sự sẵn có của các IDE làm công việc theo cách tốt hơn nhiều.

+6

đặ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. –

+0

@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

1

Câu trả lời được chấp nhận từ câu hỏi đầu tiên bạn liên kết đến áp dụng như vậy để Python:

Hungary ký hiệu không có chỗ đứng trong Java. Java API không sử dụng nó, và cũng không làm hầu hết các nhà phát triển. Mã Java sẽ không giống như Java khi sử dụng nó.

Tất cả điều này cũng đúng đối với Python.

13

Nó phụ thuộc vào các two versions bạn tham khảo:

  • Nếu bạn muốn sử dụng "thực", gốc Hungary Ứng dụng ký hiệu AKA ký hiệu Hungarian, biểu thị loại resp biến logic. mục đích của nó, cảm thấy tự do để làm như vậy.

  • OTOH, phiên bản "bị hiểu lầm" AKA Hệ thống ký hiệu Hungary, denotng chỉ là loại biến vật lý được cau mày và không nên sử dụng.

+0

Tại sao ngôn ngữ trong đó tôi không biết loại trước khi chạy, nó vẫn bị cau mày? –

+2

@Andrey - tiền tố "lpsz" sẽ chuyển đến bạn như thế nào nếu bạn không biết loại trước khi chạy? – Throwback1986

+0

@ Throwback1986, Giả sử tôi chỉ sử dụng "i" tiền tố cho ints, "b" cho booleans, vv Nó khá đơn giản, và cho phép tôi đọc mã và hiểu loại là gì. –

3

Như đã đề xuất, ký hiệu Hungary là một ý tưởng hợp lý. Vì nó đã được áp dụng? Nó nên được nuked từ quỹ đạo (Đó là cách duy nhất để chắc chắn.)

9

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).

+1

Ứng dụng FTW Hungary! – Jonas

+0

Nó cũng có thể phục vụ ở Fortran với cách gõ ngầm. –

+0

@VladimirF: theo như tôi thấy, việc đánh máy ngầm chỉ là một mặt hàng, đường cú pháp nếu bạn thích. Khi bạn sử dụng Hệ thống ký hiệu Hungary, bạn cũng có thể làm The Right Thing® và xác định đúng loại để có trình biên dịch hoạt động cho bạn và phát hiện bất kỳ lỗi nào có liên quan. IMHO Systems Hungarian Notation thậm chí làm giảm lợi thế của việc đánh máy ngầm (kể từ khi bạn đính kèm một loại không chính thức) trong khi chỉ thêm bất lợi như có thể không thống nhất. Vui lòng tranh luận, vì tôi không có kinh nghiệm với Fortran và việc đánh máy ngầm của nó. – Egon

Các vấn đề liên quan