Thực tiễn / lý do tốt nhất cho các hằng chuỗi trong JavaScript [đã đóng]


8

Trong các ngôn ngữ tĩnh như Java / C #, tôi thường sử dụng các hằng số cho chuỗi hoặc số, thay vì chỉ chèn chúng vào mã. Tuy nhiên, tôi có xu hướng tránh thực hành này trong JavaScript. Gần đây, vì một số lập trình viên khác xung quanh tôi đã thực hiện phương pháp này trong JS, tôi quyết định có lẽ tôi nên củng cố lý lẽ của tôi hoặc của họ.

Không có cú pháp khai báo "const" thực tế trong JavaScript. Chúng tôi thường chỉ giải quyết cho một chính sách không chính thức về việc không thay đổi thuộc tính chữ hoa. Nhưng ý kiến ​​của tôi thường là tránh chúng hoàn toàn, bởi vì hầu hết các lợi ích của chúng bị mất trong JavaScript. Trong Java, một chuỗi sai chính tả sẽ khiến chương trình bị lỗi khi bạn cố chạy nó, tại thời điểm đó bạn sửa nó và tiếp tục. Có một trình kiểm tra tĩnh trong đó cả hai trường hợp đều trỏ đến cùng một hằng số sẽ loại bỏ vấn đề đó, vì nó có thể được tìm thấy tại thời gian biên dịch. Nhưng JavaScript đơn giản sẽ có vấn đề đó ở mọi nơi, vì bạn LUÔN sẽ khám phá tính đúng chính tả của bạn trong thời gian chạy :

Library = { doThing: function() }
setTimeout(function()
  Liberry.doThing()
  // No such object: Liberry
}, 0);

Cách bảo vệ tốt nhất chống lại điều này, thông thường, là "sử dụng nghiêm ngặt". Đối với các nhà phát triển thích nó, tôi ổn với họ bằng cách sử dụng điều đó để tìm ra các vấn đề với các biến không được khai báo nhanh hơn. Nhưng ý kiến ​​của tôi là việc cung cấp các hằng chuỗi cho API REST, v.v., không thực sự bảo vệ bạn trước mọi thứ. Một vi dụ khac:

CompanyAPI.constants.ENROLL_URL = "/rest/enroll";
CompanyAPI.constants.FIRST_NAME = "firstName";

ajax({url: CompanyAPI.constants.ENROLL_URL,
data: CompanyAPI.constants.FIRST_NAME
});
// vs.
ajax({url: "/rest/enroll",
data: "firstName"
});

... Bạn có nghĩa là viết ở trên, nhưng sau đó đã mắc lỗi chính tả. Rất tiếc.

ajax({url: CompanyAPI.constants.ENROL_URL,
  data: CompanyAPI.constants.FIRS_NAME
});
// vs.
ajax({url: "/rest/enrol",
  data: "firsName"
});

Cái dựa trên hằng số vẫn sẽ cung cấp không xác định , trong khi "FirsName" thì không tốt hơn. Cuối cùng, tôi có xu hướng chỉ xem đây là một lợi ích của ngôn ngữ tĩnh và không bận tâm đến việc có một hệ thống để sửa nó (bên cạnh đó có thể bắt đầu sử dụng "sử dụng nghiêm ngặt" để gỡ lỗi). Một số người khác có thể cho tôi biết thực hành ưa thích của họ đối với hằng số chuỗi / số nguyên là gì không?

EDIT: Để làm rõ, sở thích của tôi thường là đặt các chuỗi như "FirstName" trực tiếp nội tuyến mà không có khai báo liên tục cấp cao nhất - các hình phạt cho việc viết sai chính tả cũng giống như vậy. Các chuỗi có thể dài, như URL REST, tôi sẽ có xu hướng xác định ở đầu tệp.


FIRST_NAME? Có vẻ như nó đến từ một thứ gì đó phía máy chủ và được truyền vào javascript. Và điều đó kết hợp với việc bạn nói rằng bạn đến từ Java / C #, tôi có cảm giác bạn đang đọc sai các biến này để làm gì: Tách dữ liệu khỏi mã, để .jstrình duyệt có thể được lưu vào bộ nhớ cache ...
Izkata

@Izkata Tôi không chắc là tôi nhận được bình luận về bộ nhớ đệm. Đây không phải là JS do máy chủ tạo ra (Mặc dù một khả năng cho các hằng số này là chúng đến từ máy chủ - nó sẽ tập trung mọi thứ nhiều hơn, nhưng tôi cảm thấy như đó sẽ là sự phức tạp quá mức và quá nhiều yêu cầu bổ sung.)
Katana314

