Sức hấp dẫn của Hệ thống Hungary là gì? [đóng cửa]


18

Trong hướng dẫn đặt tên nào bạn làm theo? , tác giả nói:

Ngoài ra, tôi thích viết mã bằng cách sử dụng ký hiệu tiếng Đức từ Charles Simonyi.

Tôi đã chạy đến một số lập trình viên vẫn thích sử dụng tiếng Hungary, chủ yếu là hương vị Petzold / Systems Hungary. Hãy suy nghĩ dwLength = strlen(lpszName).

Tôi đã đọc Làm mã sai Nhìn sai và tôi hiểu lý do căn bản của Ứng dụng Hungary, trong đó thông tin loại tên miền được bao gồm trong các tên biến. Nhưng tôi không hiểu giá trị trong việc kết hợp kiểu trình biên dịch với tên.

Tại sao các lập trình viên vẫn kiên trì sử dụng kiểu ký hiệu này? Có phải chỉ là quán tính? Có bất kỳ lợi ích nào lớn hơn khả năng đọc giảm? Có phải mọi người chỉ học cách bỏ qua các trang trí khi đọc mã, và nếu vậy, làm thế nào để họ tiếp tục thêm giá trị?

EDIT: Rất nhiều câu trả lời đang giải thích lịch sử, hoặc tại sao nó không còn phù hợp, cả hai đều được đề cập trong bài báo tôi đã trích dẫn.

Tôi thực sự muốn nghe từ bất cứ ai ngoài kia vẫn còn sử dụng nó. tại sao bạn dùng nó? Có phải trong tiêu chuẩn của bạn? Bạn sẽ sử dụng nó nếu nó không cần thiết? Bạn sẽ sử dụng nó trong một dự án mới? Bạn thấy lợi thế là gì?


5
Ký hiệu Hungary là tất cả cơn thịnh nộ khi tôi bắt đầu trong CNTT, nhưng đó là một môi trường mã hóa hoàn toàn. Một trình soạn thảo văn bản đơn giản không có các cú pháp tô sáng cú pháp, intellisense và các tệp mã có độ dài hàng trăm dòng với tất cả các biến được khai báo ở đầu. Nó chỉ làm cho cuộc sống dễ dàng hơn trong việc tìm ra những gì bạn đang giải quyết. Tuy nhiên, với các công cụ và thực hành hiện đại, nhu cầu về nó đã đi vào lựa chọn của tôi và nó thực sự cần được đưa vào lịch sử
GrumpyMonkey

1
Tôi đã sử dụng những năm trước và không bao giờ thích nó nhiều. Tôi không bỏ lỡ nó cả.
MetalMikester

Vấn đề lớn nhất với nó là sử dụng tiền tố thay vì hậu tố - ngay cả trong các ứng dụng, "'mụn cóc" thường chứa ít thông tin ngữ nghĩa hơn phần còn lại của tên
jk.

Câu trả lời:


38

Hiện tại tôi vẫn sử dụng tiếng Hungary vì chính xác ba lý do , thận trọng tránh nó cho mọi thứ khác:

  1. Để phù hợp với một cơ sở mã hiện có khi bảo trì.
  2. Đối với điều khiển, ví dụ. "txtFirstName". Chúng ta thường cần phân biệt giữa (nói) "FirstName" giá trị và "FirstName" điều khiển. Hungary cung cấp một cách thuận tiện để làm điều này. Tất nhiên, tôi có thể gõ "FirstNameTextBox", nhưng "txtFirstName" cũng dễ hiểu và ít ký tự hơn. Hơn nữa, sử dụng tiếng Hungary có nghĩa là các điều khiển cùng loại rất dễ tìm và thường được nhóm theo tên trong IDE.
  3. Khi hai biến giữ cùng một giá trị nhưng khác nhau theo loại. Ví dụ: "strValue" cho giá trị thực sự được nhập bởi người dùng và "intValue" cho cùng một giá trị một khi nó đã được phân tích cú pháp như trong số nguyên.

