views:

210

answers:

1

This is more of a design question than a C++ question.

I'm working on a Texas Hold'Em poker game in C++. So far, I have a HandChecker module written that is responsible for determining a player's best hand given his hole cards and the community cards. I decided to move this out into a separate HandChecker project. HandChecker depends on the Hand and Card classes that I have written in the main project though. In its current state, it requires a circular dependency between the main project and the HandChecker project.

What's the best way to structure this project? Should I move the Hand and Card classes into its own separate project?

+1  A: 

If Hand and HandChecker depend on each other, then moving Hand to a different project won't make any difference. Your options are:

  • Remove the circular dependency. I can't tell you exactly how to do this, but examine the two classes to see where they call each other and ask yourself why they work the way they do. Can you move a bit of functionality from one class to the other to ensure any remaining dependencies are uni-directional? Can you introduce a third class that they both depend upon? Can you introduce an abstract base class for HandChecker so that the compile-time dependency on its concrete implementation is broken?

  • Removing the dependencies is the best approach, but you also may not need to make them into separate projects in the first place. Separate projects are useful for splitting a logical chunk of code (e.g. an XML reader) off from the main project (a poker game) to make a re-usable library (that can also be used in (e.g.) your accounts administration app). HandChecker and Hand sound fundamentally related (neither is of much use without the other), so perhaps they should be in the same project. The only time you might need to make them separate projects is if you want to be able to plug in different HandCheckers to create different card games - in which case you probably need an abstract base class.

Jason Williams