Nó sẽ không tạo thêm bất kỳ yêu cầu nào, dữ liệu sẽ được đặt trong mẫu và được sử dụng trong javascript. Đó là cách sử dụng FIRST_NAMEđặc biệt khiến tôi băn khoăn - nó không thay đổi trên mỗi người dùng?
Izkata

Vâng, phần đó chỉ là sự lười biếng trong việc viết ví dụ; trường hợp này chỉ là gửi từ "FirstName" đến máy chủ không có ý nghĩa gì, nhưng nói chung, ý tưởng sẽ là sử dụng nó như một khóa cho một giá trị đầu vào.
Katana314

Câu trả lời:


5

Các hằng số phục vụ chức năng kiểm tra lỗi trong các ngôn ngữ được nhập tĩnh, nhưng chúng cũng phục vụ mục đích thứ hai. Họ tập trung thông tin vào một nơi. Điều này không bị mất khi chúng tôi chuyển sang JavaScript.

Hãy tưởng tượng rằng ví dụ của bạn trông giống như thế này,

config.js:

CompanyAPI.constants.ENROLL_URL = "/rest/enroll";
CompanyAPI.constants.FIRST_NAME = "firstName";

ghi danh:

ajax({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

đặc biệt ghi danh:

ajax({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

cần phải đăng ký-từ-này-khác-nơi.js:

ajax({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

goto-ghi.js:

redirect({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

Lưu ý rằng, bây giờ, các hằng số này đang hiển thị trong các tệp ở khắp mọi nơi. Nếu tôi không sử dụng hằng, tôi sẽ phải tìm tất cả các thể hiện của chuỗi cụ thể đó và thay thế chúng theo cách thủ công. Phải thừa nhận rằng có sự trùng lặp ở đây, nhưng lưu ý rằng cái cuối cùng thực sự khác nhau. Điều này có nghĩa là ngay cả khi chúng tôi loại bỏ sự trùng lặp, chúng tôi thực sự không thể trừu tượng hóa điều này. Bây giờ, vì chúng tôi đang sử dụng các hằng số và CompanyAPI.constants.FIRST_NAMEcần thay đổi, chúng tôi có thể thay đổi nó ở một và chỉ một nơi và nó sẽ tự động thay đổi ở mọi nơi.

Nếu tôi chỉ sử dụng một chuỗi ở một nơi và đó không phải là cấu hình (nghĩa là chỉ mục chuỗi mảng không phải là cấu hình), thì tôi sẽ đặt nó trong dòng. Nếu tôi thấy tôi đang sử dụng nó ở một vài nơi gần nhau, tôi sẽ tìm cách tái cấu trúc nó thành một lần sử dụng. Nếu tôi không thể cấu trúc lại, tôi có thể sẽ chuyển nó thành hằng số "lớp".


1
Có một mặt tối đối với điều đó quá. Mỗi lần một phần dữ liệu được thêm / xóa cho một yêu cầu, nó phải được thêm / xóa vào hai tệp khác nhau. Ngoài ra, nếu tên của một phần dữ liệu thay đổi, bạn có thể thay đổi hằng số - nhưng sau đó mã khó đọc hơn, bởi vì đó là một tên hằng liên quan đến tên biến khác. (Ví dụ: công ty chúng tôi đã đổi tên một thứ gọi là "Mã đăng ký" không chỉ một lần mà là hai lần.) Việc thiếu công cụ Refactor tự động của JS có nghĩa là rất nhiều sự tập trung này bị mất.
Katana314

4

Cũng giống như học một ngôn ngữ khác, người ta không nên so sánh nó với ngôn ngữ mẹ đẻ của mình. Một số ngôn ngữ thường có các khái niệm không được tìm thấy ở những ngôn ngữ khác. Chúng tôi chỉ đơn giản là học cách chấp nhận chúng.

Các hằng số trong Java, C # và C ++ không tồn tại trong mã nhị phân. Các hằng số này được phát minh để giúp các lập trình viên và trình biên dịch. Như câu trả lời này ( /programming/130394/are-there-constants-in-javascript ) nói "Không có gì là không đổi"

Do đó, câu trả lời cho câu hỏi của bạn là trong Quy ước đặt tên và Đánh giá mã. Bạn và nhóm của bạn sẽ cần xác định cách đặt tên các hằng số, đồng ý rằng các hằng số sẽ không được sửa đổi và sử dụng đánh giá mã như một cách để thực thi quy tắc. Vào cuối ngày, bạn quyết định đi theo con đường nào không quan trọng, nó sẽ không phải là bằng chứng ngu ngốc.

Cách tôi thích đối phó với các hằng số là

var NAMESPACE.CONSTANT = 1;
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.