Là hằng số ký tự đơn tốt hơn chữ?


127

Gần đây tôi đã gặp một lớp cung cấp khá nhiều mỗi ký tự đơn lẻ như một hằng số; tất cả mọi thứ từ COMMAđến BRACKET_OPEN. Tự hỏi liệu điều này là cần thiết; Tôi đã đọc một "bài báo" gợi ý rằng có thể hữu ích khi kéo các ký tự một ký tự vào các hằng số. Vì vậy, tôi hoài nghi.

Sự hấp dẫn chính của việc sử dụng các hằng số là chúng giảm thiểu bảo trì khi cần thay đổi. Nhưng khi nào chúng ta sẽ bắt đầu sử dụng một biểu tượng khác với ',' để biểu thị dấu phẩy?

Lý do duy nhất tôi thấy khi sử dụng các hằng số thay vì bằng chữ là để làm cho mã dễ đọc hơn. Nhưng là city + CharacterClass.COMMA + state(ví dụ) thực sự dễ đọc hơn city + ',' + state?

Đối với tôi, nhược điểm lớn hơn ưu điểm, chủ yếu là bạn giới thiệu một lớp khác và nhập khác. Và tôi tin vào ít mã hơn nếu có thể. Vì vậy, tôi tự hỏi những gì sự đồng thuận chung ở đây.



33
Hmm ... nó có thể hữu ích cho các địa phương khác nhau, có lẽ? Ví dụ: một số ngôn ngữ sử dụng máy chém (dấu ngoặc kép «») làm dấu ngoặc kép thay vì tiêu chuẩn tiếng Anh "(hoặc đẹp hơn ). Ngoài ra, nó chỉ giống như một tập hợp các nhân vật ma thuật. Giả sử hai trường hợp CharacterClassđược gọi englishCharsfrenchChars, có englishChars.LEFT_QUOTEthể có thể , trong khi frenchChars.LEFT_QUOTEcó thể «.
Thời gian của Justin

4
Có rất nhiều biến thể khác nhau trên dấu phẩy: en.wikipedia.org/wiki/Comma#Comma_variants - có lẽ đây không phải là một ý tưởng ngu ngốc, đặc biệt là nếu mã nguồn của bạn có thể được mã hóa thành utf-8.
Aaron Hall

21
Trong trường hợp của bạn, nó giống như gọi một "số" biến. Hằng số của bạn nên được gọi là DELIMITER. Hoặc nó phải là CITY_STATE = "{0}, {1}"
the_lotus

13
Bài viết mà bạn liên kết là rất khủng khiếp. Hằng số không bao giờ nên được ném vào một cái xô như thế. Đặt chúng vào các lớp nơi chúng có ngữ cảnh: về bản chất, lớp có hằng cung cấp bối cảnh trong đó hằng số được sử dụng. Ví dụ: Java File.separator. Lớp cho bạn biết loại phân cách. Có một lớp được đặt tên Constshoặc Constantskhông cung cấp ngữ cảnh và làm cho các hằng số khó sử dụng chính xác hơn.

Câu trả lời:


183

Tautology :

Rất rõ ràng nếu bạn đọc câu đầu tiên của câu hỏi rằng câu hỏi này không phải là về cách sử dụng phù hợp như loại bỏ các con số ma thuật , đó là về sự nhất quán ngu ngốc vô tâm khủng khiếp nhất. Đó là những gì câu trả lời này giải quyết

Ý thức thông thường cho bạn biết rằng const char UPPER_CASE_A = 'A';hoặc const char A = 'A'không thêm bất cứ điều gì ngoài bảo trì và độ phức tạp vào hệ thống của bạn. const char STATUS_CODE.ARRIVED = 'A'là một trường hợp khác nhau.

Các hằng số được cho là đại diện cho những thứ bất biến trong thời gian chạy, nhưng có thể cần phải được sửa đổi trong tương lai vào thời gian biên dịch. Khi nào const char A =chính xác bằng bất cứ điều gì khác hơn A?

Nếu bạn thấy public static final char COLON = ':'trong mã Java, hãy tìm bất cứ ai viết nó và phá vỡ bàn phím của họ. Nếu đại diện cho COLONtừng thay đổi từ :bạn sẽ có một cơn ác mộng bảo trì.

Obfuscation:

Điều gì xảy ra khi ai đó thay đổi nó COLON = '-'bởi vì nơi họ đang sử dụng nó cần -thay thế ở mọi nơi? Bạn có định viết các bài kiểm tra đơn vị về cơ bản nói assertThat(':' == COLON)cho từng consttham chiếu để đảm bảo chúng không bị thay đổi không? Chỉ để có người sửa bài kiểm tra khi họ thay đổi chúng?

Nếu ai đó thực sự lập luận rằng public static final String EMPTY_STRING = "";nó hữu ích và có lợi, bạn chỉ cần đủ điều kiện kiến ​​thức của họ và bỏ qua chúng một cách an toàn trên mọi thứ khác.

Có sẵn mọi ký tự có thể in với một phiên bản được đặt tên chỉ chứng tỏ rằng bất kỳ ai đã làm điều đó, không đủ điều kiện để viết mã không được giám sát.

Sự gắn kết:

Nó cũng làm giảm sự gắn kết một cách giả tạo, bởi vì nó di chuyển mọi thứ ra khỏi những thứ sử dụng chúng và có liên quan đến chúng.

Trong lập trình máy tính, sự gắn kết liên quan đến mức độ mà các yếu tố của một mô-đun thuộc về nhau. Do đó, sự gắn kết đo lường sức mạnh của mối quan hệ giữa các phần chức năng trong một mô-đun nhất định. Ví dụ, trong chức năng hệ thống gắn kết cao có liên quan mạnh mẽ.

Khớp nối:

Nó cũng kết hợp rất nhiều lớp không liên quan với nhau vì tất cả chúng đều kết thúc các tệp tham chiếu không thực sự liên quan đến những gì chúng làm.

Khớp nối chặt chẽ là khi một nhóm các lớp phụ thuộc nhiều vào nhau. Kịch bản này phát sinh khi một lớp đảm nhận quá nhiều trách nhiệm hoặc khi một mối quan tâm được trải rộng trên nhiều lớp thay vì có lớp riêng.

Nếu bạn đã sử dụng một tên tốt hơn như DELIMITER = ','bạn vẫn sẽ có cùng một vấn đề, bởi vì tên này là chung chung và không mang ngữ nghĩa. Việc gán lại giá trị không còn giúp phân tích tác động hơn là tìm kiếm và thay thế cho nghĩa đen ','. Bởi vì một số mã sử dụng nó là gì và cần ,một số mã khác sử dụng nhưng cần ;ngay bây giờ? Vẫn phải xem xét mọi cách sử dụng bằng tay và thay đổi chúng.

