Forced Domain and Forced Paradigm Anti-Patterns
These two common (and usually overlooked) “anti-patterns” are frequently
followed by developers. Actually, I’m not sure if we can officially
call them anti-patterns, but they are for sure common patterns that are
not good to follow.
Let us explain what the symptoms are for each.
The Forced Domain occurs when a domain that is not the natural
one for the solution is forced into that solution. Here forcing means
using the foreign domain concepts and processes to solve the problem in a
usually unnatural way. The most common example is the IT domain forced
into business logic, user interface, user experience or any part of the
solution that needs to be in the business domain. For instance, when we
build software that presents data in tables, shows codes (data keys),
exposes the notion of next record, the notion of indexes or even the
notion of fields, we are forcing the database concepts to the client. To
use the software, the user needs to learn those concepts first. The
same happens for processes, when backups, initialization, remote calls
and such are forced to the user.
Another case is when we are integrating applications. Each solution we
integrate may have its own domain, and they may not be the same domain
as the other application we are integrating with. Integrated
applications should communicate in a lousily coupled manner. So, for one
solution to use the other one, both will need to share some common
business concepts and those should be only ones in between. For example,
a banking system that offers loans may need geographical information
about the land we are using as warrant. Forcing the banking system to
understand about geo locations, azimuths and GPS readings is a
non-sense. To obtain the needed information, the bank should request it
using business information it manages, like a particular address. It is
the job of the geographical system to convert that requirement data, in
the form of a text containing an address, into world’s longitude and
latitude pairs and convert the response’s information into readable data
for the bank.
Ok, that may raise a question: Isn’t that forcing the bank domain
information into the Geo-System? No, actually. The Geo-System is
probably offering that query as a service, which means it is decoupled
from the implementation, and using standard documents (which may even be
generic) to pass info. Note that the Geo-System will not get bank
specific information, just a street address.
Why is that Forced Domain a bad thing?
A domain is not just a set of concepts. It is also a very complex
environment that has processes that are natural in the environment,
working smoothly with the environment’s rules. The concepts fit and all
data is structured in a way that facilitates the processing. If not,
then the domain would not work. Think of a medical domain, in surgery,
where the concepts do not match or where the rules make the surgeon
juggle with tools not made for the job at hand. In the example, think of
a surgeon that is giving a fish knife to work with, and that is forced
to kill the fish before opening. The tasks of cleaning a fish would
sound similar to some of those performed by a surgeon, but it is clear
the final idea is different and that it is not a good idea to practice
surgery with a fish cleaning knife.
Domain forcing also produces coupling of a very special kind. In some
cases it will require application A to know about Application B to use
it, and in some others it will force Application B to know about A in
order for application A to use B! It is like teaching me mechanics so
the mechanic can fix my car by asking me car construction questions. In
collaboration contexts, our banking application is forced to store and
process geographical data because it needs those values to query the
geographical system.
The Forced paradigm anti-pattern is more related to development.
That is, when something is not done naturally as it should, but done my
way. A very common example occurs when the developer, coding a services
consumption client, uses an OO language. The service is usually defined
as a port to which we send messages in a pattern. To do that in Java,
for instance, we map the port and message idea to a method, defined in a
stub, which acts like a local class. Thus, the sending of a message
notion is lost. The developer sees the operation as just invoking a
method locally. There, we are forcing one paradigm into another; we are
forcing the method call operation into a message send operation. In Java
we are supposed to have objects and invoke methods, not send messages.
That is true, but then we should build an object that sends the message
for us, and we just invoke that functionality. Sounds the same, but
semantically it is not.
Is that bad too?
Of course it is. Forcing a paradigm causes impedance mismatch. It also
increases overhead due to paradigm conversions, and removes semantics
that would help the developer to create good performing code (like the
stubs, may trick developers to use the call as a local one, when it is
remote, and cause a bad performance). Actually, if you take a look at
the current specifications for Java, we may see there are many that map
the actual interface to objects following this antipattern, hiding away
the actual process from developers. That is done to make it “easy” for
them to use the API, but the resulting API would not be good enough.
Do you have any examples of these antipatterns? What is your take on how bad are they for your health?
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)




