Trường hợp từ khóa không nhạy cảm trong một ngôn ngữ [đóng]


31

Chúng tôi đang cố gắng viết một ngôn ngữ kịch bản tùy chỉnh. Đã có một gợi ý để làm cho ngôn ngữ tha thứ bằng cách cung cấp các từ khóa không phân biệt chữ hoa chữ thường .

Cá nhân tôi không thích ý tưởng này, nhưng có rất ít người trong nhóm của tôi nghiêng về phía nó, nói rằng nó sẽ làm cho người dùng cuối hài lòng! Ví dụ về các ngôn ngữ như FORTRAN, BASIC, SQL được đưa ra nói rằng đây là những trường hợp không nhạy cảm.

Đây có phải là một ý tưởng tốt?


4
Chà, Visual Basic thường không phân biệt chữ hoa chữ thường, điều đó có trả lời câu hỏi của bạn không? ; P
yannis


3
Lưu ý rằng rất khó để làm cho trường hợp định danh không nhạy cảm, trừ khi bạn giới hạn người dùng trong bộ ký tự ASCII.
Simon Richter

2
@MainMa: C ++ ít nhất không trực tiếp. Nó cho phép các ký tự được xác định thực hiện trong mã định danh, nhưng những gì được đảm bảo chỉ là a-zA-Z, 0-9(ngoại trừ lúc bắt đầu) và _.
Xèo

2
VB6 thực sự sử dụng một loại phương pháp lai: Bạn có thể viết từ khóa và mã định danh theo bất kỳ cách nào bạn muốn và IDE ngay lập tức chuyển đổi chúng theo cách được lưu trữ. (Bạn thậm chí có thể viết "endif" và nó sẽ được chuyển đổi thành "End If".)
Felix Dombek

Câu trả lời:


42

Hãy tự hỏi ai là người dùng cuối. Nếu nó được viết bởi một người có kinh nghiệm lập trình bằng C hoặc Javscript hoặc kinh nghiệm CNTT trong Unix, thì độ nhạy trường hợp có lẽ là điều nên làm, bởi vì đó là điều người dùng mong đợi. Nhưng đối với hầu hết người dùng cuối, ngay cả người dùng có quyền lực, điều này sẽ gây nhầm lẫn.

VB / VBA / VBScript không phân biệt chữ hoa chữ thường và đây là một quyết định được đưa ra để cho phép những người không lập trình dễ dàng hiểu được ngôn ngữ. Các công thức Excel, không chính xác là các tập lệnh nhưng gần như nhiều người dùng nhận được, không phân biệt chữ hoa chữ thường. Trong hầu hết các văn bản, việc lựa chọn trường hợp có thể làm cho văn bản trông ít nhiều chuyên nghiệp và bóng bẩy hơn, nhưng trường hợp nó tự thay đổi ý nghĩa ngữ nghĩa của các từ. Đó là lý do tại sao tôi tin rằng những người không phải là nhà phát triển sẽ bị nhầm lẫn bởi một ngôn ngữ kịch bản phân biệt chữ hoa chữ thường.

Một lần nữa, đây không phải là một lựa chọn kỹ thuật. Đó là một lựa chọn quản lý sản phẩm phải được thực hiện bởi những người hiểu rõ đối tượng mục tiêu.


Hãy suy nghĩ về hệ thống tập tin nào là trường hợp nhạy cảm trước khi xem xét các ngôn ngữ lập trình. Cả FAT / NTFS cho Windows và HFS + cho MacOS X đều không phân biệt chữ hoa chữ thường, trong khi UFS / NFS cho Unix phân biệt chữ hoa chữ thường. Người dùng có quyền lực thích khả năng phân biệt các tệp / biến bằng các khác biệt nhỏ trong khi hầu hết người dùng thích giữ mọi thứ trực quan hơn. Như Avner nói rằng sự khác biệt là một lựa chọn quản lý sản phẩm.
Michael Storesin

4
Vì nó là một ngôn ngữ kịch bản, nó là một ngôn ngữ không có trí tuệ - trường hợp không nhạy cảm là con đường để đi. Tại sao phải phân biệt chữ hoa chữ thường? Nếu câu trả lời là "giống như C và Java", đó có thực sự là một lý do tốt không?
Ben

15
@Ben Python, Ruby, bash, Lua và Perl là những ví dụ về các ngôn ngữ kịch bản rất phổ biến, phân biệt chữ hoa chữ thường. Các ngôn ngữ không phân biệt chữ hoa chữ thường bao gồm các ngôn ngữ enterprisey như Delphi và SQL (và COBOL IIRC, nếu bạn tính như vậy). Tại sao nó không có trí tuệ đối với các ngôn ngữ kịch bản và tại sao các nhà thiết kế ngôn ngữ kịch bản lớn nhất thế giới không đồng ý?

2
Nó không thể là một người không có trí tuệ do là một ngôn ngữ kịch bản - câu hỏi liên quan là: ai đang thực hiện kịch bản, và đâu là lựa chọn tốt nhất cho họ? (Tôi cũng sẽ nói rằng có lẽ bạn nên nhất quán: nếu từ khóa của bạn không phân biệt chữ hoa chữ thường, vui lòng không làm cho số nhận dạng phân biệt chữ hoa chữ thường ...)
sắp tới

@delnan Tôi nghĩ rằng đó là một lựa chọn hợp lý rằng ngôn ngữ kịch bản nhắm mục tiêu đến HĐH nơi tích hợp phân biệt chữ hoa chữ thường cũng phải phân biệt chữ hoa chữ thường.
Artemix

16

Bạn nên quyết định dựa trên trải nghiệm người dùng mà bạn muốn trình bày, chứ không phải việc thực hiện dễ hay khó.

Nếu nó sẽ giúp người dùng của bạn dễ dàng phân biệt chữ hoa chữ thường thì đó là điều bạn nên thực hiện.

Như một trường hợp trong điểm SQL là trường hợp không nhạy cảm. Điều này làm cho nó rất dễ sử dụng trong một thiết lập tương tác.