Trong thế giới hoang dã:

Gần đây tôi đã cấu trúc lại một 1,000,000+ LOCứng dụng đã 18 tuổi. Nó có những thứ như thế public static final COMMA = SPACE + "," + SPACE;. Điều đó là không có cách nào tốt hơn là chỉ nội tuyến " , "ở nơi cần thiết.

Nếu bạn muốn tranh luận về tính dễ đọc, bạn cần học cách định cấu hình IDE của mình để hiển thị các whitespaceký tự mà bạn có thể nhìn thấy chúng hoặc bất cứ điều gì, đó chỉ là một lý do cực kỳ lười biếng để đưa entropy vào hệ thống.

Nó cũng đã ,định nghĩa nhiều lần với nhiều lỗi chính tả của từ COMMAtrong nhiều gói và lớp. Với các tham chiếu đến tất cả các biến thể được trộn lẫn với nhau trong mã. Không có gì là ác mộng khi thử và sửa một cái gì đó mà không phá vỡ thứ gì đó hoàn toàn không liên quan.

Cùng với bảng chữ cái, có nhiều UPPER_CASE_A, A, UPPER_A, A_UPPERmà hầu hết thời gian là tương đương A nhưng trong một số trường hợp là không . Đối với hầu hết mọi nhân vật, nhưng không phải tất cả các nhân vật.

Và từ lịch sử chỉnh sửa, có vẻ như một trong số đó đã từng được chỉnh sửa hoặc thay đổi trong suốt 18 năm, bởi vì lý do rõ ràng bây giờ là nó sẽ phá vỡ quá nhiều thứ không thể kiểm soát được, do đó bạn có biến mới những cái tên chỉ vào cùng một thứ không bao giờ có thể thay đổi vì cùng một lý do.

Không có thực tế lành mạnh, bạn có thể lập luận rằng thực tế này không làm gì cả mà bắt đầu từ entropy tối đa.

Tôi đã tái cấu trúc tất cả mớ hỗn độn này và đưa ra tất cả các tautology và tuyển dụng đại học mới có năng suất cao hơn nhiều vì họ không phải tìm kiếm nhiều cấp độ của những điều mà các consttài liệu tham khảo này thực sự chỉ ra, vì họ không đáng tin vào những gì họ được đặt tên vs những gì họ chứa.


112
Có lẽ bạn nên thêm một ví dụ: const char DELIMITER = ':'sẽ thực sự hữu ích.
Bergi

115
Tôi sẽ đưa ra một số lập luận có EMPTY_STRINGlợi. (1) Tôi có thể dễ dàng tìm thấy tất cả các cách sử dụng EMPTY_STRINGtrong một tệp hơn là tôi có thể tìm thấy tất cả các cách sử dụng "". (2) khi tôi thấy EMPTY_STRINGtôi biết chắc chắn rằng nhà phát triển dự định chuỗi đó trống và đó không phải là chỉnh sửa sai hoặc giữ chỗ cho chuỗi được cung cấp sau. Bây giờ, bạn tuyên bố rằng bằng cách tôi đưa ra lập luận này rằng bạn có thể đủ điều kiện hiểu biết của tôi và an toàn bỏ qua tôi mãi mãi. Vì vậy, làm thế nào để bạn đủ điều kiện kiến ​​thức của tôi? Và bạn có kế hoạch bỏ qua lời khuyên của tôi mãi mãi? Tôi cũng không có vấn đề gì.
Eric Lippert

39
@immibis: Chúng ta có thể ngừng suy nghĩ về những điều này là hữu ích trong bối cảnh quản lý thay đổi. Chúng là hằng số. Họ không thay đổi. Hãy nghĩ về chúng như là hữu ích trong bối cảnh con người tìm kiếm và hiểu được ngữ nghĩa của mã . Biết cái gì đó là một giá trị cặp-delimiter khóa được nhiều ích hơn biết nó là một dấu hai chấm; đó là một thực tế về miền ngữ nghĩa của mối quan tâm của chương trình, không phải cú pháp của nó .
Eric Lippert

15
@EricLippert: Tôi hơi thấy quan điểm của những người khác ở đây, người chỉ ra rằng đảm bảo duy nhất mà constcung cấp là nó sẽ không thay đổi khi chạy (sau khi biên dịch), mặc dù tôi đồng ý với bạn rằng ý nghĩa ngữ nghĩa của constnó là quan trọng hơn nhiều so với việc sử dụng nó như một công cụ quản lý thay đổi. Điều đó nói rằng, tôi chắc chắn có thể tưởng tượng một const EARLIEST_OS_SUPPORTEDthứ không chỉ phù hợp về mặt ngữ nghĩa, mà còn sẽ thay đổi theo thời gian khi chương trình phát triển và hành trình cũ bị loại bỏ.
Robert Harvey

16
@DanielJour: Vì vậy, đây là một đối số thứ ba cho EMPTY_STRING; rằng một IDE được thiết kế tốt sẽ hiển thị các công cụ cho phép tôi đối xử với thực thể này một cách tượng trưng, ​​thay vì theo cú pháp. Tổng quát hóa điều này thành một đối số thứ tư: rằng thư viện các công cụ phân tích mã nằm dưới IDE có thể cho phép phân tích chương trình nâng cao về tính chính xác của mã ở cấp độ biểu tượng . Một nhà phát triển muốn tận dụng các công cụ tiên tiến hơn so với những công cụ được viết theo nghĩa đen 40 năm trước chỉ cần thực hiện những thay đổi nhỏ trong thói quen của họ để gặt hái những phần thưởng từ công cụ nâng cao.
Eric Lippert

145

Sự hấp dẫn chính của việc sử dụng các hằng số là chúng giảm thiểu bảo trì khi cần thay đổi.

TUYỆT ĐỐI KHÔNG. Đây hoàn toàn không phải là lý do để sử dụng hằng số vì hằng số không thay đổi theo định nghĩa . Nếu một hằng số thay đổi thì đó không phải là hằng số, phải không?

Sự hấp dẫn của việc sử dụng các hằng số không liên quan gì đến việc quản lý thay đổi và mọi thứ phải làm với việc làm cho các chương trình có thể được viết, hiểu và duy trì bởi mọi người . Nếu tôi muốn biết mọi nơi trong chương trình của mình, nơi dấu hai chấm được sử dụng làm dấu tách URL, thì tôi có thể biết điều đó rất dễ dàng nếu tôi có kỷ luật để xác định một URLSpayator không đổi và hoàn toàn không thể biết điều đó nếu tôi phải grep cho :và nhận từng vị trí trong mã :được sử dụng để chỉ ra một lớp cơ sở, hoặc một ?:toán tử, hoặc bất cứ thứ gì.

