Is there a way to avoid circular dependencies, other than mixing modules, in a arrangement like this(it is a chess application)
Long description:
- There is the
Guimodule which imports aChessWidgetmodule; ChessWidgetjust wraps theChessWorldmodule and importsCellButton;- The
CellButtonmodule imports the moduleCell; - The
ChessWorldmodule importsBoard(to represent it) andPlayers(to notify them and fetch their moves); - The
Boardmodule imports modulePiece; - The
Piecemodule imports modulePlayer;
AND HERE IS THE PROBLEM:
The Player module needs to know about other players and the board, thus importing ChessWorld!
Short description:
The World module needs to know about the Player module (even indirectly by Board/Piece) and Player need to know about World.
Help is very appreciated.
PS: Is not because I cant use circular dependencies, but because they are evil.
Follow the Dependency inversion principle: introduce an interface, which
ChessWorldimplements, and on whichPlayerdepends — and/or one whichPlayerimplements and on whichPiecedepends (either or both may be appropriate depending on details on the nature of the dependency). This often goes together with Dependency Injection, and, if the dependant needs to dynamically instantiate a number of instance of the dependees, with Factory DPs.