Một cách khác để xem xét điều này là sẽ có sự khác biệt giữa keywordKeywordtrong ngôn ngữ của bạn, và sự khác biệt này sẽ có ý nghĩa với người dùng? Đối với một ngôn ngữ kịch bản, tôi muốn nói câu trả lời là "không".


3
+1 cho "sự khác biệt này sẽ có ý nghĩa với người dùng". Người dùng quan trọng nhất của tất cả.
Ben

Tại sao SQL dễ sử dụng hơn trong cài đặt tương tác do không phân biệt chữ hoa chữ thường? Có phải vì bạn có thể vô tình bật Caps Lock và không để ý?
Kaz

@Kaz - Khá nhiều.
ChrisF

11

Ngôn ngữ lập trình nên phân biệt chữ hoa chữ thường, chữ hoa. Mọi người có thể điều chỉnh vấn đề này rất dễ dàng: họ chỉ cần nhớ làm việc chủ yếu ở dạng chữ thường và để ý các mã định danh hỗn hợp hoặc mũ toàn phần trong các API hiện có.

Nó từng có vẻ rõ ràng để làm cho ngôn ngữ không phân biệt chữ hoa chữ thường. Điều này là do chữ thường không có sẵn trên tất cả các hệ thống máy tính và các thiết bị I / O của chúng (bàn phím, máy in và thiết bị hiển thị). Việc triển khai ngôn ngữ lập trình phải chấp nhận các chương trình được viết bằng chữ in hoa, vì chỉ có thể hiển thị hoặc in. Và cho rằng họ phải là trường hợp nhạy cảm, bởi vì chấp nhận chữ hoa là trường hợp nhạy cảm tại các phương tiện cùng một lúc để từ chối chữ thường. Chữ thường là thứ mà các lập trình viên muốn, nhưng không phải lúc nào cũng có. Không ai thực sự muốn làm việc với các chương trình hét trong trường hợp cao; nó chỉ là một giới hạn phần cứng.