Tôi hoàn toàn không đồng ý với các câu trả lời khác nói rằng đây là một sự lãng phí thời gian vô nghĩa. Các hằng số được đặt tên thêm ý nghĩa cho một chương trình và những ngữ nghĩa đó có thể được cả con người và máy móc sử dụng để hiểu một chương trình sâu sắc hơn và duy trì nó hiệu quả hơn.

Bí quyết ở đây không phải là tránh các hằng số, mà là đặt tên cho chúng với các thuộc tính ngữ nghĩa hơn là các thuộc tính cú pháp của chúng . Hằng số được sử dụng để làm gì? Đừng gọi nó Commatrừ khi lĩnh vực kinh doanh của chương trình của bạn là kiểu chữ, phân tích tiếng Anh hoặc tương tự. Gọi nó ListSeparatorhoặc một số điều như vậy, để làm cho ngữ nghĩa của điều rõ ràng.


42
Mặc dù tôi đồng ý với tinh thần của những gì bạn đang nói ở đây, câu thứ hai / thứ ba của bạn không thực sự chính xác. Một hằng số có thể thay đổi giữa các phiên bản của một tập tin. Trên thực tế, hầu hết các chương trình tôi viết đều có một hằng số được đặt tên giống như MY_VER, chứa số phiên bản hiện tại của chương trình, sau đó có thể được sử dụng trong suốt phần còn lại của chương trình thay vì một chuỗi ma thuật như "5.03.427.0038". Lợi ích bổ sung là như bạn nói rằng nó được cung cấp thông tin ngữ nghĩa.
Monty Harder

50
Công bằng mà nói, điểm bất biến là nó không thay đổi trong thời gian chạy sau khi được khởi tạo, không phải là nó không thay đổi giữa các phần tổng hợp. Từ quan điểm của một nhà biên dịch, vấn đề là trình biên dịch có thể đưa ra các giả định rằng chương trình không thể sửa đổi nó; liệu lập trình viên có được phép sửa đổi nó hay không khi họ biên dịch lại không thay đổi tính không đổi của nó. Cũng có thể có trường hợp phần mềm lấy giá trị chỉ đọc từ phần cứng, có thể bằng cách hủy bỏ một const volatile T*con trỏ đến một địa chỉ được xác định trước; trong khi chương trình không thể thay đổi nó, phần cứng có thể.
Thời gian của Justin

6
@MontyHarder: Điểm tốt. Ý kiến ​​của tôi được thông báo bởi thực tế là tôi thường sử dụng các ngôn ngữ phân biệt giữa các hằng số - phải không thay đổi mãi mãi - và các biến có thể được gán một lần - có thể thay đổi từ phiên bản sang phiên bản, chạy để chạy hoặc bất cứ điều gì. Một hằng số và một biến là những thứ khác nhau; một cái vẫn giữ nguyên và một cái thay đổi theo thời gian.
Eric Lippert

7
@SteveCox: Tôi đồng ý; cách C / C ++ mô tả "const" là lạ và được sử dụng hạn chế. Thuộc tính tôi muốn của hằng số là giá trị của chúng không thay đổi, không phải tôi bị hạn chế thay đổi chúng trong một số chức năng mà không phải ở các chức năng khác.
Eric Lippert

15
"Đây hoàn toàn không phải là lý do để sử dụng hằng số bởi vì hằng số không thay đổi theo định nghĩa. Nếu một hằng số thay đổi thì đó không phải là hằng số, phải không?" Thay đổi hằng số tại thời gian biên dịch (không phải thời gian chạy rõ ràng) là hoàn toàn bình thường. Đó là lý do tại sao bạn làm cho họ một "điều" được dán nhãn rõ ràng ở nơi đầu tiên. Tất nhiên, các hằng số của OP là rác, nhưng hãy nghĩ về một cái gì đó giống const VERSION='3.1.2'hoặc const KEYSIZE=1024hoặc bất cứ điều gì.
AnoE 7/07/2016

61

Không, đó là ngu ngốc.

Điều không nhất thiết là ngu ngốc là kéo những thứ như thế vào nhãn được đặt tên vì lý do nội địa hóa. Ví dụ: hàng nghìn dấu phân cách dấu phẩy ở Mỹ (1.000.000), nhưng không phải là dấu phẩy ở các địa phương khác. Kéo nó vào một nhãn có tên (với một tên không dấu phẩy thích hợp) cho phép lập trình viên bỏ qua / trừu tượng những chi tiết đó.

Nhưng làm cho một hằng số bởi vì "chuỗi ma thuật là xấu" chỉ là nuôi cấy hàng hóa.


8
Bản địa hóa thường phức tạp hơn chỉ là hằng chuỗi. Ví dụ: một số ngôn ngữ muốn phân cách danh sách giữa tất cả các mục danh sách, trong khi các ngôn ngữ khác loại trừ dấu phân cách trước mục cuối cùng. Vì vậy, thông thường người ta không cần các hằng số cục bộ, mà là các quy tắc cục bộ .
Vlad

19
Trên thực tế, hàng ngàn dấu phân cách không nhất thiết là một nghìn dấu phân cách ở các địa phương khác (Trung Quốc / Nhật Bản). Nó thậm chí không được đặt sau một số chữ số không đổi (Ấn Độ). Ồ, và có thể có các dấu phân cách khác nhau tùy thuộc vào việc đó là dấu phân cách 1000 hay dấu phân cách 1000000 (Mexico). Nhưng đó không phải là vấn đề hơn là không sử dụng các chữ số ASCII 0-9 ở một số địa phương (Farsi). ux.stackexchange.com/questions/23667/ khăn
Peter

1
@Vlad Bản địa hóa phức tạp hơn thế nhiều, tuy nhiên, dấu phân cách hàng nghìn là một ví dụ nổi tiếng mà mọi người nhận ra.

Nó phụ thuộc vào chiến lược bản địa hóa ... bạn có thay đổi tất cả các hằng số trong chương trình của mình để dịch nó không? Hoặc bạn nên đọc các giá trị từ một tệp (hoặc lưu trữ dữ liệu khác), biến chúng thành các biến thời gian chạy hiệu quả?
Paŭlo Ebermann

Điều đó sẽ không hữu ích chút nào như một hằng số. Chương trình sẽ cần được biên dịch lại cho các địa phương, đó là thực tế khủng khiếp. Chúng phải là các biến được tải từ các tệp định nghĩa và tra cứu khi cần thiết. Không phải là tôi không đồng ý với quan điểm này (tôi đã bỏ phiếu trả lời), nhưng tôi sẽ có một vị trí khó hơn về vấn đề này.

29

Có một vài ký tự có thể mơ hồ hoặc được sử dụng cho một số mục đích khác nhau. Ví dụ: chúng tôi sử dụng '-'như dấu gạch nối, dấu trừ hoặc thậm chí dấu gạch ngang. Bạn có thể đặt tên riêng là:

static const wchar_t HYPHEN = '-';
static const wchar_t MINUS = '-';
static const wchar_t EM_DASH = '-';

Sau đó, bạn có thể chọn sửa đổi mã của mình để định hướng bằng cách xác định lại chúng là:

static const wchar_t HYPHEN = '-';
static const wchar_t MINUS = '\u2122';
static const wchar_t EM_DASH = '\u2014';

Đó có thể là một lý do tại sao bạn xem xét việc xác định các hằng số cho các ký tự đơn nhất định . Tuy nhiên , số lượng nhân vật mơ hồ theo cách này là ít. Nhiều nhất, có vẻ như bạn chỉ làm điều đó cho những người đó. Tôi cũng tranh luận rằng bạn có thể đợi cho đến khi bạn thực sự có nhu cầu phân biệt các ký tự mơ hồ trước khi bạn xác định mã theo cách này.

Vì các quy ước đánh máy có thể thay đổi theo ngôn ngữ và khu vực, có lẽ bạn nên tải các dấu câu mơ hồ như vậy từ bảng dịch.


Đối với tôi đây là lý do duy nhất hợp lệ mà người ta có thể tạo các hằng ký tự
FP

2
Sử dụng -như một dấu gạch ngang khá dễ gây hiểu lầm ... nó là viết tắt của hầu hết các phông chữ. (Nó thậm chí còn ngắn hơn một dấu gạch ngang.)
Paŭlo Ebermann

OK, không phải là ví dụ tốt nhất. Tôi bắt đầu với strings thay vì wchar_ts và sử dụng quy ước bản thảo tiêu chuẩn "--"cho dấu gạch ngang. Nhưng ví dụ ban đầu là sử dụng các ký tự đơn, vì vậy tôi chuyển sang giữ đúng với câu hỏi. Có những người gõ -dấu gạch ngang, đặc biệt là khi làm việc trong một phông chữ cố định.
Adrian McCarthy

1
@ PaŭloEbermann Không, theo truyền thống, một dấu gạch ngang là chiều rộng của ký tự 'm' của kiểu chữ và dấu gạch ngang là chiều rộng của ký tự 'n'.
Dizzley

@Dizzley có, và chiều rộng gạch nối <n-width <m-width.
Paŭlo Ebermann

22

Một hằng phải thêm ý nghĩa.

Xác định COMMA là dấu phẩy không thêm ý nghĩa, bởi vì chúng ta biết rằng dấu phẩy là dấu phẩy. Thay vào đó, chúng tôi phá hủy ý nghĩa, bởi vì bây giờ COMMA thực sự có thể không còn là dấu phẩy nữa.

Nếu bạn sử dụng dấu phẩy cho mục đích và muốn sử dụng hằng số được đặt tên, hãy đặt tên theo mục đích đó. Thí dụ:

  • city + CharacterClass.COMMA + state = xấu
  • city + CITY_STATE_DELIMITER + state = tốt

Sử dụng các chức năng để định dạng

Cá nhân tôi thích FormatCityState(city, state)và không quan tâm đến việc cơ thể của chức năng đó trông như thế nào miễn là nó ngắn và vượt qua các trường hợp thử nghiệm.


1
À, nhưng dấu phẩy không phải lúc nào cũng là dấu phẩy. Tôi có thể định nghĩa COMMA = '\ u0559' hoặc '\ u060C', v.v. (xem Unicode) hoặc thậm chí biến nó thành một biến sau đó và đọc nó từ tệp cấu hình. Theo cách đó, nó vẫn sẽ có cùng một ý nghĩa , nhưng chỉ là một giá trị khác. Thế còn cái đó.
Ông Lister

2
@MrLister: YAGNI. Nếu bạn có nhu cầu đó: tuyệt vời! Bạn có một giải pháp tốt. Nhưng nếu bạn không - không làm lộn xộn mã của bạn bởi vì có thể một ngày nào đó bạn có thể. Ngoài ra, theo kinh nghiệm của tôi nếu bạn cố gắng giới thiệu các khái niệm trừu tượng không có chức năng trong cơ sở mã của mình, mọi người sẽ không tuyệt vời khi nhất quán. Vì vậy, ngay cả khi bạn đã xác định COMMA với mục đích sử dụng một số loại tiền mã hóa khác, trong một chương trình có đủ kích cỡ và độ tuổi sao cho sự lựa chọn đó, bạn có thể thấy rằng hằng số không được sử dụng ở mọi nơi cần có được (và ngược lại, có thể đã được sử dụng không phù hợp quá).
Eamon Nerbonne

17

Ý tưởng rằng COMMA không đổi tốt hơn ','hoặc ","khá dễ để gỡ lỗi. Chắc chắn có những trường hợp có ý nghĩa, ví dụ như việc final String QUOTE = "\"";tiết kiệm rất nhiều về khả năng đọc mà không cần tất cả các dấu gạch chéo, nhưng việc chặn các ký tự điều khiển ngôn ngữ như \ '"tôi không thấy chúng rất hữu ích.

Sử dụng final String COMMA = ","không chỉ là hình thức xấu, nó nguy hiểm! Khi ai đó muốn thay đổi tách từ ","để ";"họ có thể đi thay đổi hằng số nộp đến COMMA = ";"bởi vì nó nhanh hơn cho họ làm như vậy và nó chỉ hoạt động. Ngoại trừ, bạn biết đấy, tất cả những thứ khác đã sử dụng COMMA bây giờ cũng là dấu chấm phẩy, bao gồm cả những thứ được gửi cho người tiêu dùng bên ngoài. Vì vậy, nó vượt qua tất cả các bài kiểm tra của bạn (bởi vì tất cả các mã sắp xếp theo thứ tự và không sắp xếp cũng sử dụng COMMA) nhưng các kiểm tra bên ngoài sẽ thất bại.

Những gì hữu ích là cung cấp cho họ tên hữu ích. Và vâng, đôi khi nhiều hằng số sẽ có cùng nội dung nhưng tên khác nhau. Ví dụ final String LIST_SEPARATOR = ",".

Vì vậy, câu hỏi của bạn là "các hằng số char duy nhất tốt hơn chữ" và câu trả lời là không có lý, không. Nhưng thậm chí tốt hơn cả hai là một tên biến phạm vi hẹp trong đó nói rõ mục đích của nó là gì. Chắc chắn, bạn sẽ dành thêm một vài byte cho các tài liệu tham khảo bổ sung đó (giả sử rằng chúng không được biên dịch cho bạn, điều mà chúng có thể sẽ làm) nhưng trong bảo trì dài hạn, đó là nơi mà phần lớn chi phí của một ứng dụng, chúng có giá trị thời gian để thực hiện.


