From: John Carter on
Ever had a problem of two classes / frameworks/ packages / systems....
that have to be coupled in someway.

Info has to pass between the two.

So the obvious gets done and one side or the other gets to use a rich fat
object from the the other side. And WOW! Oh the PAIN! The two sides are
now deeply and horribly coupled by all the things that rich fat object
depends upon.

Often you can't even compile the ruddy thing!

At that point some bright soul steps forward and says, its the problem of
having the rich fat object. Reduce the information to a simple neutral
format like a number, string, a CSV file an XML file and we're done.

Grreat. Now we're making fast progress. We can unit test we can validate
the xml we can do Good Things. That worked, we decoupled the two systems.

Did we?

Then why during the maintenance phase do we have all kinds of issues
relating ...
* Semantics - (What exactly did that field mean again?)
* Currency - (You changed something? Why didn't you tell us?)
* Encapsulation - (You added something, I don't care why, it broke my
stuff. Pull it out!)
* Duplication - Why are we writing this data encoder / decoder stream
twice?

Oh dear. Maybe a neutral format wasn't so good after all.

Perhaps we needed a middle ground. A slim interface object that just
carried, owned and understood the data required. Maybe the Rich Smart
object should use/hold/reference one of these to it's version of the info.

We've lost something now. The pretty human readable text view. The ability
to time wise decouple things by having the XML on disk. No problem, let
the small slim interface object (de)?serialize itself using CSV/XML/....

ie. Neutral Interface Formats aren't Naked. They have Invariants, they
have life cycles, they ownership, upgrade and maintenance issues. They
should be small standalone, very few dependencies, very reusable
objects/components in their own right.

--


John Carter Phone : (64)(3) 358 6639
Tait Electronics Fax : (64)(3) 359 4632
PO Box 1645 Christchurch Email : john.carter(a)tait.co.nz
New Zealand


From: Nick Malik [Microsoft] on
Good observations, John. I agree that the data binding between two
frameworks should be
- managed
- versioned
- declared

In the messaging world, this concept is well understood to be true. I
believe you are talking about the OO world of API calls, right? If so, I
agree that the same concept should be emphasized in that space as well.

Question: does the Data Transfer Object pattern cover sufficient portions of
your concerns to be a good starting place for describing the solution?

--
--- Nick Malik [Microsoft]
MCSD, CFPS, Certified Scrummaster
http://blogs.msdn.com/nickmalik

Disclaimer: Opinions expressed in this forum are my own, and not
representative of my employer.
I do not answer questions on behalf of my employer. I'm just a
programmer helping programmers.
--
"John Carter" <john.carter(a)tait.co.nz> wrote in message
news:pan.2007.02.18.22.14.49.835236(a)tait.co.nz...
> Ever had a problem of two classes / frameworks/ packages / systems....
> that have to be coupled in someway.
>
> Info has to pass between the two.
>
> So the obvious gets done and one side or the other gets to use a rich fat
> object from the the other side. And WOW! Oh the PAIN! The two sides are
> now deeply and horribly coupled by all the things that rich fat object
> depends upon.
>
> Often you can't even compile the ruddy thing!
>
> At that point some bright soul steps forward and says, its the problem of
> having the rich fat object. Reduce the information to a simple neutral
> format like a number, string, a CSV file an XML file and we're done.
>
> Grreat. Now we're making fast progress. We can unit test we can validate
> the xml we can do Good Things. That worked, we decoupled the two systems.
>
> Did we?
>
> Then why during the maintenance phase do we have all kinds of issues
> relating ...
> * Semantics - (What exactly did that field mean again?)
> * Currency - (You changed something? Why didn't you tell us?)
> * Encapsulation - (You added something, I don't care why, it broke my
> stuff. Pull it out!)
> * Duplication - Why are we writing this data encoder / decoder stream
> twice?
>
> Oh dear. Maybe a neutral format wasn't so good after all.
>
> Perhaps we needed a middle ground. A slim interface object that just
> carried, owned and understood the data required. Maybe the Rich Smart
> object should use/hold/reference one of these to it's version of the info.
>
> We've lost something now. The pretty human readable text view. The ability
> to time wise decouple things by having the XML on disk. No problem, let
> the small slim interface object (de)?serialize itself using CSV/XML/....
>
> ie. Neutral Interface Formats aren't Naked. They have Invariants, they
> have life cycles, they ownership, upgrade and maintenance issues. They
> should be small standalone, very few dependencies, very reusable
> objects/components in their own right.
>
> --
>
>
> John Carter Phone : (64)(3) 358 6639
> Tait Electronics Fax : (64)(3) 359 4632
> PO Box 1645 Christchurch Email : john.carter(a)tait.co.nz
> New Zealand
>
>


From: H. S. Lahman on
Responding to Carter...

> Ever had a problem of two classes / frameworks/ packages / systems....
> that have to be coupled in someway.
>
> Info has to pass between the two.
>
> So the obvious gets done and one side or the other gets to use a rich fat
> object from the the other side. And WOW! Oh the PAIN! The two sides are
> now deeply and horribly coupled by all the things that rich fat object
> depends upon.
>
> Often you can't even compile the ruddy thing!

Right. Don't Do That. Object references totally trash encapsulation
because the object exposes part of the sending subsystem's
implementation. (There wouldn't be a reference to pass if the object
wasn't needed to implement the sender subsystem.) There are potentially
unlimited and unexpected side effects for both sender and receiver.

> At that point some bright soul steps forward and says, its the problem of
> having the rich fat object. Reduce the information to a simple neutral
> format like a number, string, a CSV file an XML file and we're done.
>
> Grreat. Now we're making fast progress. We can unit test we can validate
> the xml we can do Good Things. That worked, we decoupled the two systems.
>
> Did we?

That depends. The mechanics (e.g., XML) are not very important compared
to using a pure message paradigm: {message ID, <by-value data packet>}.
That greatly reduces the coupling. But there is no way to eliminate it
completely. There is going to be coupling any time information is
passed. [Among other things there is an inherent timeliness issue: is
the data still valid by the time the receiver processes it? It may not
be if the subsystem interface serializes through a queue.]

>
> Then why during the maintenance phase do we have all kinds of issues
> relating ...
> * Semantics - (What exactly did that field mean again?)

Both sides interpret the message in terms of their own context. To do
that both sides must share the definition of the message itself. That
definition defines the semantics of the just the data packet. Thus
field 3 in the message is a voltage in millivolts expressed as a double
precision floating point number. But the sender may interpret that as a
"pin 5 bias" while the receiver may interpret it as an "channel 16 offset".

IOW, there is a difference between the semantics of the message and the
semantics of the subsystem subject matter. At some point these views
still need to be coordinated so that the mapping between subsystem
subject matters through the message is correct. But that is a problem
for the developers of each subsystem when negotiating the interface.
That represents a solution level (Systems Engineering level, if you
will) coupling but at least it is very narrowly focused on the message
definition rather than what each side does with the information. IOW, it
is a lot easier to negotiate

sender semantics -> message semantics -> receiver semantics

than

sender semantics -> receiver semantics.

because the level of abstraction of the message is higher.

> * Currency - (You changed something? Why didn't you tell us?)

That is not a problem for the message definition. Rather it is a problem
for When the interface is invoked. Currency is, indeed, a level of
coupling that can go wrong even for a message with no data packet at
all. But it is also about as benign as coupling can be. One way to
classify the intimacy of coupling in ascending order is:

message w/o data packet. Currency is the only thing that can go wrong.
The sender can't be directly hurt and the receiver in unlikely to be
permanently hurt, but the receiver can spin wheels. [What the receiver
does is out of synch in the solution, but that was already true as soon
as the message was sent at the wrong time. IOW, the solution was out of
synch as soon as the sender sent the message.]

message w/ by-value data. Add the timeliness and consistency of the data
as something that can go wrong. The sender can't be directly hurt but
the receiver may produce incorrect results. Still pretty benign and
readily controllable.

message w/ data by reference. Add the fact that the receiver can modify
the data values the sender uses without the sender knowing or expecting
it (aka the Global Data Syndrome). This starts to get potentially nasty
because the data is part of the sender's implementation and
encapsulation has been broken.

message w/ behavior (e.g., Java applets). Now the applet can do
unexpected things to the receiver. That is, the sender can modify the
receiver in ways the receiver neither knows about nor expects. This is
really nasty, as any web security guru can testify.

message w/ object references. The worst because the receiver can trash
the sender's data and the behaviors can trash the receiver. In addition
the receiver has access to /all/ of the object properties, not just the
ones the sender expects to be accessed. A veritable Pandora's Box of
unlimited side effects for both sender and receiver.

<aside on the human condition>
We don't seem to learn from past mistakes. Decades ago there was a
language called Forth that essentially allowed the code to modify itself
as it was executing. Like FORTRAN's assigned GOTO, that was one of those
things that seemed like a good idea at the time but turned out to be a
Really Bad Idea. By the late '80s even suggesting using Forth was
grounds for summary dismissal in some shops. Yet within a few years that
hard-won lesson was lost and people started passing Java applets around
indiscriminately.

Similarly, back in the '50s and early '60s markup and scripting
languages were very popular. But by the early '70s they were largely
abandoned because of reliability and maintainability problems. But in
the late '80s they were reborn with a vengeance because interoperability
was needed and the Hardware Guys couldn't standardize things like endian.

So now we get to wonder (A) why we need a desktop today with more power
than a 1984 mainframe to run a spreadsheet that ran just fine on a
TRS-80 in 1984, (B) why the order entry forms on the web are always
breaking, and (C) why some OO applications are much more unreliable than
one would expect (i.e., those passing object references around).
</aside on the human condition>

> * Encapsulation - (You added something, I don't care why, it broke my
> stuff. Pull it out!)

To do that in a pure by-value message interface, one must change the
interface definition. That will usually result in rude comments by the
compiler if both sides aren't privy to it. So it is a problem but there
are pretty good safeguards available in the development process.

> * Duplication - Why are we writing this data encoder / decoder stream
> twice?

I'm afraid don't follow. The encode is done once on the sender side and
the decode is done once on the receiver side for each message.

If you mean that every message needs to be both encoded and decoded,
then that is the price of decoupling so that each side can map the
common message definition into its own semantics. The encode/decode is
essentially a mapping function from the local subject matter context to
the common message definition context. The encode/decode may be tedious
but it usually isn't rocket science. Better to provide semantics
mappings in a simple, mechanical way than in a complex, case-by-case way.


*************
There is nothing wrong with me that could
not be cured by a capful of Drano.

H. S. Lahman
hsl(a)pathfindermda.com
Pathfinder Solutions
http://www.pathfindermda.com
blog: http://pathfinderpeople.blogs.com/hslahman
"Model-Based Translation: The Next Step in Agile Development". Email
info(a)pathfindermda.com for your copy.
Pathfinder is hiring:
http://www.pathfindermda.com/about_us/careers_pos3.php.
(888)OOA-PATH



From: AndyW on
On Mon, 19 Feb 2007 11:14:53 +1300, John Carter
<john.carter(a)tait.co.nz> wrote:

>Ever had a problem of two classes / frameworks/ packages / systems....
>that have to be coupled in someway.
>
>Info has to pass between the two.
>
>So the obvious gets done and one side or the other gets to use a rich fat
>object from the the other side. And WOW! Oh the PAIN! The two sides are
>now deeply and horribly coupled by all the things that rich fat object
>depends upon.
>
>Often you can't even compile the ruddy thing!
>
>At that point some bright soul steps forward and says, its the problem of
>having the rich fat object. Reduce the information to a simple neutral
>format like a number, string, a CSV file an XML file and we're done.
>
>Grreat. Now we're making fast progress. We can unit test we can validate
>the xml we can do Good Things. That worked, we decoupled the two systems.
>
>Did we?
>
>Then why during the maintenance phase do we have all kinds of issues
>relating ...
> * Semantics - (What exactly did that field mean again?)
> * Currency - (You changed something? Why didn't you tell us?)
> * Encapsulation - (You added something, I don't care why, it broke my
> stuff. Pull it out!)
> * Duplication - Why are we writing this data encoder / decoder stream
> twice?
>
>Oh dear. Maybe a neutral format wasn't so good after all.
>
>Perhaps we needed a middle ground. A slim interface object that just
>carried, owned and understood the data required. Maybe the Rich Smart
>object should use/hold/reference one of these to it's version of the info.
>
>We've lost something now. The pretty human readable text view. The ability
>to time wise decouple things by having the XML on disk. No problem, let
>the small slim interface object (de)?serialize itself using CSV/XML/....
>
>ie. Neutral Interface Formats aren't Naked. They have Invariants, they
>have life cycles, they ownership, upgrade and maintenance issues. They
>should be small standalone, very few dependencies, very reusable
>objects/components in their own right.

I might suggest that when I have two systems that need joining
together I will normall use a middleware package (such as CORBA) that
is designed for supporting disparate systems.
----------------
AndyW,
Mercenary Software Developer