Trong một thời gian, nó thậm chí còn phổ biến trong trường hợp gấp trong các thiết bị đầu cuối. Nếu một thiết bị đầu cuối chỉ có thể hiển thị chữ hoa, nhưng bạn phải đăng nhập vào hệ thống máy tính hỗ trợ chữ hoa và chữ thường, thì thiết bị đầu cuối sẽ gấp chữ thường thành chữ hoa. Nghĩ rằng điều này đã rất lâu rồi? "Giống như Apple II, Apple II Plus không có chức năng viết thường." (http: // en Tin nhắn được viết trong tất cả các mũ là phổ biến trên bảng tin trong những ngày đó. Chức năng này vẫn được tìm thấy trong các hệ điều hành giống Unix, như nhân Linux. Ví dụ, nhập stty olcucdấu nhắc shell của bạn.Kỷ luật dòng tty Unix có thể ánh xạ chữ thường thành chữ hoa trên đầu ra và nó có thể ánh xạ chữ hoa thành chữ thường ở đầu vào. Điều này cho phép bạn làm việc trong ngôn ngữ lập trình chữ thường, trên một thiết bị đầu cuối không có chữ thường.

Không phân biệt chữ hoa chữ thường là một khái niệm lỗi thời từ thời đại máy tính đã qua, không hoạt động tốt trong thế giới hiện đại của điện toán quốc tế. Bạn có mở rộng nó sang các ngôn ngữ khác không? Thế còn tiếng Pháp: bạn có coi và è là tương đương không? Hay tiếng Nhật? Bạn có coi hiragana và katakana chỉ là trường hợp, vì vậy ァ và ふ ぁ là cùng một định danh? Hỗ trợ cho sự điên rồ như vậy sẽ làm phức tạp đáng kể máy phân tích từ vựng của bạn, sẽ phải có các bản đồ tương đương trường hợp cho toàn bộ không gian Unicode.

Lưu ý rằng toán học là trường hợp nhạy cảm. Ví dụ, sigma chữ hoa có thể biểu thị tổng, trong khi sigma chữ thường biểu thị một cái gì đó khác, như độ lệch chuẩn. Điều này có thể xảy ra trong cùng một công thức mà không tạo ra bất kỳ khó khăn. (Ngôn ngữ lập trình có làm cho và σ tương đương không?)

Chính tả tiếng Anh là nhạy cảm. Ví dụ, nhiều danh từ thích hợp tương ứng với danh từ thông thường hoặc thậm chí các phần khác của lời nói. "May" là một động từ, nhưng "May" là một tháng, hoặc tên của một người phụ nữ. Hơn nữa, nếu một từ viết tắt hoặc viết tắt được viết bằng chữ thường, nó có thể gây nhầm lẫn. SAT là viết tắt của bài kiểm tra năng khiếu kinh viện, trong khi "sat" là phân từ quá khứ của "ngồi". Người thông minh chú ý đến chi tiết và viết hoa đúng cách.

Về cơ bản, bất kỳ ngôn ngữ lập trình mới nào được tạo ra từ năm 1985 không phân biệt chữ hoa chữ thường là CHO NHỮNG AI VẪN KHÔNG NÊN TRONG E-MAILS VÀ BÀI VIẾT KHÔNG CÓ MỘT THỨ HAI.

Điều gì xảy ra nếu ngôn ngữ của bạn từng được sử dụng làm mục tiêu tạo mã để dịch mã sang ngôn ngữ khác và ngôn ngữ khác có phân biệt chữ hoa chữ thường không? Bạn sẽ phải bằng cách nào đó biến đổi tất cả các tên để nắm bắt sự khác biệt. (Vì vậy, để khẳng định rằng đây không phải là một quyết định kỹ thuật và chỉ có vấn đề về sở thích cảm xúc của đối tượng mục tiêu, là vô lý.)

Xem xét các vấn đề gây phiền nhiễu do xử lý tình huống trong Windows, khi các tệp được nhập từ hệ điều hành khác. Đó là một vấn đề kỹ thuật. Các hệ thống tệp phân biệt chữ hoa chữ thường có vấn đề với dữ liệu nước ngoài mà các tệp không phân biệt chữ hoa chữ thường không có.

Lisp thông thường đã đạt được cách tiếp cận lý tưởng: tên biểu tượng là trường hợp nhạy cảm, nhưng khi đọc mã thông báo, chúng được gấp lại thành chữ hoa. Điều này có nghĩa rằng các thẻ foo, fOO, FOOFootất cả biểu thị cùng một biểu tượng: các biểu tượng có tên được lưu giữ như những chuỗi ký tự "FOO". Hơn nữa, hành vi này chỉ là cấu hình bảng đọc mặc định. Người đọc có thể gấp chữ cái viết hoa, viết thường, đảo ngược trường hợp hoặc bảo quản nó. Hai lựa chọn cuối cùng làm phát sinh một phương ngữ phân biệt chữ hoa chữ thường. Bằng cách này, người dùng có sự linh hoạt tối đa.


1
"Thế còn tiếng Pháp: bạn có coi È và è là tương đương nhau không? Hay tiếng Nhật? Bạn có coi hiragana và katakana chỉ là trường hợp, vì vậy ァ và ぁ い là cùng một định danh?" Câu trả lời là "có", và nó chỉ điên rồ nếu bạn nghĩ rằng văn hóa của người khác là ngu ngốc.
Ben

Chà, chuẩn bị cho cái đầu nhỏ bé của bạn nổ tung, bởi vì tôi không nghĩ rằng nền văn hóa của người khác là ngu ngốc (với một số ngoại lệ nhất định, liên quan đến các sự kiện hiện tại của thế giới), nhưng đồng thời tôi nghĩ rằng nó hoàn toàn sai lầm khi đối xử với ァ イ ル vàふ ぁ là định danh tương tự trong ngôn ngữ lập trình.
Kaz

@Ben bạn có biết các nền văn hóa được đề cập? Nếu bạn biết Kaz đang nói gì thì bạn sẽ không gọi anh ta là đồ ngốc.
David Cowden

1
@DavidCowden, tôi không bao giờ gọi Kaz là dại dột. Tôi đồng ý một người nên luôn luôn sử dụng cùng một trường hợp bất cứ nơi nào sử dụng một định danh. Sự khác biệt của Kana có ý nghĩa hơn so với sự khác biệt trong trường hợp, cũng như sự khác biệt về giọng nói có ý nghĩa hơn sự khác biệt về trường hợp. Tuy nhiên, thật ngớ ngẩn khi có hai số nhận dạng chỉ khác nhau theo từng trường hợp, cũng thật ngớ ngẩn khi có hai số nhận dạng chỉ khác nhau bởi kana hoặc theo dấu. Sẽ có ý nghĩa hơn khi cấm các định danh chỉ khác nhau bởi kana hoặc giọng nói hơn là đối xử với chúng giống nhau, nhưng sẽ rất ít có ý nghĩa khi coi chúng là khác nhau.
Ben

Nếu bạn cấm các định danh chỉ khác nhau về trường hợp, dấu hoặc kana hoặc bất cứ điều gì, thì bạn sẽ ngầm thừa nhận rằng chúng giống nhau (nhưng chỉ khăng khăng nhất quán). Tốt hơn hết là đừng xua đuổi những thứ như vậy và để chúng cho người dùng trở thành vấn đề của quy ước mã hóa. Một ý tưởng tốt hơn là có một hệ thống khai báo, theo đó chương trình có thể khẳng định điều đó fooFoođược coi là từ đồng nghĩa hoặc khác biệt. Nếu không có tuyên bố như vậy, đó là một lỗi cho cả hai xảy ra. Và vì tuyên bố không mở rộng đến FOO, nên FOOvẫn bị cấm; nó phải được thêm vào
Kaz

6

Yếu tố quyết định thực sự là tần suất bạn muốn có nhiều thứ có cùng tên. Tính không nhạy cảm của trường hợp hoạt động trong SQL vì không thường xuyên bạn muốn một cột có tên SELECT. Nó sẽ gây khó chịu trong Java bởi vì mọi dòng khác trông giống như Object object = new Object(), nơi bạn muốn cùng tên để tham chiếu đến một lớp, một cá thể và một hàm tạo.

Nói cách khác, phân biệt chữ hoa chữ thường chủ yếu hữu ích cho quá tải tên và quá tải chủ yếu hữu ích trong các dự án lớn, phức tạp. Để sử dụng không thường xuyên hơn, chẳng hạn như ngôn ngữ kịch bản, trường hợp không nhạy cảm có thể làm cho việc lập trình đơn giản hơn nhiều.

Tôi đã tạo một ngôn ngữ quy tắc một lần khi các định danh không chỉ không phân biệt chữ hoa chữ thường, chúng còn không phân biệt khoảng trắng. Tôi cũng cho phép tạo các bí danh đề cập đến cùng một định danh. Ví dụ: Lập trình viênStackExchange, trao đổi ngăn xếp lập trình viên và PSE đều được giải quyết theo cùng một biểu tượng chính xác và có thể được sử dụng thay thế cho nhau.

Đối với tên miền của tôi hoạt động rất tốt, bởi vì tên miền có rất nhiều cách cực kỳ nổi tiếng để đề cập đến điều tương tự, và việc đặt tên xung đột là rất hiếm. Không ai sẽ ngạc nhiên bằng cách gõ một truy vấn bằng một tên và có kết quả sử dụng tên khác. Có hỗ trợ ngôn ngữ làm cho việc dịch giữa tên miền và ngôn ngữ lập trình trở nên rất dễ dàng. Tuy nhiên, nó cũng làm cho một số nhiệm vụ khó khăn hơn, như tìm tất cả các tham chiếu đến một biến. Rất may, trong trường hợp của tôi, những tình huống đó hiếm khi xảy ra, hoặc khá dễ dàng để xây dựng công cụ hỗ trợ để giúp đỡ, nhưng bạn phải tính đến tình huống của riêng mình.


Tôi không nghĩ muốn sử dụng lại từ khóa cho tên là vấn đề. Cả SQL, Visual Basic và C # (hai trường hợp không phân biệt chữ hoa chữ thường và phân biệt chữ hoa chữ thường) đều giải quyết điều này bằng cách cho phép một cách trích dẫn định danh: "double quotes"(hoặc [brackets]trong MS SQL) trong SQL, [brackets]trong VB.net và @atsigntrong C #.
Random832

"tần suất bạn muốn có nhiều thứ có cùng tên." Không nhạy cảm với trường hợp có nghĩa là bạn phải thêm một số chi phí để phân biệt các tên mà nếu không sẽ bị xử lý theo trường hợp (ví dụ: m là tiền tố cho 'thành viên' để phân biệt với tên thuộc tính unprefix, giả sử).
nwahmaet

Tại sao bạn lại đặt tên cho một đối tượng? Đó chỉ là vấn đề rắc rối.
Ben

@Ben, giả sử bạn đang triển khai một đối tượng container, bạn sẽ gọi tham số nào khác cho phương thức add của mình?
Winston Ewert

@WinstonEwert, tôi sẽ gọi nó o. Nó thực sự không quan trọng bạn gọi nó là gì vì nó chỉ là một tên tham số. Miễn là nó không gây khó chịu hoặc bất hợp pháp, hoặc có thể gây nhầm lẫn .
Ben

5

Giả sử ngôn ngữ tập lệnh của bạn sẽ phân biệt chữ hoa chữ thường - bạn sẽ tạo trình biên dịch hoặc trình kiểm tra cú pháp sẽ cho người dùng biết nếu anh ta mắc lỗi đánh máy bằng cách sử dụng sai trường hợp trong tên biến hoặc từ khóa? Nếu không, đó sẽ là một lập luận rất mạnh mẽ để làm cho trường hợp ngôn ngữ không nhạy cảm.


Điểm tốt, nhưng không phải là một câu trả lời.

@delnan: có lẽ không phải là một câu trả lời hay như câu trả lời từ Avner Shahar-Kashtan (người mà tôi đã cho +1), nhưng có lẽ hữu ích cho OP.
Doc Brown

3
Vâng, hữu ích như một nhận xét;)

