473,326 Members | 2,114 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,326 software developers and data experts.

Design question

I posted this a couple of hours ago, but it didn't show up on my server.
Apologies if you see this twice...

----------------------------------------------------------------------------

Say I have a system in which a central server is processing requests
for magazine subscriptions. There are two types of requests that
could come in - subscribe requests and unsubscribe requests. A
Thread is running that receives these incoming requests and puts
them in a queue, which the server software reads from.

The requests adhere to a very simple hierarchy:

public abstract class Request {
protected String originator;
}

public class SubscribeRequest extends Request {
// ...
}

public class UnsubscribeRequest extends Request {
// ...
}

So the RequestReceiver might look something like this:

public class RequestReceiver implements Runnable {
// ...
RequestQueue queue;

public void run () {

// A new request comes in.
Request newRequest;

// Instantiates newRequest as either a SubscribeRequest
// or an Unsubscribe request, depending on the data read.

this.queue.addRequest (newRequest);
}
}

Now, on the other end of things, the Server is reading from
this queue. Here's the tricky part.

As the Server reads from the RequestQueue, it needs to know
what kind of request its dealing with, so it can process it
either as a SubscribeRequest, or an UnsubscribeRequest. Now,
there are only two ways I can think of to do this, and neither
of them seem "right" to me.
1.

The first way would be to use "instanceof", like this:

// In the Server:
Request req = this.incomingRequestQueue.nextRequest ();
if (req instanceof SubscribeRequest)
this.handleSubscribeRequest ((SubscribeRequest) req);
else if (req instanceof UnsubscribeRequest)
this.handleUnsubscribeRequest ((UnsubscribeRequest) req);

I'm very averse to using "instanceof", and am not a big fan of
this solution. It seems to violate polymorphism principles to
me.
2.

The other way would be to define some constants in Request, like
this:

public abstract class Request {
public static final int SUBSCRIBE = 0;
public static final int UNSUBSCRIBE = 1;

protected int type;

public int getType () { return this.type; }

}

