+2  A: 

My way to avoid singletons derives from the idea that "application global" doesn't mean "VM global" (i.e. static). Therefore I introduce a ApplicationContext class which holds much former static singleton information that should be application global, like the configuration store. This context is passed into all structures. If you use any IOC container or service manager, you can use this to get access to the context.

David Schmitt
Isn't this really just singleton by a different name? Instead of all components in your application having (undeclared) dependencies on the singletons, now they depend on your ApplicationContext. It sounds like global state of a different name.
matt b
Well singletons _are_ global state. The problems arise because "static" is VM-global and not application-global and thus cannot be easily replaced/mocked/controlled.
David Schmitt
You've now replaced the Singleton anti-pattern with the God Object anti-pattern. Good luck with that
1800 INFORMATION
@1800-INFORMATION: I edited my answer to better reflect what I'm really doing. In the end I think the benefits of being able to replace/inherit my ApplicationContext outweigh the downsides of a God Object.
David Schmitt
+13  A: 

Dependency Injection is your friend.

Take a look at these posts on the excellent Google Testing Blog:

Hopefully someone has made a DI framework/container for the C++ world? Looks like Google has released a C++ Testing Framework and a C++ Mocking Framework, which might help you out.

matt b
Thank you for the links. I actually linked to the "liars" article in my question, but the other two I haven't seen yet.
e.James
And thank you again for the "Dependency Injection" link. That was exactly what I needed!
e.James
Thank Misko, not me!
matt b
+1  A: 

Okay, first of all, the "singletons are always evil" notion is wrong. You use a Singleton whenever you have a resource which won't or can't ever be duplicated. No problem.

That said, in your example, there's an obvious degree of freedom in the application: someone could come along and say "but I want two stores."

There are several solutions. The one that occurs first of all is to build a factory class; when you ask for a Store, it gives you one named with some universal name (eg, a URI.) Inside that store, you need to be sure that multiple copies don't step on one another, via critical regions or some method of ensuring atomicity of transactions.

Charlie Martin
Singletons tend to make code harder to test, IME. Just because there'll only be one instance in the lifetime of the real app doesn't mean it's not useful for there to be a new instance for each test.
Jon Skeet
Singletons aren't necessary evil, singleton patterns however, usually are, for a bunch of reasons (unit testability for example)
roe
I had thought about the two-stores scenario, but since the user is required to log in to a specific store, there could only be one store active.
e.James
Singleton's are always evil
1800 INFORMATION
eJames, what if someone needs at some point to log into two? The point is to think about the degrees of freedom in the spec; that's an obvious place that can change.
Charlie Martin
@Charlie: Fair enough. Either way, I've decided to get rid of the singletons.
e.James
+1  A: 

Miško Hevery has a nice article series on testability, among other things the singleton, where he isn't only talking about the problems, but also how you might solve it (see 'Fixing the flaw').

roe
+2  A: 

Regarding your inflated constructor call problem, you could introduce parameter classes or factory methods to leverage this problem for you.

A parameter class moves some of the parameter data to it's own class, e.g. like this:

var parameterClass1 = new MenuParameter(menuBar, editor);
var parameterClass2 = new StuffParameters(sasquatch, ...);

var ctrl = new MyControllerClass(managedStore, parameterClass1, parameterClass2);