Vì vậy, nếu điều này được điều chỉnh lại để nói rằng đó chỉ là một ý tưởng tốt nếu bạn cảnh báo người dùng về độ nhạy của trường hợp thì nó sẽ là một câu trả lời? Đối với tôi, đó là giả định.
JeffO

Không, đó là một điểm nhỏ mà hầu như không trả lời được câu hỏi như một câu trả lời. IMHO.

4

Bạn có thể khai báo các biến khi đang bay không? Nếu vậy tôi sẽ tranh luận chống lại trường hợp nhạy cảm, vì theo dõi một lỗi gây ra bởi

ATypo = 42; 

như trái ngược với

Atypo = 42; 

không cần thiết phải yêu cầu thời gian gỡ lỗi, khi có hai câu lệnh tương đương chỉ làm cho cuộc sống dễ dàng hơn.


2
IMHO nó làm cho việc đọc cũng dễ dàng hơn. Sau tất cả khi bạn bắt đầu một câu, bạn viết hoa từ đầu tiên, nhưng bạn không thay đổi nghĩa của nó. Tương tự nên cho mã!
NWS

2
@delnan - bạn muốn đọc, nó sử dụng cùng một bảng chữ cái, Tại sao thay đổi ý nghĩa khi bạn thay đổi trường hợp?
NWS

1
@delnan, theo Tòa án Tối cao Hoa Kỳ, ngôn ngữ máy tính là ngôn ngữ biểu cảm được thiết kế để cả máy tính và con người hiểu (khi phán quyết rằng mã máy tính được bảo vệ bởi sửa đổi đầu tiên). Chúng không phải là tiếng Anh, nhưng chúng là một ngôn ngữ và nói "BOB" khác với "bob" khác với "Bob" là ngu ngốc trong bất kỳ ngôn ngữ nào được con người sử dụng. Vâng, chúng ta có thể học cách đối phó với nó, nhưng đó không phải là lý do.
Ben

2
@Ben Hãy để tôi thực hiện một sự tương tự. Ký hiệu toán học, không giống như ngôn ngữ lập trình, dành riêng cho con người. Lập luận thông thường về sự vô cảm của trường hợp là một tạo tác lịch sử của máy tính cổ đại không được áp dụng ở đây. Tuy nhiên, tôi nghi ngờ bất kỳ nhà toán học sẽ tranh luận rằng aAnên được hoán đổi cho nhau. Họ trường hợp nhất quán, không có ngoại lệ. Ví dụ, trong một số ngữ cảnh, chữ in hoa được sử dụng cho các bộ trong khi chữ in thường được đặt thành viên. Một ví dụ khác xảy ra trong kỹ thuật điện, chữ thường phụ thuộc vào thời gian và chữ hoa là độc lập với thời gian ...

2
@Ben ... trong những bối cảnh này và các bối cảnh khác, tôi không thấy độ nhạy của trường hợp là một hạn chế. Tôi thấy nó như là giải phóng các biểu tượng dư thừa được sử dụng theo cách hiệu quả hơn, thông qua các quy ước truyền đạt ý nghĩa mặc dù, trong số các phương tiện khác, viết hoa. Giống như bất kỳ ký hiệu cụ thể nào về miền, điều này có vẻ xa lạ với giáo dân nhưng cho phép các chuyên gia giao tiếp tốt hơn và nhanh hơn.

2

Ví dụ về các ngôn ngữ như FORTRAN, BASIC, SQL được đưa ra nói rằng đây là những trường hợp không nhạy cảm.

Lý do tại sao FORTRAN và SQL (và COBOL) không phân biệt chữ hoa chữ thường là vì chúng ban đầu được thiết kế để sử dụng trên các máy mà bộ ký tự bình thường chỉ có chữ in hoa. Sự không nhạy cảm trong các ngôn ngữ đó (ít nhất) là một vật phẩm lịch sử hơn là một lựa chọn thiết kế ngôn ngữ.

