First of all, you can read many posts on why singletons are bad, for example this. There are many more with lots of valid points on why this pattern in most cases isn't really useful.
As for your refactoring: the best way is to go step by step. Large revolutions usually create bugs. From my experience, dismantling a god-object isn't very hard.
You can proceed as follows:
- identify a small responsibility you'd like to extract from the god-object
- design a new interface for this responsibility:
- start writing unit-tests for the new class implementing this new interface. Make tests passing by an instance of the god-object enclosed in the new object, and just forward the calls
- having a set of unit-tests you can cut-out pieces of code from the god-object into the new object
The next step is to replace all uses of god-object class with the new interface in the context of the new responsibility, and then do it again.
If you have some state that needs to be used/handled by these responsibilities (like the World
instance in your example), then you will have to make it shared. You can convert it to a shared_ptr
for example, so it will be possible to leave it in the god-object for the course of the refactoring, and also use it in new classes.