Cách thực hành tốt nhất để tạo lớp cấu hình 'toàn cầu' được sử dụng bởi nhiều thành phần


11

Tôi có một dự án lớn với một phần trình điều khiển và khoảng 5 thư viện thực hiện các nhiệm vụ liên quan khác nhau. Nhiều thư viện yêu cầu quyền truy cập vào dữ liệu cấu hình 'toàn cầu' được đọc từ cơ sở dữ liệu khi khởi động bằng mã trình điều khiển. Bởi trình điều khiển tôi chỉ có nghĩa là phần có chức năng chính.

Ý tưởng của tôi về cách xử lý việc này là tạo một lớp cấu hình với một phương thức tĩnh để lấy các mục cấu hình. Đây có phải là cách tiếp cận tốt nhất? Làm thế nào khác điều này có thể đạt được?

ví dụ:

class config {
 public:
   static get_item(key);

 private:
   static values;
};

Là thiết kế singleton thích hợp ở đây?

Câu trả lời:


14

Cách không đơn lẻ là tạo một lớp cấu hình thông thường với các thuộc tính / thành viên thông thường, khởi tạo đối tượng đó với các cài đặt chính xác từ cơ sở dữ liệu trong trình điều khiển và chuyển thể hiện cho tất cả các thư viện - có thể thông qua std :: shared_ptr. Đây là một mẫu thiết kế phổ biến được gọi là Dependency Injection .

Bằng cách đó, bạn tránh được tất cả các vấn đề tiềm ẩn từ mẫu thiết kế singleton và mã của bạn sẽ dễ kiểm tra hơn khi bạn có thể khởi tạo một thể hiện của lớp cấu hình của mình theo bất kỳ cách nào bạn muốn, với bất kỳ dữ liệu nào, để kiểm tra.


+1, muốn thêm điều đó về khả năng kiểm tra vào câu trả lời của riêng tôi, nhưng bạn đã nhanh hơn.
Doc Brown

Hơi OT: Không phải đó vẫn là một Singleton, chỉ được thực hiện khác nhau sao?
adhominem

1
@adhominem - không, đó là một đối tượng chỉ tồn tại một trường hợp duy nhất tồn tại, nhưng không có máy móc đặc biệt nào xung quanh nó.
Joris Timmermans

@Oliver Weiler - chính xác, và tôi thực sự nên tham chiếu tên mẫu thiết kế đó trong câu trả lời của mình, vì vậy tôi sẽ thêm nó ngay bây giờ.
Joris Timmermans

1

Tôi nghĩ rằng đây là một trong những lần mà Singleton thực sự là điều đúng đắn.

Về giao diện của chính lớp đó, bạn có thể thực hiện get-by-key-name hoặc có các bộ truy cập cho các giá trị cấu hình riêng lẻ. Lược đồ sau có một số tiện lợi (hoàn thành IDE cho một) và cho phép bạn truyền các giá trị cấu hình thành các kiểu dữ liệu chính xác của chúng trước khi sử dụng chúng. Nó cũng giới thiệu một số sự tách biệt giữa những người dùng của lớp cấu hình và hàm ý bên trong của nó (thực tế là tất cả các giá trị cấu hình được lưu trữ dưới dạng chuỗi, là một chi tiết triển khai mà người dùng của lớp không nên lo lắng).

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.