Bây giờ bạn có thể lập luận rằng sự vô cảm của trường hợp dễ tha thứ hơn, nhưng mặt trái là độ nhạy của trường hợp đó dẫn đến mã dễ đọc hơn bởi vì nó không phải là tOe cOdEr tO uSe cOnSiStEnT cApItAlIzAtIoN.


4
Tôi phát ngán với lập luận "X là tốt, Y thi hành điều Z liên quan, do đó Y làm tốt bằng cách thực thi X" (ví dụ: kiểu mã hóa sane / quy tắc Python / việt vị). Không có lập trình viên giỏi viết hoa theo cách ảnh hưởng nghiêm trọng đến khả năng đọc, ngay cả khi được phép. Những người lạm dụng trường hợp không nhạy cảm cũng viết hoa không nhất quán trong một môi trường nhạy cảm với trường hợp (và gây ra hàng trăm hành động tàn bạo khác), họ chỉ bị buộc sử dụng cùng một cách viết hoa xấu cho mỗi lần sử dụng một tên riêng lẻ. Lập trình viên xấu có thể viết Fortran bằng bất kỳ ngôn ngữ nào. (Tuyên bố miễn trừ trách nhiệm: Tôi là một fan hâm mộ lớn về độ nhạy của vỏ máy!)

Đoán xem. Tôi phát ốm vì phải đọc mã được viết bởi những lập trình viên tồi, những người nghĩ rằng họ là những lập trình viên giỏi đến mức họ có thể phát triển các quy tắc phong cách độc đáo của riêng họ. (Disclaimer: Tôi đã học được để chương trình trong những ngày của FORTRAN và COBOL, và tôi ghét cay ghét đắng vô cảm vụ án và tội ác ngôn ngữ khác từ thời đó.)
Stephen C

Bất kỳ việc sử dụng chữ hoa nào trong trường hợp ngôn ngữ không nhạy cảm đều cấu thành lạm dụng sự vô cảm.
Kaz

@Kaz - erm ... hãy thử nói điều đó với một triệu lập trình viên SQL.
Stephen C

1

Trường hợp nhạy cảm được coi là có hại.

Cuộc sống không phân biệt chữ hoa chữ thường và cả người dùng hay lập trình viên.

Ngôn ngữ phân biệt chữ hoa chữ thường là một tai nạn lịch sử, của các hệ thống bị hạn chế khiến việc so sánh không phân biệt chữ hoa chữ thường trở nên khó khăn. Điểm chấp này không còn tồn tại, vì vậy không có lý do gì để tạo ra một hệ thống máy tính phân biệt chữ hoa chữ thường nữa.

Tôi sẽ đi xa hơn để nói rằng trường hợp nhạy cảm là xấu , vì nó đặt sự tiện lợi của máy tính trước người dùng.

(Liên quan, tôi nhớ lại vài năm trước, một số thiên tài đã từ chối thanh toán hóa đơn thẻ tín dụng của anh ta vì tên của anh ta có trong tất cả các chữ hoa một yêu cầu thanh toán hợp lệ. Thẩm phán đối xử với lý lẽ như nó xứng đáng).


Độ nhạy trường hợp không đặt sự thuận tiện của máy tính trước người dùng. Tôi đã triển khai các ngôn ngữ không phân biệt chữ hoa chữ thường và chữ hoa chữ thường và sự khác biệt duy nhất là một lệnh gọi hàm bổ sung ở một vài nơi. Ngoài ra, câu trả lời khác nói rằng trường hợp trong -sensitivity là một tạo tác lịch sử do các bộ ký tự hạn chế - mâu thuẫn với lý thuyết của bạn, đúng không?

Unicode đặt điều này trong một lĩnh vực khác.
DeadMG

3
Blog đó không đưa ra bất kỳ lời biện minh nào cho lý do tại sao nó xấu ở C, chỉ trong Python hoặc PHP - và OP không nói về các định danh phân biệt chữ hoa chữ thường, chỉ các từ khóa . Liên kết đó hoàn toàn không có gì để nói về chủ đề đó.
DeadMG

1
@Ben Biên tập viên có thể (và làm) sửa lỗi vỏ khi bạn nhập bất kể quy tắc của ngôn ngữ. Cho phép các lỗi mà vẫn xảy ra (ví dụ: vì bạn không có trình chỉnh sửa ưa thích) không giúp ích gì. Nó có nghĩa là để lại một vấn đề xung quanh, thay vì phàn nàn về nó để khắc phục nó. Hơn nữa, một khi tôi sử dụng viết hoa nhất quán, tôi có thể có nhiều số nhận dạng khác nhau trong trường hợp, nhưng biểu thị những thứ rất khác nhau và dễ dàng phân tích cho con người nhờ ngữ cảnh và viết hoa, không mơ hồ.

2
@Ben: Trong một số ngôn ngữ, có những phong tục từ vựng rất nghiêm ngặt, hoặc thậm chí là các quy tắc. Trong C và C ++, all-caps là macro và macro nên giữ nguyên all-caps để tránh nhầm lẫn. Một số ngôn ngữ có ý nghĩa khác nhau cho các ký hiệu có hoặc không có chữ hoa ban đầu (và tôi không biết chúng hoạt động tốt như thế nào trong các ngôn ngữ khác nhau không có chữ in hoa và chữ thường tương ứng). Nếu bạn có các quy tắc hoặc quy ước như vậy, bạn sẽ nhận được một cái gì đó có hiệu lực của các không gian tên khác nhau và sao chép tên định danh trong các không gian tên khác nhau thường hoạt động.
David Thornley

1

Từ kinh nghiệm cá nhân của tôi, tôi không thấy sự khác biệt lớn giữa các ngôn ngữ nhạy cảm và không nhạy cảm.

