Trong các ứng dụng chủ yếu lớn của chúng tôi, chúng tôi thường chỉ có một vài vị trí cho "hằng số":
- Một lớp cho GUI và các yếu tố bên trong (tiêu đề Trang Tab, tiêu đề Hộp nhóm, hệ số tính toán, bảng liệt kê)
- Một lớp cho các bảng và cột cơ sở dữ liệu (phần này được tạo mã) cộng với các tên có thể đọc được cho chúng (được gán thủ công)
- Một lớp cho tin nhắn ứng dụng (ghi nhật ký, hộp thông báo, v.v.)
Các hằng số thường được phân tách thành các cấu trúc khác nhau trong các lớp đó. Trong các ứng dụng C ++ của chúng tôi, các hằng số chỉ được xác định trong tệp .h và các giá trị được gán trong tệp .cpp.
Một trong những lợi thế là tất cả các chuỗi, vv đều ở một vị trí trung tâm và mọi người đều biết tìm chúng ở đâu khi phải thay đổi thứ gì đó.
Điều này đặc biệt là thứ mà các nhà quản lý dự án dường như thích khi mọi người đến và đi và bằng cách này mọi người có thể thay đổi những thứ tầm thường như vậy mà không cần phải đào sâu vào cấu trúc của ứng dụng.
Ngoài ra, bạn có thể dễ dàng thay đổi tiêu đề của Hộp nhóm / Trang tab tương tự, v.v. Một khía cạnh khác là bạn chỉ có thể in lớp đó và đưa nó cho một người không phải là lập trình viên, người có thể kiểm tra xem các chú thích có trực quan không, và nếu các tin nhắn cho người dùng quá chi tiết hoặc quá khó hiểu, v.v.
Tuy nhiên, tôi thấy những nhược điểm nhất định:
- Mỗi lớp duy nhất được liên kết chặt chẽ với các lớp hằng
- Thêm / Xóa / Đổi tên / Di chuyển một hằng số yêu cầu biên dịch lại ít nhất 90% ứng dụng (Lưu ý: Thay đổi giá trị không, ít nhất là đối với C ++). Trong một trong các dự án C ++ của chúng tôi với 1500 lớp, điều này có nghĩa là khoảng 7 phút thời gian biên dịch (sử dụng các tiêu đề được biên dịch trước; không có chúng khoảng 50 phút) cộng với khoảng 10 phút liên kết với các thư viện tĩnh nhất định.
- Xây dựng một bản phát hành được tối ưu hóa tốc độ thông qua Trình biên dịch Visual Studio mất tới 3 giờ. Tôi không biết nếu số lượng lớn các mối quan hệ giai cấp là nguồn nhưng nó cũng có thể.
- Bạn bị điều khiển vào các chuỗi mã hóa tạm thời thẳng vào mã bởi vì bạn muốn kiểm tra một cái gì đó rất nhanh và không muốn đợi 15 phút chỉ cho thử nghiệm đó (và có thể là mọi thứ tiếp theo). Mọi người đều biết chuyện gì xảy ra với "Tôi sẽ sửa nó sau".
- Việc sử dụng lại một lớp trong một dự án khác không phải lúc nào cũng dễ dàng (chủ yếu là do các khớp nối chặt chẽ khác, nhưng việc xử lý các hằng số không làm cho nó dễ dàng hơn.)
Nơi nào bạn sẽ lưu trữ hằng số như vậy? Ngoài ra những lý lẽ nào bạn sẽ đưa ra để thuyết phục người quản lý dự án của bạn rằng có những khái niệm tốt hơn cũng tuân thủ các lợi thế được liệt kê ở trên?
Hãy đưa ra câu trả lời cụ thể hoặc độc lập cho C ++.
Tái bút: Tôi biết câu hỏi này là loại chủ quan nhưng thực lòng tôi không biết nơi nào tốt hơn trang web này cho loại câu hỏi này.
Cập nhật về dự án này
Tôi có tin tức về điều thời gian biên dịch:
Theo các bài đăng của Caleb và gbjbaanb, tôi chia tệp hằng của tôi thành nhiều tệp khác khi tôi có thời gian. Cuối cùng tôi cũng chia dự án của mình thành nhiều thư viện mà giờ đây có thể dễ dàng hơn nhiều. Biên dịch điều này trong chế độ phát hành cho thấy tệp được tạo tự động chứa các định nghĩa cơ sở dữ liệu (bảng, tên cột và hơn 8000 ký hiệu) và tạo ra các giá trị băm nhất định gây ra thời gian biên dịch lớn trong chế độ phát hành.
Vô hiệu hóa trình tối ưu hóa của MSVC cho thư viện chứa các hằng số DB hiện cho phép chúng tôi giảm tổng thời gian biên dịch Dự án của bạn (một số ứng dụng) trong chế độ phát hành từ tối đa 8 giờ xuống dưới một giờ!
Chúng tôi vẫn chưa tìm ra lý do tại sao MSVC gặp khó khăn trong việc tối ưu hóa các tệp này, nhưng bây giờ thay đổi này làm giảm rất nhiều áp lực vì chúng tôi không còn phải chỉ dựa vào các bản dựng hàng đêm.
Thực tế đó - và các lợi ích khác, chẳng hạn như khớp nối ít chặt chẽ hơn, khả năng tái sử dụng tốt hơn, v.v. - cũng cho thấy rằng việc dành thời gian để chia tách "hằng số" rốt cuộc không phải là một ý tưởng tồi ;-)
Cập nhật2
Vì câu hỏi này vẫn nhận được một số chú ý:
Đây là những gì tôi đã làm trong vài năm qua:
Đặt chính xác mọi hằng số, biến số, v.v. trong phạm vi có liên quan đến nó: Nếu bạn chỉ sử dụng một hằng số trong một phương thức duy nhất, bạn có thể định nghĩa nó trong phương thức đó. Nếu một lớp duy nhất quan tâm đến nó, hãy để nó như một chi tiết triển khai riêng của lớp đó. Điều tương tự áp dụng cho không gian tên, mô-đun, dự án, phạm vi công ty. Tôi cũng sử dụng mô hình tương tự cho các chức năng của người trợ giúp và tương tự. (Điều này có thể không áp dụng 100% nếu bạn phát triển khung công khai.)
Làm điều này làm tăng khả năng sử dụng lại, khả năng kiểm tra và khả năng bảo trì ở một mức độ mà bạn không chỉ mất ít thời gian biên dịch (ít nhất là trong C ++), mà còn mất ít thời gian hơn cho việc sửa lỗi, giúp bạn có nhiều thời gian hơn để phát triển các tính năng mới. Đồng thời, việc phát triển các tính năng này sẽ diễn ra nhanh hơn vì bạn có thể sử dụng lại nhiều mã dễ dàng hơn. Điều này lớn hơn bất kỳ lợi thế nào mà tệp hằng số trung tâm có thể có độ lớn.
Hãy xem đặc biệt là Nguyên tắc phân chia giao diện và Nguyên tắc trách nhiệm duy nhất nếu bạn muốn biết thêm.
Nếu bạn đồng ý, hãy đưa ra câu trả lời của Caleb vì bản cập nhật này về cơ bản là một cách tổng quát hơn về những gì anh ấy nói.