
Tobias Schwinger <tschwinger <at> isonews2.com> writes:
Peter Dimov wrote:
Tobias Schwinger:
Singletons *are* globals. OK, that was a bit unclear. Let's put it this way:
It's not globals that are evil but accessing them all over the place (or "coupling" to use the technical term that describes the problem).
Coupling is why people use singletons. Were there no coupling, there would be no need to constrain the number of instances. The whole point of having a single instance it to allow modules to couple themselves to it, and be sure that they can communicate with other coupled modules via its state.
Thanks for throwing in the wise words, Peter.
Yes. People use singletons to ensure that code is coupled to the decision that there can be only one instance of a particular class. As you say yourself, excess coupling is bad. In particular, most code that is coupled using singletons has no need to know about the "one instance" constraint --- it just needs *some* instance to use. Sometimes it needs to know that it's the same instance as one being used elsewhere, but there are other solutions to this than singletons (e.g. explicitly passing the reference around), which avoid the coupling to the "there can be only one" design decision.
With this terminology the moral of Anthony's experience report boils down to:
"Don't write too much code against an interface that will eventually change".
That's certainly sensible advice. In my experience, singletons introduce excessive coupling, and make the code that uses the singleton hard to test. I am strongly opposed to the use of singletons in almost all circumstances, and strongly opposed to the idea of any library designed to make implementing singletons easier. Anthony