Làm thế nào về việc xác định một cách có điều kiện DISP_APOSTROPHE là một ký tự trích dẫn bên phải ASCII 0x27 hoặc một ký tự bên phải Unicode (là biểu hiện phù hợp hơn về mặt chính tả của dấu nháy đơn), tùy thuộc vào nền tảng đích?
supercat

3
trên thực tế, QUOTEví dụ chứng minh rằng đó cũng là một ý tưởng tồi vì bạn đang gán nó cho những gì thường được gọi là / thường được gọi là DOUBLE QUOTEQUOTEngụ ý SINGLE_QUOTEđược gọi chính xác hơn là APOSTROPHE.

3
@JarrodRoberson Tôi không cảm thấy trích dẫn ngụ ý trích dẫn đơn lẻ, nhưng đó là một lý do tốt để loại bỏ sự mơ hồ nơi bạn có thể!
corsiKa

2
Tôi không thích QUOTEví dụ này vì một lý do bổ sung - nó làm cho việc đọc các chuỗi được xây dựng với nó thậm chí còn khó hơn "Hello, my name is " + QUOTE + "My Name" + QUOTEđây là một ví dụ tầm thường và nó vẫn trông tệ. Ồ, chắc chắn, thay vì nối, bạn có thể sử dụng mã thông báo thay thế, cũng "Hello, my name is %sMy Name%s".format(QUOTE, QUOTE)có thể tệ hơn. Nhưng, này, chúng ta hãy thử lập chỉ mục mã thông báo "Hello, my name is {0}My Name{0}".format(QUOTE), không tốt hơn nhiều. Bất kỳ chuỗi không tầm thường nào được tạo ra với dấu ngoặc kép trong đó sẽ còn tồi tệ hơn.
VLAZ

2
@corsiKa - Tôi sẽ sống với các trích dẫn thực tế đã thoát. Nếu tôi lỡ thoát một cái, IDE tôi sử dụng sẽ ngay lập tức phàn nàn. Mã rất có thể sẽ không được biên dịch. Nó khá dễ dàng để nhận ra. Thật dễ dàng để phạm sai lầm khi thực hiện "My name is" + QUOTE + "My Name" + QUOTETôi thực sự đã mắc lỗi tương tự ba lần viết nhận xét trên. Bạn có thể nhận ra nó? Nếu nó sẽ đưa bạn một chút, đó là không gian thiếu sau khi . Bạn có định dạng chuỗi không? Trong trường hợp đó, một chuỗi có nhiều mã thông báo để thay thế sẽ còn tồi tệ hơn khi xử lý. Làm thế nào để tôi sử dụng nó để nó dễ đọc hơn?
VLAZ

3

Tôi đã thực hiện một số công việc viết lexers và trình phân tích cú pháp và sử dụng hằng số nguyên để biểu diễn các thiết bị đầu cuối. Các thiết bị đầu cuối một ký tự tình cờ có mã ASCII là giá trị số của chúng vì đơn giản, nhưng mã có thể là một thứ hoàn toàn khác. Vì vậy, tôi có một T_COMMA được gán mã ASCII cho ',' làm giá trị không đổi. Tuy nhiên, cũng có các hằng số cho các số nguyên được gán các số nguyên trên tập ASCII. Từ việc xem xét các trình tạo trình phân tích cú pháp như yacc hoặc bison hoặc các trình phân tích cú pháp được viết bằng các công cụ này, tôi có ấn tượng về cơ bản là mọi người đã làm như thế nào.

Vì vậy, trong khi, giống như mọi người khác, tôi nghĩ rằng việc xác định các hằng số cho mục đích rõ ràng là sử dụng các hằng số thay vì các chữ trong mã của bạn, tôi nghĩ rằng có các trường hợp cạnh (trình phân tích cú pháp, nói) mà bạn có thể gặp phải mã bị đánh đố hằng số như bạn mô tả. Lưu ý rằng trong trường hợp trình phân tích cú pháp, các hằng số không chỉ ở đó để biểu thị các ký tự; họ đại diện cho các đơn vị mà chỉ có thể xảy ra là literals nhân vật.

Tôi có thể nghĩ về một vài trường hợp riêng biệt hơn trong đó có thể có ý nghĩa khi sử dụng hằng số thay vì nghĩa đen tương ứng. Ví dụ: bạn có thể định nghĩa NEWLINE là chữ '\ n' trên hộp unix, nhưng '\ r \ n' hoặc '\ n \ r' nếu bạn ở trên cửa sổ hoặc hộp mac. Điều tương tự cũng xảy ra đối với việc phân tích các tệp đại diện cho dữ liệu dạng bảng; bạn có thể xác định các hằng số FIELDSEPARATOR và RECORDSEPARATOR. Trong những trường hợp này, bạn thực sự xác định một hằng số để biểu thị một ký tự phục vụ một chức năng nhất định. Tuy nhiên, nếu bạn là một lập trình viên mới làm quen, có thể bạn sẽ đặt tên COMMA là phân tách trường không đổi, không nhận ra rằng bạn nên gọi nó là FIELDSEPARATOR, và khi bạn nhận ra, mã sẽ được sản xuất và bạn sẽ tiếp tục dự án,

Cuối cùng, thực tiễn bạn mô tả có thể có ý nghĩa trong một số trường hợp bạn viết mã để xử lý dữ liệu được mã hóa trong một mã hóa ký tự cụ thể, giả sử iso-8859-1, nhưng hy vọng mã hóa sẽ thay đổi sau này. Tất nhiên trong trường hợp như vậy, sẽ hợp lý hơn khi sử dụng thư viện địa phương hóa hoặc mã hóa và giải mã để xử lý nó, nhưng nếu vì lý do nào đó bạn không thể sử dụng một thư viện như vậy để xử lý các vấn đề mã hóa cho bạn, chỉ sử dụng các hằng số phải xác định lại trong một tệp duy nhất thay vì các chữ được mã hóa cứng nằm rải rác trên mã nguồn của bạn có thể là một cách để đi.

Đối với bài viết mà bạn liên kết đến: Tôi không nghĩ nó cố gắng tạo ra một trường hợp để thay thế các ký tự bằng các hằng số. Tôi nghĩ rằng nó đang cố gắng minh họa một phương pháp sử dụng các giao diện để kéo các hằng số vào các phần khác của cơ sở mã của bạn. Các hằng số ví dụ được sử dụng để minh họa điều này được chọn rất tệ, nhưng tôi không nghĩ chúng quan trọng theo bất kỳ cách nào.


2
Tôi nghĩ rằng nó đang cố gắng minh họa một phương pháp sử dụng các giao diện để kéo các hằng số vào các phần khác của cơ sở mã của bạn. đó là một mô hình chống thậm chí còn tồi tệ hơn và cũng được liên kết chặt chẽ và độ gắn kết thấp, không có lý do chính đáng để làm điều đó.

