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? 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? This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
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...
|
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...
|
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...
|
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...
|
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...
|
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...
|
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...
|
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...
|
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...
|
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,...
|
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...
|
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...
|
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...
|
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...
|
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...
|
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)...
|
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....
|
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
|
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...
| |