Tôi chắc chắn sẽ không muốn thiết lập ý tưởng của mình như là cách thực hành tốt nhất, nhưng tôi tuân theo các quy tắc này bởi vì kinh nghiệm cho tôi biết rằng việc sử dụng mã lợi ích Hungary thường xuyên nhưng chi phí rất ít. Điều đó nói rằng, tôi liên tục xem xét thực tiễn của mình, vì vậy cũng có thể làm điều gì đó khác biệt khi ý tưởng của tôi phát triển.


Cập nhật:

Tôi vừa đọc một bài viết sâu sắc của Eric Lippert, giải thích cách Hungary có thể giúp làm cho mã sai nhìn sai. Rất đáng đọc.


Câu trả lời tuyệt vời, con đom đóm trả lời câu hỏi.
HỎI

chỉ cần chú ý chỉnh sửa sáng tạo trên iphone của tôi ... gsub ('đom đóm', 'hoàn toàn');
HỎI

5
+1 để sử dụng gần như Hungary để tạo điều kiện nhóm các điều khiển UI trong IDE. Đây là cách sử dụng duy nhất vẫn có ý nghĩa đối với các dự án mới và tôi đơn giản là không thể sống thiếu nó. Tôi thường biết một điều khiển là một hộp văn bản, nhưng không biết nó được gọi là "FirstName" hay chỉ là "Tên".
Cody Grey

2
Tôi đồng ý với câu trả lời này. Về việc sử dụng intValue và strValue, bạn cũng có thể xem nó là valueAsInt và valueAsStr, vì vậy tôi không biết nếu tôi xem ký hiệu này, thì giống như int và str là một phần của tên biến.
Michel Keijzers

2
2 Tôi thích các hậu tố đầy đủ vì các tiền tố có thể trở nên khá ngớ ngẩn (a tssbhoặc a là tsddigì? Có, chúng tồn tại). Chữ viết tắt cũng có vấn đề về tính đồng nhất, TextBoxcó thể có sự không nhất quán về việc nó tbhay txt(cá nhân tôi đã thấy một nhà phát triển 'cấp cao' sử dụng cả hai trên một cửa sổ). Đối với 3 tôi bỏ tiếng Hungary khi biến đạt đến loại dự định cuối cùng của nó (ví dụ tôi sẽ sử dụng valuestrValuetrong ví dụ của bạn).
Jonathan Dickinson

6

Tôi không phải là một fan hâm mộ lớn của việc sử dụng ký hiệu của Lynn nhưng hãy nghĩ theo cách này:

  • Chúng tôi cũng có thể nhận thấy rằng việc tìm một chuỗi tham chiếu đến TextBox trong mã của bạn sẽ nhanh hơn: bằng cách nhập "txt" vào hộp tìm kiếm của bạn.

Không thể tưởng tượng ngược lại, nơi mọi yếu tố có tên riêng của nó. Nó có thể chậm hơn để bạn tìm thấy nơi bạn muốn đi, phải không?

Điều tương tự cũng xảy ra với ddl khi chúng ta muốn tham khảo DropDownList, nó có dễ hơn hay không? :)

Mọi người sẽ không dành quá nhiều thời gian để tìm ra yếu tố này ở đâu.

Việc sử dụng tiền tố không thể sử dụng được cho các trình biên dịch ngôn ngữ hiện đại như C #, nhưng nó có thể sử dụng được (có thể đọc được) cho con người.


Đây là ví dụ tốt nhất về giá trị thực tế của nó mà tôi đã nghe. (Nhưng vẫn chưa đủ để khiến tôi chấp nhận nó :)
HỎI

1
Tiền tố không bao giờ cho trình biên dịch, luôn luôn cho mọi người. Những gì đã thay đổi không phải là trình biên dịch mà là các IDE cung cấp thông tin loại và các cách hiệu quả hơn để điều hướng mã của bạn.
Jeremy

Tôi sẽ làm tương tự với các biến và (đặc biệt) các widget - thường cung cấp cho chúng các tiền tố ngắn để biểu thị loại của chúng. Nhưng không đến mức đi "toàn diện" đối với họ.
GrandmasterB