Điều quan trọng hơn là đặt tên và các quy ước cấu trúc mà một lập trình viên nên giữ trong mã của mình và không có trình biên dịch hoặc trình phân tích cú pháp nào kiểm tra nó cho anh ta. Nếu bạn tuân theo một số quy tắc, bạn sẽ dễ dàng biết được một tên thích hợp (bạn sẽ không nghĩ nếu bạn đặt tên một biến checkOut hoặc CheckOut) và mã của bạn có thể sẽ phân biệt chữ hoa chữ thường và dễ đọc hơn.

Không nên sử dụng CheckOut và checkOut và thanh toán và cHeCkOuT và KIỂM TRA theo cùng một nghĩa. Nó sẽ làm tổn thương tính dễ đọc và làm cho việc hiểu loại mã đó trở nên đau đớn hơn (nhưng có những điều tồi tệ hơn mà người ta có thể làm để phá hủy tính dễ đọc của mã).

Nếu bạn sử dụng một số loại quy tắc bạn sẽ thấy trong nháy mắt chẳng hạn:

CheckOut.getInstance () - đó là phương thức tĩnh của một lớp có tên là checkOut.calculate () - đó là phương thức của một đối tượng được giữ trong biến hoặc trường công khai gọi là _checkOut.calculate () - đó là phương thức của một đối tượng được giữ trong trường riêng - đó là trường / biến tĩnh hoặc hằng số cuối cùng

mà không kiểm tra một số tệp khác hoặc các phần của tệp. Nó làm cho việc đọc mã nhanh hơn.

Tôi thấy khá nhiều nhà phát triển sử dụng các quy tắc tương tự - trong các ngôn ngữ mà tôi thường sử dụng: Java, PHP, Action Script, JavaScript, C ++.

Trong một trường hợp hiếm hoi, người ta có thể tức giận vì sự vô cảm của trường hợp - ví dụ như khi muốn sử dụng CheckOut cho một tên lớp và checkOut cho một biến và không thể vì nó va chạm với nhau. Nhưng đó là vấn đề của một lập trình viên được sử dụng để phân biệt chữ hoa chữ thường và sử dụng nó trong các quy ước đặt tên của anh ta. Người ta có thể có các quy tắc với tiền tố tiêu chuẩn hoặc tiền tố trong một ngôn ngữ không phân biệt chữ hoa chữ thường (Tôi không lập trình trong VB nhưng tôi biết rằng nhiều lập trình viên VB có loại quy ước đặt tên này).

Nói một cách ngắn gọn: Tôi thấy tính nhạy cảm của trường hợp tốt hơn (chỉ dành cho các ngôn ngữ hướng đối tượng) bởi vì hầu hết các nhà phát triển sử dụng ngôn ngữ phân biệt chữ hoa chữ thường và hầu hết họ sử dụng các quy ước đặt tên dựa trên độ nhạy của trường hợp nên họ muốn ngôn ngữ nhạy cảm với trường hợp hơn có thể tuân theo các quy tắc của họ mà không cần một số sửa đổi. Nhưng đó là tranh luận tôn giáo - không phải là một mục tiêu (không dựa trên những nhược điểm thực sự hoặc mặt tốt của tính nhạy cảm trường hợp - bởi vì tôi không thấy bất kỳ điều gì khi nói đến một nhà phát triển giỏi, khi nói đến bAd DeVeLoPeR, người ta có thể tạo ra mã ác mộng ngay cả khi có trường hợp nhạy cảm vì vậy nó không phải là một sự khác biệt lớn).


1

Ngôn ngữ lập trình nên không phân biệt chữ hoa chữ thường.

Lý do chính khiến nhiều ngôn ngữ ngày nay rất nhạy cảm với trường hợp đơn giản là thiết kế ngôn ngữ hàng hóa: "C đã làm theo cách đó và C rất phổ biến, vì vậy nó phải đúng." Và cũng như rất nhiều thứ khác, C đã sai một cách sai lầm.

Đây thực sự là một phần của triết lý lái xe đằng sau C và UNIX: Nếu bạn có lựa chọn giữa một giải pháp tồi, dễ thực hiện và một giải pháp tốt khó thực hiện hơn, hãy chọn giải pháp tồi và đẩy gánh nặng làm việc xung quanh sự lộn xộn của bạn lên người dùng. Điều này nghe có vẻ giống như tiếng sủa, nhưng nó hoàn toàn đúng. Nó được gọi là "nguyên tắc tồi tệ hơn là tốt hơn" và nó chịu trách nhiệm trực tiếp cho thiệt hại trị giá hàng tỷ đô la trong vài thập kỷ qua do C và C ++ khiến việc viết phần mềm không ổn định và không an toàn trở nên quá dễ dàng.

Làm cho một trường hợp ngôn ngữ không nhạy cảm chắc chắn là dễ dàng hơn; bạn không cần bảng lexer, trình phân tích cú pháp và biểu tượng để thực hiện thêm công việc đảm bảo mọi thứ khớp với nhau trong trường hợp không nhạy cảm. Nhưng đó cũng là một ý tưởng tồi, vì hai lý do:

  • Đầu tiên, đặc biệt là nếu bạn đang xây dựng một ngôn ngữ kịch bản, một lỗi đánh máy đơn giản mà bạn gọi một cái gì đó là "myObject" ở một nơi và "MyObject" ở một nơi khác, trong đó bạn rõ ràng đang đề cập đến cùng một đối tượng nhưng chỉ có một chút không phù hợp với chữ viết hoa , không biến thành một lỗi thời gian chạy. (Điều này nổi tiếng là một điểm đau lớn trong các ngôn ngữ kịch bản có lỗi này, chẳng hạn như Python.)
  • Thứ hai, không có độ nhạy trường hợp có nghĩa là độ nhạy trường hợp không thể bị lạm dụng để có cùng một từ đề cập đến hai điều khác nhau trong cùng một phạm vi chỉ bằng cách thay đổi cách viết hoa. Nếu bạn đã từng phải làm việc với mã Windows trong môi trường C và gặp phải những tuyên bố xấu xí như thế HWND hwnd;, bạn sẽ biết chính xác những gì tôi đang nói. Những người viết như vậy oughtta bị lấy ra và bắn, và làm cho trường hợp ngôn ngữ không nhạy cảm ngăn chặn sự lạm dụng độ nhạy của trường hợp xâm nhập vào mã của bạn.

