blob: 96fcb5fd8860026024eb9109af4e250ccb4945b0 [file] [log] [blame]
///////////////////////////////////////////////////////////////
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
///////////////////////////////////////////////////////////////
[[introduction-background,Background]]
= Background =
Zest™ is the first Composite Oriented Programming implementation leveraging the Java 5 platform, so that everything you
know from Java 5 still applies. You can mix Zest™ with your ordinary Java code as much as you want. All your existing
Java tools works just like before, and Zest™ does not introduce any new programming language, no special development
tools needed and no XML is required.
== Purpose ==
Zest™ addresses the programming problems from the top-down, starting with the Domain Model and Business Rules needs,
and let those requirements flow downwards in the software stack and dictate the requirements for underlying layers
such as persistence, messaging, querying and more. This means that the business value developer is left to
concentrate on the domain models and the actual application bringing the value, instead of creating massive amounts
of glue code to tie underlying technologies together.
== Problem Descriptions ==
Zest™ didn't appear out of the blue, when the founders of the project had nothing better to do. It is the result of
observation of problems in real applications, and the experience from previous attempts to address or correct these
problems, that has led to the Zest™ vision.
== Object Oriented Programming (OOP) ==
How can OOP be a problem? We and others have observed that there is a fundamental flaw in the OOP model. In fact, we
would like to even state that OOP as it is commonly practiced today is not object oriented at all. The object is not
the primary citizen, instead the class is the primary artifact. In most mainstream OOP languages, Objects are derived
from classes, not that classes are assigned to created objects. Therefore, we think it should have been called Class
Oriented Programming. We can also see this class focus in many of the technologies in Java today: in Spring you declare
class names in application contexts, JSP uses class names to declare beans and so forth.
This in turn leads to that there is no good OOP solution for the problem we describe below.
== Behavior depends on Context ==
Once you start thinking of "Behavior depends on Context", you have a hard time understanding how people for the last 20
years or so of Object Oriented Programming (OOP) has ignored this fact.
=== Who am I? ===
When I sitting in front of the computer, I am a software developer, but if I go out in the jungle, I am suddenly
hunter-gatherer and prey. A large set of me is the same, but my interaction with the surroundings, i.e. the context, is
very different. I need different interfaces, so to speak, in these two different contexts.
Now, the above example is perhaps a bit extreme, but we see it in everyday life of the developer. When an object is
stored in the database it is of a different class, than when it is transported to the client and possibly when it is
displayed in the GUI. We see the effect of this problem in many of the design patterns and so called "best practices"
in Java EE development. Facades, delegation, data transport objects and many more.
== Coupling ==
The OOP proponents once proclaimed that classes can be re-used, since the code is encapsulated with the class, so the
class is an independent unit which lends itself well to re-use. In reality, however, we have found that classes becomes
tightly coupled with many other classes in their neighborhood, leading to impossibilities of single class re-use. Many
tricks are introduced to minimize the "Coupling Hell", such as Inversion of Control and Dependency Injection. Although
those tools are good, the underlying problem remains.
Why do we end up with large coupled class network graphs?
Essentially, it boils down to "scope". Classes are too large, their scope is too large, and for each small functional
unit within the class, there will be additional coupling to other classes. And this often progresses to the full
boundary of the entire domain the class remains in.
== Application layer impedance mismatch ==
Almost all technologies used in modern software development, starts by looking at an infrastructural problem and try to
solve that the best way. This is often done in a vacuum and layers on top will be struggling to map or translate the
solution into the higher abstraction, and the higher up we get, the harder it becomes to ignore the assumptions,
problems and limitations of the underlying technologies. It is also common that the underlying technologies "bleeds"
through the layers all the way into the domain models. The "bleed" combined with the problem of using independently
developed technologies, puts a large burden on the application developer, whose job it is to bring business value. And
often, the most skilled developers end up doing the bottom layers, leaving the hardest job to the least suitable.
Another interesting consequence is that each layer needs to anticipate every single use-case - real, potential or
perceived - and deal with it in a specifiable and useful manner. This leads to overly complex solutions, compared to if
the system is built from the top layer down, where each layer beneath knows exactly what is expected from it, and only
needs to handle those use-cases.
== Abstracting away meaning. ==
To paraphrase a famous proverb about a hammer: "If all you have are objects, everything looks like a dependency."
We think that increasing abstraction often also increases complexity, and that the abstraction benefits are somewhat
linear whereas the complexity negatives are exponential. So, our conclusion is that by making no distinction between
different kinds of objects, many sound technologies run into incredibly difficult problems. The implementation of the
programming platform (e.g. Java) is of course easier to implement with a hefty amount of scope reduction into as few as
possible abstractions. But that is not the situation for the user. The abstraction is then required to be reversed when
the rubber hits the road, e.g. ORM mapping must be declared explicitly by the programmer, often using separate tools
and languages.
== Solution ==
We think the solution was expressed more than 2500 years ago, first by Indian scholars and slightly later by Leucippus
and Democritus. We are of course talking about atoms, and by using really small building blocks, we can express
arbitrarily complex structures.
By reducing the classes into what we in Composite Oriented Programming call Fragments, we limit the coupling network
graph substantially. Re-use of Fragments becomes a reality, and by combination of Fragments, we compose larger
structures, the Composites.
== Composition ==
Composite Oriented Programming also view the object, we call it the Composite instance, as the first class citizen. The
Composite instance can be cast to any context, meaning a different behavior can be applied to the Composite instance,
without affecting its underlying state. And back. This in turn means that we can for instance create a
ServerContextualInvoiceEntity, transport that across to a client, cast it to a GuiContextualInvoiceEntity do the
modifications to the underlying state, possibly using extra interfaces and methods for interacting with the GUI
environment, and then transport the modified object back to the server, cast it back to the
ServerContextualInvoiceEntity, and then persist the changes.
== Domain Driven Design focus ==
Composite Oriented Programming is heavily influenced by the book "Domain Driven Design" by Eric Evans. And we are
trying to use his analysis of the problem to provide the mechanisms needed to get the job done quicker and more
reliably. Mr Evans talks about Applications, Layers, Modules, Specifications, SideEffects and so forth, and all of
these should be present in a Composite Oriented Programming implementation, and to a large extent it is in Zest™.