3

Ngoài tất cả các câu trả lời hay ở đây, tôi muốn thêm vào như một món ăn để suy nghĩ, rằng lập trình tốt là về việc cung cấp các tóm tắt phù hợp có thể được xây dựng bởi chính bạn và có thể những người khác, mà không phải lặp đi lặp lại cùng một mã.

Trừu tượng tốt làm cho mã dễ sử dụng một mặt và mặt khác dễ bảo trì.

Tôi hoàn toàn đồng ý rằng DELIMITER=':'bản thân nó là một sự trừu tượng kém, và chỉ tốt hơn COLON=':'(vì cái sau hoàn toàn nghèo nàn).

Một sự trừu tượng hóa tốt liên quan đến chuỗi và dấu phân tách sẽ bao gồm một cách để đóng gói một hoặc nhiều mục nội dung riêng lẻ vào chuỗi và giải nén chúng khỏi chuỗi được đóng gói, trước tiên và trước hết, trước khi cho bạn biết dấu phân cách là gì. Một sự trừu tượng như vậy sẽ được gói lại như một khái niệm, trong hầu hết các ngôn ngữ như một lớp; ví dụ, để việc sử dụng nó thực sự là tài liệu tự động, trong đó bạn có thể tìm kiếm tất cả các nơi sử dụng lớp này và tự tin về ý định của lập trình viên về định dạng của chuỗi được đóng gói trong mỗi trường hợp sử dụng một số trừu tượng.

Khi một sự trừu tượng như vậy được cung cấp, nó sẽ dễ sử dụng mà không cần phải tham khảo giá trị của DELIMITERhoặc COLONlà gì, và, việc thay đổi các chi tiết thực hiện thường sẽ bị giới hạn trong việc thực hiện. Vì vậy, trong ngắn hạn, các hằng số này thực sự nên là chi tiết thực hiện ẩn trong một sự trừu tượng hóa thích hợp.

Sự hấp dẫn chính của việc sử dụng các hằng số là chúng giảm thiểu bảo trì khi cần thay đổi.

Trừu tượng tốt, thường là các tác phẩm của một số khả năng liên quan, tốt hơn trong việc giảm thiểu bảo trì. Đầu tiên, họ tách biệt rõ ràng nhà cung cấp với người tiêu dùng. Thứ hai, họ ẩn các chi tiết thực hiện và thay vào đó cung cấp chức năng hữu ích trực tiếp. Thứ ba, họ tài liệu ở mức cao khi và nơi họ đang được sử dụng.


2

Một lần tôi đã thấy các hằng số như vậy được sử dụng hiệu quả là khớp với API hoặc tài liệu hiện có. Tôi đã thấy các ký hiệu như COMMAđược sử dụng vì một phần mềm cụ thể được kết nối trực tiếp với trình phân tích cú pháp được sử dụng COMMAlàm thẻ trong cây cú pháp trừu tượng. Tôi cũng đã thấy nó được sử dụng để phù hợp với một đặc điểm kỹ thuật chính thức. trong thông số kỹ thuật chính thức, đôi khi bạn sẽ thấy các biểu tượng như thế COMMAhơn là ','vì chúng muốn rõ ràng nhất có thể.

Trong cả hai trường hợp, việc sử dụng một biểu tượng có tên như COMMAgiúp cung cấp sự gắn kết cho một sản phẩm rời rạc khác. Giá trị đó thường có thể vượt xa chi phí của các ký hiệu quá dài.


2

Quan sát rằng bạn đang cố gắng lập một danh sách.

Vì vậy, tái cấu trúc nó như sau: String makeList(String[] items)

Nói cách khác, yếu tố logic thay vì dữ liệu .
Các ngôn ngữ có thể khác nhau về cách chúng thể hiện các danh sách, nhưng dấu phẩy luôn là dấu phẩy (đó là một tautology). Vì vậy, nếu ngôn ngữ thay đổi, việc thay đổi ký tự dấu phẩy sẽ không giúp bạn - nhưng điều này sẽ.


0

Nếu đây là một lớp được viết như một phần của ứng dụng bởi nhà phát triển đồng nghiệp của bạn, thì đây gần như chắc chắn là một ý tưởng tồi. Như những người khác đã chỉ ra, sẽ rất hợp lý khi xác định các hằng số như SEPARATOR = ','nơi bạn có thể thay đổi giá trị và hằng số vẫn có ý nghĩa nhưng ít hơn nhiều so với các hằng số có tên chỉ mô tả giá trị của chúng.

Tuy nhiên, có ít nhất hai trường hợp có ý nghĩa khi khai báo các hằng có tên mô tả chính xác nội dung của chúng và nơi bạn không thể thay đổi giá trị mà không thay đổi tên hằng số một cách thích hợp:

  • Hằng số toán học hoặc vật lý, vd PI = 3.14159. Ở đây, vai trò của hằng số là đóng vai trò ghi nhớ vì tên biểu tượng PIngắn hơn và dễ đọc hơn nhiều so với giá trị mà nó đại diện.
  • Danh sách đầy đủ các biểu tượng trong trình phân tích cú pháp hoặc các phím trên bàn phím. Thậm chí có thể có một danh sách các hằng số có hầu hết hoặc tất cả các ký tự Unicode và đây là trường hợp trường hợp của bạn có thể rơi. Một số nhân vật như Alà rõ ràng và dễ nhận biết. Nhưng bạn có thể dễ dàng phân biệt АAtách rời? Chữ cái đầu tiên là chữ Cyrillic chữ cái trong khi chữ cái sau là chữ A Latinh . Chúng là các chữ cái khác nhau, được biểu thị bằng các điểm mã Unicode khác nhau, mặc dù về mặt đồ họa chúng gần như giống hệt nhau. Tôi muốn có hằng số CYRILLIC_CAPITAL_ALATIN_CAPITAL_Atrong mã của tôi hơn hai nhân vật trông gần giống nhau. Tất nhiên, điều này là vô nghĩa nếu bạn biết bạn sẽ chỉ làm việc với các ký tự ASCII không chứa Cyrillic. Tương tự như vậy: Tôi sử dụng bảng chữ cái Latinh hàng ngày vì vậy nếu tôi đang viết một chương trình cần một ký tự Trung Quốc, tôi có thể thích sử dụng một hằng số hơn là chèn một ký tự mà tôi không hiểu. Đối với ai đó sử dụng các ký tự Trung Quốc hàng ngày, một ký tự Trung Quốc có thể rõ ràng nhưng một ký tự Latinh có thể dễ dàng hơn để biểu thị như một hằng số được đặt tên. Vì vậy, như bạn thấy, nó phụ thuộc vào bối cảnh. Tuy nhiên, một thư viện có thể chứa các hằng số tượng trưng cho tất cả các ký tự vì các tác giả không thể biết trước thư viện sẽ được sử dụng như thế nào và các ký tự nào có thể cần các hằng số để cải thiện khả năng đọc trong một ứng dụng cụ thể.