Vì vậy, làm cho nỗ lực thêm để làm cho nó đúng. Mã kết quả sẽ sạch hơn, dễ đọc hơn, ít lỗi hơn và giúp người dùng của bạn làm việc hiệu quả hơn và đó không phải là mục tiêu cuối cùng của bất kỳ ngôn ngữ lập trình nào?


Các ngôn ngữ lập trình nên có phạm vi từ vựng để nắm bắt loại lỗi này trước thời gian chạy (ngay cả khi chúng có tính năng động cao). Lisp thông thường là ngôn ngữ rất năng động, tuy nhiên các trình biên dịch cho chúng ta biết khi nào chúng ta đã sử dụng một biến không có ràng buộc từ vựng và không được định nghĩa toàn cầu là biến động. Bạn không thể dựa vào sự vô cảm của trường hợp này vì bạn muốn bắt tất cả các lỗi chính tả, không chỉ những lỗi liên quan đến vụ án.
Kaz

Tôi không quan tâm HWND hwnd;. Đây là một ví dụ trong đó độ nhạy trường hợp hoạt động tốt. Mặc dù vậy, quy ước tất cả các loại mũ "Hill Hill" là ngớ ngẩn. hwnd_t hwndtốt hơn nhiều Tôi nghi ngờ rằng đó là tất cả vì FILE. Ngày xửa ngày xưa Phiên bản 6 Unix có trong tệp tiêu đề thư viện I / O này : #define FILE struct _iobuf. Đó là trong tất cả các mũ vì nó là một vĩ mô. Khi nó trở thành một typedef trong ANSI C, tất cả các lỗi chính tả đều được giữ lại. Và tôi nghĩ rằng bằng cách bắt chước điều này, công ước ALL_CAPS_TYPE đã được phát minh và được mã hóa trong Phòng thí nghiệm Phong cách Ấn Độ của Bell Lab (Bản gốc!)
Kaz

Nếu bây giờ bạn tìm kiếm "Hướng dẫn phong cách đồi Ấn Độ", bạn sẽ tìm thấy hầu hết các tài liệu tham khảo đến một tài liệu năm 1990 từ Bell Labs, nơi hoàn toàn ăn năn tất cả các tên typedef: không có dấu vết của bất kỳ đề xuất nào như vậy. Nhưng phiên bản gốc đề nghị những thứ như typedef struct node *NODE. Tôi chắc chắn đó là nơi mà Microsoft phải chọn về điều này. Vì vậy, đổ lỗi cho Bell Labs HWND.
Kaz

1

Tôi không thể tin rằng ai đó đã nói "phân biệt chữ hoa chữ thường giúp đọc mã dễ dàng hơn".

Nó chắc chắn là không! Tôi đã nhìn qua vai của một đồng nghiệp về các biến được gọi là Công ty và công ty (Công ty biến công khai, công ty biến riêng tư phù hợp) và sự lựa chọn phông chữ và màu sắc của anh ta khiến cho việc phân biệt sự khác biệt giữa hai bên rất khó khăn - ngay cả khi ở cạnh nhau.

Câu lệnh đúng phải là "trường hợp hỗn hợp giúp đọc mã dễ dàng hơn". Đó là một sự thật rõ ràng hơn nhiều - ví dụ như các biến được gọi là CompanyName và CompanyAddress thay vì tên công ty. Nhưng không có ngôn ngữ nào tôi biết khiến bạn chỉ sử dụng tên biến chữ thường.

Quy ước điên rồ nhất mà tôi biết là "công khai chữ thường, chữ thường". Nó chỉ là yêu cầu rắc rối!

Tôi nhận lỗi là "tốt hơn là một cái gì đó thất bại ồn ào và càng sớm càng tốt chứ không phải lặng lẽ thất bại nhưng dường như thành công". Và không sớm hơn thời gian biên dịch.

Nếu bạn sử dụng nhầm biến chữ thường khi bạn định sử dụng chữ hoa, nó sẽ thường biên dịch nếu bạn đang tham chiếu nó trong cùng một lớp . Do đó, bạn có thể thành công trong cả thời gian biên dịch và chạy nhưng lại tinh tế làm sai, và có lẽ không phát hiện ra nó trong một thời gian dài. Khi bạn phát hiện ra rằng có điều gì đó sai

Tốt hơn nhiều để sử dụng một quy ước trong đó biến riêng tư có một hậu tố - ví dụ: biến công khai của Công ty, biến riêng của CompanyP. Không ai sẽ vô tình trộn lẫn cả hai, và họ xuất hiện cùng nhau trong intellisense.

Điều này trái ngược với một người phản đối phải ký hiệu Hungary, trong đó một biến riêng có tiền tố pCompany sẽ không xuất hiện ở một vị trí tốt trong intellisesne.

Quy ước này có tất cả các ưu điểm của quy ước chữ hoa / chữ thường đáng sợ và không có nhược điểm nào.

Việc mọi người cảm thấy cần phải thu hút sự nhạy cảm của trường hợp để phân biệt giữa các biến cho thấy cả sự thiếu trí tưởng tượng và thiếu ý thức chung, theo ý kiến ​​của tôi. Hay buồn thay, những con cừu con người thích thói quen tuân theo một quy ước bởi vì "đó là cách nó luôn luôn được thực hiện"

Làm cho những thứ bạn làm việc rõ ràng và rõ ràng khác biệt với nhau, ngay cả khi chúng có liên quan !!


1
Được rồi, vì vậy companyName == companyname. Điều đó có vẻ hợp lý, nhưng làm thế nào để bạn xử lý các địa phương? Việc biên dịch chương trình của bạn ở các nơi khác nhau trên thế giới có gây ra ngữ nghĩa khác nhau, giống như trong PHP không? Bạn sẽ hoàn toàn tập trung vào Anglo và chỉ hỗ trợ bộ có thể in ASCII trong mã định danh? Không nhạy cảm trường hợp là rất nhiều phức tạp thêm cho rất ít tăng thêm.
Phoshi

