Leo Sutic wrote:
Ok, now with the actual problem at hand. The typesafe interface
would be handy, but I have to wonder *how* to practically use it.
The issue is that I want the same feel for both C++
as well as Java if that is how you are working with it.
I want to stay away from strings being the signal type, and if
possible, the class type
being the signal type.
if (a instanceof A) <--------> if (dynamic_cast<A> (a) != NULL)
Java C++
There are ways to solve this, with a switch/case construct. But I
want to get rid of the construct.
:/
Ideally, one would introduce a layer in front of the Sink, and one after
the Source, and by magic be able to write code like this:
class MyStage extends AbstractStageWrapper {
public void handleConnectionOpen (ConnectionOpenEvent event) {
...
}
public void handleConnectionClosed (ConnectionClosedEvent event) {
...
}
}
I see. In Java, this is pretty expensive. I can see how it would be
helpful, but you now would have to approach it like Swing does. There
are specific events a Swing Handler of a certain type can handle. An
extension of an EventHandler would be able to farm out those types of
events and encapsulate the switch/case logic in that EventHandler.
That would be the way to minimize the cost of creating a Method object,
and invoking it--done several hundred times a second, and now you are
thrashing your Garbage Collection.
In many cases, the switch/case would not only be sufficient, but preferred.
In other cases, the separate EventHandler that calls methods on the
Stage object would be better. For example:
class MyStage implements Stage, ConnectionHandler {
public void handleConnectionOpen( Connection conn ) { ... }
public void handleConnectionClosed( Connection conn ) { ... }
public void handleEvent( QueueElement event ) { ... }
}
class ConnectionDistributionHandler
{
private final ConnectionHandler m_target;
public ConnectionDistributionHandler( ConnectionHandler target )
{
m_target = target;
}
public void handleEvents( QueueElement[] events )
{
int len = events.length;
for (int i = 0; i < len; i++)
{
switch ( events[i].getType() )
{
case CONNECTION_OPEN:
m_target.handleConnectionOpen( (Connection)
events[i].getAttachment() );
break;
case CONNECTION_CLOSED:
m_target.handleConnectionClosed( (Connection)
events[i].getAttachment() );
break;
default:
m_target.handleEvent( events[i] );
}
}
}
}
Using reflection is pretty expensive for this type of thing.
Which, as I think about reflection, one actually can. Does anyone
know the performance penalty for dynamic invocation of methods,
as related to the expected time to run a typical SEDA event handler?
I just want to get rid of that cursed switch/nested if!
You would have to abstract it out to specific subsystems....
In C++ I think I could do it with some macros.
Summary: As far as the Queue interfaces go, go for it. I don't
think you can get them any better without trying to use them.
They have no apparent faults.
Just trying to wrap my head around the SEDA stuff and how to best
express the architecture in Java/C++. I want as direct a mapping
between the language and the concepts as possible, and I do not
think the current implementation of SEDA is that.
I think now is time to actually create the implementations of the
interfaces.
--
"They that give up essential liberty to obtain a little temporary safety
deserve neither liberty nor safety."
- Benjamin Franklin
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>