Tuy nhiên, các trường hợp như vậy thường được xử lý bởi các lớp hệ thống hoặc thư viện có mục đích đặc biệt và sự xuất hiện của chúng trong mã được viết bởi các nhà phát triển ứng dụng nên rất hiếm khi bạn làm việc trên một dự án rất đặc biệt.


-1

Có lẽ.

Hằng ký tự đơn tương đối khó phân biệt. Vì vậy, có thể khá dễ bỏ lỡ thực tế là bạn đang thêm một khoảng thời gian chứ không phải là dấu phẩy

city + '.' + state

trong khi đó là một sai lầm tương đối khó thực hiện với

city + Const.PERIOD + state

Tùy thuộc vào môi trường quốc tế hóa và toàn cầu hóa của bạn, sự khác biệt giữa dấu nháy đơn ASCII và dấu nháy đơn mở và đóng của Windows-1252 (hoặc trích dẫn kép ASCII và trích dẫn kép đóng và mở của Windows-1252) có thể rất khó hình dung tại mã.

Bây giờ, có lẽ, nếu đặt nhầm một khoảng thời gian chứ không phải dấu phẩy là một vấn đề chức năng quan trọng, bạn sẽ có một bài kiểm tra tự động sẽ tìm thấy lỗi đánh máy. Nếu phần mềm của bạn đang tạo các tệp CSV, tôi hy vọng rằng bộ thử nghiệm của bạn sẽ phát hiện ra khá nhanh rằng bạn có một khoảng thời gian giữa thành phố và tiểu bang. Nếu phần mềm của bạn được yêu cầu chạy cho các máy khách có nhiều cấu hình quốc tế hóa, có lẽ bộ kiểm tra của bạn sẽ chạy trong từng môi trường và sẽ nhận nếu bạn có trích dẫn mở của Microsoft nếu bạn muốn có dấu nháy đơn.

Tôi có thể tưởng tượng một dự án trong đó có ý nghĩa hơn khi chọn mã dài hơn có thể giải quyết các vấn đề này, đặc biệt khi bạn có mã cũ không có bộ kiểm tra toàn diện mặc dù tôi có thể không mã theo cách này một dự án phát triển lĩnh vực xanh. Và việc thêm một hằng số cho mỗi ký tự dấu chấm câu thay vì chỉ những ký tự có khả năng gây ra vấn đề trong ứng dụng cụ thể của bạn có lẽ là quá mức cần thiết.


2
Điều gì xảy ra khi một số moron thay đổi Const.PERIODđể bằng ~? Không có lời biện minh cho một tautology của các ký tự được đặt tên, nó chỉ thêm bảo trì và sự phức tạp không cần thiết trong môi trường lập trình hiện đại. Bạn sẽ viết một bộ các bài kiểm tra đơn vị mà về cơ bản nói assert(Const.PERIOD == '.')?

3
@JarrodRoberson - Điều đó sẽ hút, chắc chắn. Nhưng bạn sẽ gặp nhiều rắc rối nếu ai đó thêm hằng số Unicode trông gần giống như dấu phẩy chứ không phải dấu phẩy thực tế. Như tôi đã nói, đây không phải là điều mà tôi sẽ làm trong một dự án phát triển trường xanh. Nhưng nếu bạn có một cơ sở mã kế thừa với bộ kiểm tra không chính xác, nơi bạn đã vấp phải dấu phẩy / dấu chấm hoặc dấu nháy đơn / dấu hiệu ghê tởm của Microsoft một vài lần, tạo một số hằng số và bảo mọi người sử dụng chúng có thể là một cách hợp lý để thực hiện mã tốt hơn mà không mất một năm viết bài kiểm tra.
Hang động Justin

3
ví dụ di sản của bạn là một ví dụ tồi, tôi vừa hoàn thành việc tái cấu trúc một cơ sở mã 1.000.000 LỘC đã 18 tuổi. Nó có mọi ký tự có thể in được định nghĩa như thế này nhiều lần với các tên xung đột khác nhau. Và nhiều lần những thứ được đặt tên COMMAđã thực sự được thiết lập = SPACE + "," + SPACE. Có một số kẻ ngốc đã có một SPACEhằng số. Tôi đã tái cấu trúc chúng TẤT CẢ và mã số là những mệnh lệnh dễ đọc hơn và những người tuyển dụng đại học có thể theo dõi mọi thứ nhiều hơn và sửa chữa chúng mà không cần phải có 6 cấp độ để tìm hiểu xem cái gì thực sự được đặt ra.

-1

Là hằng số ký tự đơn tốt hơn chữ?

Có rất nhiều conflations nổi xung quanh đây. Hãy để tôi xem nếu tôi có thể trêu chọc họ ngoài.

Các hằng số cung cấp:

  • ngữ nghĩa
  • thay đổi, trong quá trình phát triển
  • gián tiếp

Đi xuống một tên nhân vật duy nhất chỉ tác động đến ngữ nghĩa. Một tên nên hữu ích như một nhận xét và rõ ràng trong bối cảnh. Nó nên thể hiện ý nghĩa, không phải giá trị. Nếu nó có thể làm tất cả điều đó với một nhân vật duy nhất tốt. Nếu không thể, xin đừng.

Một nghĩa đen và một hằng số có thể thay đổi trong quá trình phát triển. Đây là những gì mang đến vấn đề số ma thuật. Chuỗi có thể là số ma thuật là tốt.

Nếu ý nghĩa ngữ nghĩa tồn tại và vì cả hai đều là hằng số, thì liệu hằng số có nhiều giá trị hơn nghĩa đen đi xuống theo hướng không xác định.

Sự thiếu quyết đoán có thể giải quyết bất kỳ vấn đề nào, ngoài việc không có nhiều quyết định.

Cảm ứng có thể giải quyết vấn đề số ma thuật bởi vì nó cho phép bạn quyết định giá trị cho một ý tưởng ở một nơi. Về mặt ngữ nghĩa, để có giá trị, cái tên phải làm cho ý tưởng đó rõ ràng. Tên nên là về ý tưởng, không phải giá trị.

Sự thiếu quyết đoán có thể là quá mức. Một số thích tìm kiếm và thay thế bằng chữ để thay đổi. Điều đó tốt miễn là 42 rõ ràng là ý nghĩa của cuộc sống và không trộn lẫn với 42, số nguyên tử của molypden.