0

Bạn không nên giới thiệu trường hợp vô cảm mà không có lý do chính đáng để làm như vậy. Ví dụ, xử lý các so sánh trường hợp với Unicode có thể là một bitch. Độ nhạy trường hợp (hoặc thiếu) của các ngôn ngữ cũ là không quan trọng, vì nhu cầu của chúng rất khác nhau.

Các lập trình viên trong thời đại này mong đợi trường hợp nhạy cảm.


1
So sánh trường hợp không khó. Chỉ cần phân tách định danh của bạn. É = E '= e' = é. Hãy nhớ rằng, bạn vẫn có thể chọn trường hợp quy tắc để làm theo, và tiếng Anh là một lựa chọn hợp lý. (chắc chắn nếu từ khóa của bạn cũng là tiếng Anh)
MSalters

2
Vâng, chúng là "khó khăn" đó, trên toàn bộ không gian Unicode.
Kaz

1
"Lập trình viên trong thời đại này mong đợi sự nhạy cảm trường hợp"? Chỉ khi họ mắc Hội chứng Stockholm vì đã làm việc với gia đình C quá lâu.
Mason Wheeler

Vâng, gia đình C chỉ chiếm, như, một tỷ lệ rất lớn của ngôn ngữ và mã. Bên cạnh đó, tôi nghĩ đó là một điều tốt và nhận xét của bạn đề xuất không có lý do tại sao nó không.
DeadMG

0

Phân biệt chữ hoa chữ thường giúp mã dễ đọc hơn và lập trình dễ dàng hơn.

  • Mọi người tìm thấy sử dụng đúng của trường hợp hỗn hợp dễ đọc hơn .

  • Nó cho phép / khuyến khích CamelCase sao cho cùng một từ với các trường hợp khác nhau có thể đề cập đến những thứ liên quan: Car car; Do đó, biến có tên carđược tạo ra thuộc loại Car.

  • ALL_CAPS_WITH_UNDERSCORES biểu thị các hằng số theo quy ước trong nhiều ngôn ngữ

  • all_lower_with_underscores có thể được sử dụng cho các biến thành viên hoặc một cái gì đó khác.

  • Tất cả các công cụ lập trình hiện đại (kiểm soát nguồn, trình soạn thảo, diff, grep, v.v.) được thiết kế cho độ nhạy trường hợp. Bạn sẽ mãi mãi gặp vấn đề với các công cụ lập trình được coi là điều hiển nhiên nếu bạn tạo ra một ngôn ngữ không nhạy cảm.

  • Nếu ngôn ngữ sẽ được diễn giải, có thể có một hình phạt hiệu suất đối với trường hợp phân tích cú pháp không nhạy cảm của mã.

  • Còn những nhân vật không phải người Anh thì sao? Bây giờ bạn có quyết định không bao giờ hỗ trợ Coplic, Trung Quốc và Hindi không? Tôi thực sự khuyên bạn nên đặt ngôn ngữ của mình mặc định mọi thứ thành UTF-8 và hỗ trợ một số ngôn ngữ có ký tự không có chữ hoa hoặc chữ thường. Bạn sẽ không sử dụng các ký tự này trong từ khóa của mình, nhưng khi bạn bắt đầu tắt phân biệt chữ hoa chữ thường trong các công cụ khác nhau (để tìm những thứ trong tệp), bạn sẽ gặp một số trải nghiệm siêu thực và có thể khó chịu.

Lợi ích là gì? 3 ngôn ngữ bạn đề cập là từ những năm 1970 trở về trước. Không có ngôn ngữ hiện đại làm điều này.

Mặt khác, bất cứ điều gì thực sự khiến người dùng cuối hài lòng đều mang lại một chút ánh sáng vào thế giới. Nếu nó thực sự sẽ ảnh hưởng đến hạnh phúc của người dùng, thì bạn phải làm điều đó.

Nếu bạn muốn làm cho nó thực sự đơn giản cho người dùng cuối, bạn có thể làm tốt hơn so với độ nhạy / không nhạy cảm của trường hợp - hãy xem Scratch ! Một vài con mèo hoạt hình ít hơn và màu sắc thân thiện với doanh nghiệp hơn và bạn có ngôn ngữ thân thiện nhất mà tôi từng thấy - và bạn không phải viết bất cứ điều gì! Chỉ là một ý nghĩ.


1
Tôi nghĩ rằng bạn muốn nói "vô cảm trường hợp là một cơn ác mộng". Nhật Bản có trường hợp: hiragana và katakana, loại, trường hợp khác nhau. Cũng giống như A và a là "giống nhau" theo một cách nhất định, và cũng vậy. Katakana đôi khi được sử dụng để nhấn mạnh, chữ hoa tương tự trong các ngôn ngữ sử dụng bảng chữ cái La Mã. Không cần phải nói, sẽ thật ngu ngốc khi coi hiragana và katakana giống nhau trong các định danh ngôn ngữ lập trình.
Kaz

Cảm ơn - thật phong phú! Tôi dọn dẹp bài viết của tôi chỉ một chút.
GlenPeterson

1
Car car;là một trong những lý lẽ tốt nhất chống lại phân biệt chữ hoa chữ thường: nó xấu, và nếu ngôn ngữ của bạn không phân biệt chữ hoa chữ thường, bạn không thể lạm dụng độ nhạy của chữ hoa.
Mason Wheeler

1
Car myCar;tốt hơn nhiều?
GlenPeterson

@Mason Wheeler: Nếu chúng tôi giới hạn các cấu trúc ngôn ngữ của chúng tôi cho những người chúng tôi không thể lạm dụng, chúng tôi sẽ không thể làm được gì nhiều, phải không? Lời khuyên của tôi cho bất kỳ ai lạm dụng độ nhạy của trường hợp là "Đừng".
David Thornley
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.