4

Ứng dụng Hungary (thẻ để biểu thị các thuộc tính ngữ nghĩa của các đối tượng không thể được thể hiện thông qua hệ thống loại) là một cách hợp lý để xử lý một số lỗi phổ biến khi sử dụng các ngôn ngữ được gõ yếu vào đầu những năm 1980. Họ phục vụ mục đích nhỏ trong các ngôn ngữ gõ mạnh ngày nay.

Các hệ thống Hungary (các thẻ để biểu thị một cách thừa thãi một loại khai báo của một đối tượng) chưa bao giờ phục vụ bất kỳ mục đích nào ngoại trừ áp đặt hình thức thống nhất bề ngoài trên cơ sở mã. Nó được tạo ra và tuyên truyền bởi các nhà quản lý phi kỹ thuật và các lập trình viên thiếu kinh nghiệm, những người đã hiểu sai ý định của Apps Hungary và tin rằng chất lượng mã có thể được tăng cường bởi các hướng dẫn mã hóa phức tạp.

Cả hai phong cách có nguồn gốc trong Microsoft. Ngày nay, các công ước đặt tên của Microsoft nói một cách cụ thể là "Không sử dụng ký hiệu Hungary."


4

Nếu bạn đưa ra hệ thống tiền tố phù hợp, bạn có thể phân tán sự hao mòn của các phím, điều này sẽ làm giảm chi tiêu cho bàn phím thay thế.


Tôi cho rằng tôi có thể mở rộng về điều này. Tôi đã sử dụng SH tại nơi làm việc của tôi lần cuối, ồ, mười năm hoặc lâu hơn (vì đó là trong Tiêu chuẩn của chúng tôi). Nó chưa bao giờ giúp giải quyết một vấn đề.

Mặt khác, tôi đã sử dụng các biến không được đặt tên nhưng được đặt tên tốt trong 'mã nhà' của mình trong gần như bằng nhau. Tôi chưa bao giờ bỏ lỡ SH.

Ở cả hai nơi, tôi đã viết mã giao thức yêu cầu các kiểu nguyên thủy có kích thước cố định. Đây là trường hợp sử dụng có lợi nhất mà tôi có thể nghĩ cho SH. Nó không giúp tôi biết khi viết bằng SH và nó không gây trở ngại cho tôi khi viết mà không có SH.

Vì vậy, kết luận, sự khác biệt duy nhất tôi có thể thấy là sự hao mòn trên bàn phím của bạn.


1
như châm biếm ở đó :)
JohnL

4

Tôi thực sự bắt đầu sử dụng SH trong mã mới tôi đã viết trong tháng này.

Nhiệm vụ của tôi liên quan đến việc viết lại một số mã Perl trong JS để nó có thể được chuyển sang phía máy khách của ứng dụng web của chúng tôi. Trong Perl, SH thường không bắt buộc vì sigils ($ string, @array,% hash).

Trong JavaScript, tôi thấy SH là vô giá để theo dõi các loại cấu trúc dữ liệu. Ví dụ,

var oRowData = aoTableData[iRow];

Điều này lấy một đối tượng từ một mảng các đối tượng bằng cách sử dụng một chỉ số nguyên. Tuân thủ quy ước này đã giúp tôi tiết kiệm khá nhiều thời gian tìm kiếm các loại dữ liệu. Thêm vào đó, bạn có thể quá tải tên biến gọn gàng ( oRowvs. iRow).

tl; dr: SH có thể tuyệt vời khi bạn có mã phức tạp trong một ngôn ngữ được gõ yếu. Nhưng nếu IDE của bạn có thể theo dõi các loại, thích điều đó.


2