Bất cứ điều gì bạn có thể tạo ra sự khác biệt hữu ích như thế với một chữ cái phụ thuộc phần lớn vào bối cảnh. Nhưng tôi sẽ không biến nó thành thói quen.


1
Ngữ nghĩa là chìa khóa. Nếu và "A" có nhiều ngữ nghĩa hơn là chỉ là "A" thì đáng để liên kết cùng một ngữ nghĩa với cùng một "tham chiếu". Không quan trọng nếu nó là một hằng số hay không. Tôi hoàn toàn đồng ý.
oopexpert

-1

Là một quan điểm triết học theo quan điểm của đa số, tôi phải nói rằng có một số người trong chúng ta, những người đánh giá cao các lập trình viên nông dân Pháp thế kỷ 19 không tinh vi và

nhớ lại sự sáng suốt đơn điệu, vĩnh cửu của anh ấy, những quan điểm nhạy cảm đến đáng kinh ngạc của anh ấy về mọi thứ, sự hài lòng khổng lồ của anh ấy với những sự thật chỉ vì chúng là sự thật. "Làm phiền tất cả!" Turnbull đã khóc với chính mình, "nếu anh ta ở trong trại tị nạn, không thể có ai ở bên ngoài."

GK Chesterton, Quả bóng và Thánh giá

Không có gì sai khi đánh giá cao sự thật và không có gì sai khi nói rõ sự thật, đặc biệt là khi nói chuyện với máy tính.

Nếu bạn nói dối với máy tính, nó sẽ giúp bạn

Perry Farrar - Germantown, Maryland (từ nhiều viên ngọc lập trình khác)


Nhưng, phần lớn tôi đồng ý với những người nói rằng nó thật ngu ngốc. Tôi còn quá trẻ để học lập trình FORTRAN, nhưng tôi đã nghe nói rằng bạn có thể xác định lại 'A' = 'Q'và đưa ra tất cả các loại mật mã tuyệt vời. Bạn không làm điều này.

Ngoài các vấn đề i18n được đưa ra trước đó (không xác định lại glyph "COMMA", nhưng thực sự xác định lại glyph của một DECIMAL_POINT). Xây dựng các trích dẫn cà rốt của Pháp hoặc các trích dẫn đơn của Anh để truyền đạt ý nghĩa cho con người là điều và những người thực sự phải là biến, không phải là hằng số. Hằng số sẽ là AMERICAN_COMMA := ','comma := AMERICAN_COMMA

Và, nếu tôi đang sử dụng mẫu xây dựng để xây dựng Truy vấn SQL, tôi sẽ thấy nhiều hơn

sb.append("insert into ")
 .append(table_name)
 .append(" values ")
 .append(" ( ")
 .append(val_1)
 .append(",")
 .append(val_2)
 .append(" ); ")

hơn bất cứ điều gì khác, nhưng nếu bạn định thêm hằng số, nó sẽ là

INSERT_VALUES_START = " ( "
INSERT_VALUES_END = " ) "
INSERT_VALUES_SEPARATOR = " , "
QUERY_TERMINATOR = ";"

sb.append("insert into ")
 .append(table_name)
 .append(" values ")
 .append(INSERT_VALUES_START)
 .append(val_1)
 .append(INSERT_VALUES_SEPARATOR)
 .append(val_2)
 .append(INSERT_VALUES_END)
 .append(QUERY_TERMINATOR)

Tuy nhiên, nếu bạn đã từng xem bất kỳ chương trình nào khác (hoặc loại), bạn có thể nhận thấy một số điều kỳ thú. Không phải tất cả chúng ta là những người đánh máy sao. Rất nhiều người trong chúng tôi đã lập trình muộn hoặc được nuôi dưỡng bằng bàn phím Liên Xô (nơi gõ phím cho bạn) và chúng tôi muốn cắt và dán các chữ cái riêng lẻ thay vì cố gắng tìm chúng trên bàn phím và / hoặc dựa vào tự động hoàn tất.

Không có gì sẽ tự động hoàn thành một chuỗi cho bạn, vì vậy nếu tôi có thể nhận được dấu phẩy bằng cách nhấn 'con', alt-space, down, down, down, enter và nhận báo giá bằng cách nhấn 'con', alt-space, down, xuống, nhập. Tôi chỉ có thể làm điều đó.


Một điều cần nhớ về chuỗi ký tự là cách chúng được biên dịch. Ít nhất trong Delphi, (đó là ngôn ngữ duy nhất tôi bị ám ảnh bởi chồng), bạn sẽ kết thúc những chữ của bạn xuất hiện trong ngăn xếp của mỗi chức năng. Vì vậy, rất nhiều chữ = rất nhiều hàm trên; "," trong function_A không phải là cùng một phần bộ nhớ với "," trong function_B ". Để chống lại điều này, có một" chuỗi tài nguyên "có thể được xây dựng và liên kết sang một bên - và đây là cách họ thực hiện công cụ i18n (giết chết hai con chim với một bụi cây). Trong Python, tất cả các chuỗi ký tự của bạn đều là đối tượng và nó thực sự có vẻ tốt khi sử dụng utils.constants.COMMA.join(["some","happy","array","strings"]), nhưng đó không phải là ý tưởng tuyệt vời cho các điểm lặp đi lặp lại trên trang này.


-4

Nhưng khi nào chúng ta sẽ bắt đầu sử dụng một biểu tượng khác với ',' để biểu thị dấu phẩy?

Để nội địa hóa.

Ở các quốc gia nói tiếng Anh, ký hiệu phân tách toàn bộ và một phần phân số của số thập phân là ".", Mà chúng ta gọi là "dấu thập phân". Ở nhiều quốc gia khác, ký hiệu là "," và thường được gọi là tương đương với "dấu phẩy" trong ngôn ngữ địa phương. Tương tự, khi các quốc gia nói tiếng Anh sử dụng "," để phân tách các nhóm ba chữ số với số lượng lớn (chẳng hạn như 1.000.000 cho một triệu), các quốc gia sử dụng dấu phẩy làm dấu thập phân sử dụng dấu chấm (1.000.000).

Vì vậy, có một trường hợp để tạo các hằng số DECIMAL_POINT và COMMA nếu bạn đang thực hiện toàn cầu hóa.


2
Nhưng sau đó COMMA và DECIMAL_POINT không phải là tên chính xác cho các thực thể (có lẽ đó là lý do tại sao bạn bị hạ cấp).
Kyle Strand

Bạn cần biên dịch các phiên bản địa phương hóa cụ thể. Hằng số theo nghĩa đen không phù hợp với điều đó; trường hợp sử dụng đó sẽ gọi các tệp định nghĩa và tra cứu vào chúng (có thể liên quan đến các hằng số, nhưng các hằng số tra cứu, không phải các ký tự không đổi).
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.