OO design question (please help settle a dispute)

Miles123's Avatar, Join Date: Aug 2007
Newbie Member
OO design question (please help settle a dispute)
Please help me settle an argument that has been simmering for almost a week now at my workplace. I'm having a hard time convincing one of our product designers that there is a really basic design smell in our new product, so I thought I would throw this question out to the gurus and code Jedis populating these forums.

So the overview:

We have 2 singleton classes - an overall Application class and a MessageRouter class. The routing mechanism is accomplished through the use of Agent classes, this class is a base class from which we subclass multiple concrete Agent types. Agent objects must register with the router in order to be notified of state changes. Also, agent registration with the router will occur in multiple places inside the code - not just within Application.

On program startup, the original proposed architecture was as follows:

Proposal A:
Code:
Code:
Application::Initialize()
{
AgentSubclass foo = new AgentSublass()
foo->Initialize()
}

Agent::Initialize()
{
MessageRouter::Instance()->Register(this)
}
I personally did not agree with this design, and proposed the following change:
Proposal B:
Code:
Code:
Application::Initialize()
{
AgentSubclass foo = new AgentSublass()
foo->Initialize(MessageRouter::Instance())
}

Agent::Initialize(MessageRouter *pRt)
{
pRt->Register(this)
}
So to the world: which proposal is a better one in terms of OO Design and also given the fact that our group is committed to a TDD approach? I won't initially give my reasons for why I proposed B (I don't want to slant the discussion in my favor).

Thanks for the help.
0
shabbir's Avatar, Join Date: Jul 2004
Go4Expert Founder
I don't see anything different in the above 2 solutions apart from the fact that one is passing the Router and the other using the Singleton Class instance. Now as it looks like you have Singleton router and so its object passing is not at all needed ( Unless you have some interface and the Router will not be available directly to the Agent class in future ).

I would vote for proposal A