views:

850

answers:

2

In large and complex software products managing configurable settings becomes a major pain. Two approaches I've seen to the problem are:

  • have each component in the system load its own configuration from config files or registry settings.
  • have a settings loader class that loads all the configurable system settings and have each component query the settings loader for its settings.

These approaches both feel wrong to me.

Are there any design patterns that could be used to simplify the problem? Maybe something that would take advantage of the dependency injection technique.

+5  A: 

I prefer to create an interface for setting query, loading, and saving. By using dependency injection, I can inject this into each component that requires it.

This allows flexibility in terms of replacing the configuration strategy, and gives a common base for everything to work from. I prefer this to a single, global "settings loader" (your option 2), especially since I can override the configuration mechanism for a single component if I absolutely need to do so.

Reed Copsey
+2  A: 

I currently work on a system where the configuration is managed by one global singleton object that keeps a map of configuration keys to values. In general, I wish it hadn't been done this way because it can cause concurrency bottlenecks in the system and it's sloppy for unit testing, etc.

I think Reed Copsey has the right of it (I voted him up), but I would definitely recommend reading Martin Fowler's great article on dependency injection:

http://martinfowler.com/articles/injection.html

A slight addendum too...if you want to do any mock object type unit testing, dependency injection is definitely the way to go.

Brent Nash
+1 for Fowler link.
ceretullis
It seems that decorator match your needs. You can create a Serializable decorator that will be able to make classes serializable in their own way. Strategy can be used to make all objects have their strategy for serialization. Those objects that do not need to be serialized can use ignore strategy. Those that only need to serialize their fields OnlyFields strategy and so on. You`ll be flexible with adding new things to your config. Sure as all approaches this have it`s pros and cons.
Yaroslav Yakovlev