It sort of just moves the problem elsewhere though. You might want to housekeep your constructor instead. Only keep parameters that are important when constructing/initiating the class in question and do the rest with getter/setter methods (or properties if you're doing .NET).

A factory method is a method that creates all instances you need of a class and have the benefit of encapsulating creation of the said objects. They are also quite easy to refactor towards from Singleton, because they're similar to getInstance methods that you see in Singleton patterns. Say we have the following non-threadsafe simple singleton example:

// The Rather Unfortunate Singleton Class
public class SingletonStore {
    private static SingletonStore _singleton
        = new MyUnfortunateSingleton();

    private SingletonStore() {
        // Do some privatised constructing in here...
    }

    public static SingletonStore getInstance() {
        return _singleton;
    }  

    // Some methods and stuff to be down here
}

// Usage: 
// var singleInstanceOfStore = SingletonStore.getInstance();

It is easy to refactor this towards a factory method. The solution is to remove the static reference:

public class StoreWithFactory {

    public StoreWithFactory() {
        // If the constructor is private or public doesn't matter
        // unless you do TDD, in which you need to have a public 
        // constructor to create the object so you can test it.
    }

    // The method returning an instance of Singleton is now a
    // factory method. 
    public static StoreWithFactory getInstance() {
        return new StoreWithFactory(); 
    }
}

// Usage:
// var myStore = StoreWithFactory.getInstance();

Usage is still the same, but you're not bogged down with having a single instance. Naturally you would move this factory method to it's own class as the Store class shouldn't concern itself with creation of itself (and coincidentally follow the Single Responsibility Principle as an effect of moving the factory method out).

From here you have many choices, but I'll leave that as an exercise for yourself. It is easy to over-engineer (or overheat) on patterns here. My tip is to only apply a pattern when there is a need for it.

Spoike
+2  A: 

It's not the Singleton-ness that is the problem. It's fine to have an object that there will only ever be one instance of. The problem is the global access. Your classes that use Store should receive a Store instance in the constructor (or have a Store property / data member that can be set) and they can all receive the same instance. Store can even keep logic within it to ensure that only one instance is ever created.

Eddie Deyo
+1  A: 

I like to encourage the use of singletons where necessary while discouraging the use of the Singleton pattern. Note the difference in the case of the word. The singleton (lower case) is used wherever you only need one instance of something. It is created at the start of your program and is passed to the constructor of the classes that need it.

class Log
{
  void logmessage(...)
  { // do some stuff
  }
};

int main()
{
  Log log;

  // do some more stuff
}

class Database
{
  Log &_log;
  Database(Log &log) : _log(log) {}
  void Open(...)
  {
    _log.logmessage(whatever);
  }
};

Using a singleton gives all of the capabilities of the Singleton anti-pattern but it makes your code more easily extensible, and it makes it testable (in the sense of the word defined in the Google testing blog). For example, we may decide that we need the ability to log to a web-service at some times as well, using the singleton we can easily do that without significant changes to the code.

By comparison, the Singleton pattern is another name for a global variable. It is never used in production code.

1800 INFORMATION
+1  A: 

There's nothing wrong with using a global or a singleton in your program. Don't let anyone get dogmatic on you about that kind of crap. Rules and patterns are nice rules of thumb. But in the end it's your project and you should make your own judgments about how to handle situations involving global data.

Unrestrained use of globals is bad news. But as long as you are diligent, they aren't going to kill your project. Some objects in a system deserve to be singleton. The standard input and outputs. Your log system. In a game, your graphics, sound, and input subsystems, as well as the database of game entities. In a GUI, your window and major panel components. Your configuration data, your plugin manager, your web server data. All these things are more or less inherently global to your application. I think your Store class would pass for it as well.

It's clear what the cost of using globals is. Any part of your application could be modifying it. Tracking down bugs is hard when every line of code is a suspect in the investigation.

But what about the cost of NOT using globals? Like everything else in programming, it's a trade off. If you avoid using globals, you end up having to pass those stateful objects as function parameters. Alternatively, you can pass them to a constructor and save them as a member variable. When you have multiple such objects, the situation worsens. You are now threading your state. In some cases, this isn't a problem. If you know only two or three functions need to handle that stateful Store object, it's the better solution.

But in practice, that's not always the case. If every part of your app touches your Store, you will be threading it to a dozen functions. On top of that, some of those functions may have complicated business logic. When you break that business logic up with helper functions, you have to -- thread your state some more! Say for instance you realize that a deeply nested function needs some configuration data from the Store object. Suddenly, you have to edit 3 or 4 function declarations to include that store parameter. Then you have to go back and add the store as an actual parameter to everywhere one of those functions is called. It may be that the only use a function has for a Store is to pass it to some subfunction that needs it.

Patterns are just rules of thumb. Do you always use your turn signals before making a lane change in your car? If you're the average person, you'll usually follow the rule, but if you are driving at 4am on an empty high way, who gives a crap, right? Sometimes it'll bite you in the butt, but that's a managed risk.

Tac-Tics
+1 for your comment about singletons and globals having their place. I've since decided to still use them in a couple of places where they make sense. Not the store, but definitely in some of the top-level user interface classes.
e.James
That being said, I don't agree with your turn signal analogy. I have trained myself to treat all such driving-related operations as reflex. If the vehicle is going to turn, I use the signal. This leaves my brain free to think about critical driving decisions without having to count the number of vehicles behind me before making a simple flip of a switch.
e.James