Config động, thay đổi giá trị tại runtime?

  1. Lập trình

giả sử mình muốn config động, tức là thay đổi giá trị config trong quá trình chạy chương trình. Giải pháp thường thấy là sử dụng 1 class Configs để load và reload.
Tuy nhiên trong trường hợp người lập trình (nói cách khác chính là mình) lấy 1 giá trị config và gán cho 1 object nào đó (Ví dụ như random seed) hoặc nghiêm trọng hơn là load giá trị config vào 1 phần của 1 constant hoặc field protected, private và được sử dụng bởi các object khác tầng tham chiếu thứ 3, thứ 4, ...
Như vậy việc thay đổi giá trị của static fields trong class Config có thể không đủ để mang lại kết quả mong đợi, thậm chí có thể gây xung đột giữa config cũ và mới khi runtime.

Liệu có thể giải quyết vấn đề này như thế nào? Có thiết kế nào để ngăn ngừa việc sử dụng giá trị config thiếu an toàn không?

Từ khóa: 

lập trình

Tôi chẳng hiểu bạn muốn làm gì cả.

Tôi nghĩ bạn cần giải thích mạch lạc hơn cái mình thật sự mong muốn là gì?

Tuy nhiên, theo hiểu biết của tôi thì có mấy dạng sau:

  • Config tĩnh: được hard code.
  • Config động bằng single instance: Load động, có thể thay đổi. Tuy nhiên, có thể giới hạn những nơi nào có quyền thay đổi.
  • Config động bằng immutable object: Cho phép nhiều instance, và không sửa được khi đã khởi tạo, muốn load config mới thì new instance.
  • Context: Giống config nhưng nó thành một parameter được đưa vào các class/function để thực thi.

2 cái đầu tiên thì có thể làm config globally, 2 cái sau thì có thể globally hoặc locally.

Riêng context thì thường object nhỏ (ít property trên đó), và dùng nội bộ trong component/module.

Còn việc chống lại dev nhầm lẫn thì mình nghĩ rất khó, thông thường người ta sẽ tránh bằng các tool check syntax như linter (trong nodeJS)

Nhắn nhỏ: Lần sau bạn nên nói mình xài ngôn ngữ nào để dễ trả lời nhé.

Trả lời

Tôi chẳng hiểu bạn muốn làm gì cả.

Tôi nghĩ bạn cần giải thích mạch lạc hơn cái mình thật sự mong muốn là gì?

Tuy nhiên, theo hiểu biết của tôi thì có mấy dạng sau:

  • Config tĩnh: được hard code.
  • Config động bằng single instance: Load động, có thể thay đổi. Tuy nhiên, có thể giới hạn những nơi nào có quyền thay đổi.
  • Config động bằng immutable object: Cho phép nhiều instance, và không sửa được khi đã khởi tạo, muốn load config mới thì new instance.
  • Context: Giống config nhưng nó thành một parameter được đưa vào các class/function để thực thi.

2 cái đầu tiên thì có thể làm config globally, 2 cái sau thì có thể globally hoặc locally.

Riêng context thì thường object nhỏ (ít property trên đó), và dùng nội bộ trong component/module.

Còn việc chống lại dev nhầm lẫn thì mình nghĩ rất khó, thông thường người ta sẽ tránh bằng các tool check syntax như linter (trong nodeJS)

Nhắn nhỏ: Lần sau bạn nên nói mình xài ngôn ngữ nào để dễ trả lời nhé.

Bài này là bài switch rule (hoặc config như case của bạn). Làm thế nào để update được rule trong runtime mà không phải restart lại toàn bộ tiến trình.

Giải pháp sẽ là sử dụng đồng thời hai bộ rule. Một bộ rule cũ, một bộ gọi là rule mới. Trong khi đang dùng rule cũ, thì mình sẽ build bộ rule mới. Khi build xong thì sẽ switch động sang, sau đó xem mới là cũ, và cứ đảo qua đảo lại mỗi lần update.

Với một message mình sẽ có 1 con trỏ chỉ ra nó đang tham chiếu theo bộ rule nào. Khi đó sẽ đảm bảo trong lúc đang switch chuyển thì mọi message đang được xử lý theo bộ rule nào thì sẽ đi theo trọn vẹn bộ rule đó.

Nếu bạn cần mình có thể vẽ thêm hình cho dễ hiểu sau nhé!