God object


In object-oriented programming, a god object is an object that references a large number of distinct types, has too many unrelated or uncategorized methods, or some combination of both. The god object is an example of an anti-pattern and a code smell.

Characteristics

A common programming technique is to separate a large problem into several smaller problems and create solutions for each of them. Once the smaller problems are solved, the big problem as a whole has been solved. Therefore a given object for a small problem only needs to know about itself. Likewise, there is only one set of problems an object needs to solve: its own problems. This also follows the single-responsibility principle.
In contrast, a program that employs a god object does not follow this approach. Most of such a program's overall functionality is coded into a single "all-knowing" object, which maintains most of the information about the entire program, and also provides most of the methods for manipulating this data. Because this object holds so much data and requires so many methods, its role in the program becomes god-like. Instead of program objects communicating among themselves directly, the other objects within the program rely on the single god object for most of their information and interaction. Since this object is tightly coupled to so much of the other code, maintenance becomes more difficult than it would be in a more evenly divided programming design. Changes made to the object for the benefit of one routine can have a ripple effect on other unrelated functions.
A god object is the object-oriented analogue of failing to use subroutines in procedural programming languages, or of using far too many global variables to store state information.
Whereas creating a god object is typically considered bad programming practice, this technique is occasionally used for tight programming environments, where the performance increase and centralization of control are more important than maintainability and programming elegance.

Example

The class GameManager in this C++ example can be seen as a "god object", doing everything from managing players, handling game logic, rendering, reading input and file I/O.

  1. include
  2. include
  3. include
using namespace std;
  1. define custom_print
class GameManager ;
private:
vector players;
public:
PlayerManager = default;
void addPlayer
void listPlayers const
private:
int score = 0;
bool isRunning = false;
public:
GameLogic = default;
void startGame
void updateGame
void endGame
bool isGameRunning const
int getScore const
public:
Renderer = default;
void draw
private:
GameLogic& logic;
public:
InputHandler : logic
void handleInput
public:
SaveSystem = default;
void saveGame
void loadGame
PlayerManager playerManager;
GameLogic logic;
Renderer renderer;
InputHandler inputHandler; // Create InputHandler with reference to GameLogic
logic.startGame;
string commands;
while )
return 0;