// In the Server:
Request req = this.incomingRequestQueue.nextRequest ();
switch (req.getType ()) {
case (Request.SUBSCRIBE):
this.handleSubscribeRequest ((SubscribeRequest) req);
break;
case (Request.UNSUBSCRIBE):
this.handleUnsubscribeRequest ((UnsubscribeRequest) req);

This works, but in this case, I would have to hard code knowledge
of all of the possible request types into the superclass, Request.
Superclasses are not supposed to know about their subclasses.

Method 1 allows me to introduce new types of Requests into the system
without having to change any code in the superclass, Request. But
method 2 reduces runtime errors by promoting catching them at compile
time, at the expense of needing to modify the superclass whenever a
new subclass is added.

So what would you do? What do you think is the correct approach here?
Is this a valid use of "instanceof," or can you think of another way
to do it?

Jul 17 '05 #1
1 1597
You could have the request itself handle the processing by creating an interface
with the method signature handleRequest() and have all your requests implement
it. When you get the requests off the queue, just call the method.

Request req = this.incomingRequestQueue.nextRequest();
req.handleRequest();

If you don't like having the implementation in the request itself you could put
in a strategy, although premature patterns are the root of all evil (or is that
optimization?). (:^)

Another option is to have a single request class and use the state pattern to
implement behaviour - but we're talking about plain old polymorphism there.

If this is off the mark we can discuss it more.

/qb

Kevin wrote:
I posted this a couple of hours ago, but it didn't show up on my server.
Apologies if you see this twice...

----------------------------------------------------------------------------
Say I have a system in which a central server is processing requests
for magazine subscriptions. There are two types of requests that
could come in - subscribe requests and unsubscribe requests. A
Thread is running that receives these incoming requests and puts
them in a queue, which the server software reads from.

The requests adhere to a very simple hierarchy:

public abstract class Request {
protected String originator;
}

public class SubscribeRequest extends Request {
// ...
}

public class UnsubscribeRequest extends Request {
// ...
}

So the RequestReceiver might look something like this:

public class RequestReceiver implements Runnable {
// ...
RequestQueue queue;

public void run () {

// A new request comes in.
Request newRequest;

// Instantiates newRequest as either a SubscribeRequest
// or an Unsubscribe request, depending on the data read.

this.queue.addRequest (newRequest);
}
}

Now, on the other end of things, the Server is reading from
this queue. Here's the tricky part.

As the Server reads from the RequestQueue, it needs to know
what kind of request its dealing with, so it can process it
either as a SubscribeRequest, or an UnsubscribeRequest. Now,
there are only two ways I can think of to do this, and neither
of them seem "right" to me.
1.

The first way would be to use "instanceof", like this:

// In the Server:
Request req = this.incomingRequestQueue.nextRequest ();
if (req instanceof SubscribeRequest)
this.handleSubscribeRequest ((SubscribeRequest) req);
else if (req instanceof UnsubscribeRequest)
this.handleUnsubscribeRequest ((UnsubscribeRequest) req);

I'm very averse to using "instanceof", and am not a big fan of
this solution. It seems to violate polymorphism principles to
me.
2.

The other way would be to define some constants in Request, like
this:

public abstract class Request {
public static final int SUBSCRIBE = 0;
public static final int UNSUBSCRIBE = 1;

protected int type;

public int getType () { return this.type; }

}

// In the Server:
Request req = this.incomingRequestQueue.nextRequest ();
switch (req.getType ()) {
case (Request.SUBSCRIBE):
this.handleSubscribeRequest ((SubscribeRequest) req);
break;
case (Request.UNSUBSCRIBE):
this.handleUnsubscribeRequest ((UnsubscribeRequest) req);

This works, but in this case, I would have to hard code knowledge
of all of the possible request types into the superclass, Request.
Superclasses are not supposed to know about their subclasses.

Method 1 allows me to introduce new types of Requests into the system
without having to change any code in the superclass, Request. But
method 2 reduces runtime errors by promoting catching them at compile
time, at the expense of needing to modify the superclass whenever a
new subclass is added.

So what would you do? What do you think is the correct approach here?
Is this a valid use of "instanceof," or can you think of another way
to do it?


Jul 17 '05 #2

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
by: Don Vaillancourt | last post by:
Hello all, Over the years as I design more database schemas the more I come up with patterns in database design. The more patterns I recognize the more I want to try to design some kind of...
9
by: sk | last post by:
I have an applicaton in which I collect data for different parameters for a set of devices. The data are entered into a single table, each set of name, value pairs time-stamped and associated with...
2
by: Test User | last post by:
Hi all, (please excuse the crosspost as I'm trying to reach as many people as possible) I am somewhat familiar with Access 2000, but my latest project has me stumped. So, I defer to you...
6
by: rodchar | last post by:
Hey all, I'm trying to understand Master/Detail concepts in VB.NET. If I do a data adapter fill for both customer and orders from Northwind where should that dataset live? What client is...
17
by: tshad | last post by:
Many (if not most) have said that code-behind is best if working in teams - which does seem logical. How do you deal with the flow of the work? I have someone who is good at designing, but...
17
by: roN | last post by:
Hi, I'm creating a Website with divs and i do have some troubles, to make it looking the same way in Firefox and IE (tested with IE7). I checked it with the e3c validator and it says: " This...
6
by: JoeC | last post by:
I have a question about designing objects and programming. What is the best way to design objects? Create objects debug them and later if you need some new features just use inhereitance. Often...
0
by: | last post by:
I have a question about spawning and displaying subordinate list controls within a list control. I'm also interested in feedback about the design of my search application. Lots of code is at the...
19
by: neelsmail | last post by:
Hi, I have been working on C++ for some time now, and I think I have a flair for design (which just might be only my imagination over- stretched.. :) ). So, I tried to find a design...
8
by: indrawati.yahya | last post by:
In a recent job interview, the interviewer asked me how I'd design classes for the following problem: let's consider a hypothetical firewall, which filters network packets by either IP address,...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
1
by: Shællîpôpï 09 | last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
0
by: af34tf | last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.