Tôi cũng tò mò để xem lý do. Chúng tôi biết lý do tại sao họ sử dụng nó trong quá khứ: thiếu hỗ trợ IDE cho thông tin loại. Nhưng bây giờ? Nói một cách đơn giản, tôi nghĩ đó là một truyền thống. Mã C ++ luôn trông như thế này, vậy tại sao lại thay đổi mọi thứ? Ngoài ra, khi bạn xây dựng dựa trên mã trước đó đã sử dụng ký hiệu Hungary, nó sẽ trông khá lạ khi bạn đột nhiên ngừng sử dụng ...


2
Mã C ++ không phải lúc nào cũng giống như thế này - hãy kiểm tra sách Bjarne Stroustrup.
JBRWilkinson

@JBRWilkinson: Charles Simonyi đã tạo ra Ký hiệu Hungary vào khoảng năm 1976 ( c2.com/cgi/wiki?HungarianNotation ). Vì vậy, ký hiệu này thực sự có trước C ++. Nhiều người, nếu không phải hầu hết các lập trình viên C ++ đã sử dụng nó kể từ ngày 1 (tức là mã hóa của họ). Tôi hiểu rằng Bjarne Stroustrup là ngoại lệ đáng chú ý, Linus Torvalds cũng vậy, nhưng nó không thay đổi sự thật.
Paweł Dyda

2
Tôi nghĩ tiếng Hungary luôn chủ yếu là một thứ của Microsoft. Tôi không thấy nó được sử dụng nhiều trong các môi trường giống như Unix và Unix.
David Thornley

2

Ký hiệu hệ thống Hungary trên thực tế là một chút khó hiểu, một sự hiểu lầm về thuật ngữ 'loại'. Các nhà phát triển hệ thống đã lấy nó theo nghĩa đen là loại trình biên dịch (từ, byte, chuỗi, ...) trái ngược với loại miền ứng dụng (chỉ mục hàng, chỉ mục cột, ...).

Nhưng tôi đoán rằng mọi nhà phát triển đều trải qua một số giai đoạn phong cách có vẻ như là một ý tưởng tuyệt vời vào thời điểm đó (và loại tiền tố có vẻ như là một ý tưởng tốt cho người mới) trước khi rơi vào cạm bẫy (thay đổi loại, tạo tiền tố mới, có ý nghĩa, Vân vân). Vì vậy, tôi đoán có một quán tính: từ các nhà phát triển không cải thiện và nhận ra lý do tại sao đó là một lựa chọn kém, từ các nhà phát triển bị mắc kẹt với các tiêu chuẩn mã hóa bắt buộc thực hành và từ những người sử dụng <windows.h>. Sẽ là quá tốn kém khi Microsoft thay đổi để loại bỏ ký hiệu tiền tố (không chính xác ở nhiều nơi: WPARAM?).


1
Ngay cả mục đích sử dụng cũng ít hơn tối ưu vì nó tạo ra một hệ thống loại riêng mà trình biên dịch không biết và do đó không thể kiểm tra loại.
Larry Coleman

@Larry: Trong khi điều đó chắc chắn là đúng, có sẵn phần mềm có thể phân tích mã nguồn và kiểm tra mã phù hợp với tiêu chuẩn. Họ có thể có thể đảm bảo rằng các tiền tố khớp với các biểu thức.
Skizz

1
Lý tưởng của tôi khi sử dụng kiểu gõ tĩnh là để tập hợp các loại trình biên dịch trở thành siêu bộ của tập hợp các loại miền. Sau đó trình biên dịch có thể kiểm tra mọi thứ, không cần tiện ích bổ sung.
Larry Coleman

0

Có một điều mọi người đang thiếu với Hungary. Ký hiệu Hungary thực sự hoạt động TUYỆT VỜI với tự động hoàn thành.

Giả sử bạn có một biến và tên là intHeightOfMonster.

Nói rằng bạn quên tên của biến

Nó có thể là heightOfMonster hoặc MonsterHeight hoặc đo lườngMonsterHeight

Bạn muốn có thể nhập một chữ cái và nhận đề xuất tự động hoàn thành cho bạn một số tên biến.

Biết rằng heightOfMonster là một int, bạn chỉ cần gõ i và voila.

Tiết kiệm thời gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.