You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by Simon Funnell <si...@googlemail.com> on 2009/11/17 17:41:25 UTC

Purity

Hi,

Thanks for the comments. I realise that what I am pointing out is not 
straight forward, but I think I do have some insight in how to achieve 
it. If I am really honest the current object orientated paradigm is 
flawed and this flaw propagates to all software based on certain 
principles espoused, ideally we want to be modelling the relationships 
between objects as opposed the objects themselves, then infer a given 
objects properties from its relationships, something that cannot be said 
of the inverse....but this is a little too deep. That type of thinking 
however has allowed me to look at the problem slightly differently.

Briefly, the framework I have been developing is aimed at users that 
require sophisticated combinations of services and features but have low 
levels of traffic. A typical user would be a small business professional 
with one physical machine hosted 24/7 that provides a 'virtual office' 
with website and email server, software components will share common 
business objects and all the usual. These professionals may recruit the 
services of various technical skills sets 
(artists,designers,developers,etc) from time to time who will need 
access to the things they are responsible for.  This means my focus is 
on manageability and integration instead of scalable capacity at 
present, but I hope to move to that in the future. My framework is not a 
lot different to other frameworks in principle but there are subtleties 
which distinguish it from others. Also, the terminology I have used to 
represent certain concepts is generally more descriptive of what it 
actually does in comparison to others, this makes it easy to understand 
for both new and more experienced users. Although I am happy with what I 
have so far the thing stopping me from finishing it is the component 
model. For instance, my framework could actually support James, but not 
in the way I would like. I am loath to start working on something when 
there are other frameworks that already do it very well. I have been 
influenced by a few other frameworks with Avalon being probably my first 
exposure to the idea of a framework many years ago. I guess I am at a 
critical design juncture and the perspective of others will be useful at 
present.

Anyway, I think it is generally fair to say that James is a component, 
composed of components that are composed of components and so on. 
Components generally have a life cycle and have relationships with other 
components. And that last bit is important, a component has 
relationships with other components. Usually, when initialising a 
component, a framework will be responsible for supplying other 
components that the component being initialised requires to operate. At 
a very low level, we take an object and put other objects inside of it. 
This is what needs to change (conceptually at least). Another way to 
look at it is that when we initialise a component, we do not pass it the 
other components it requires to operate, instead we pass in a set of 
relationships. This is very like the idea of an interface but slightly 
different.

That is a bit abstract so I will use the terminology from my design. In 
my framework, every component is a 'micro virtual machine' and 
applications/components are networks of these machines. When a component 
is initialised it is passed a network, or collection of network cards if 
you like, that represent the components the component being initialised 
requires to operate. This means the usual parent/child relationship 
between components exists but is virtual instead of real. Now, when a 
given component calls the method of a sub-component (virtually a child, 
but really a peer) it is actually sending a message to another component 
(method calls here are paths/expressions....). This now gives the 
framework an opportunity to intercept the before and after of the call 
and evaluate its properties for monitoring, applying security measures 
or other such things. This interception can be very fine grained and is 
completely transparent. In this way all components communicate in a 
uniform fashion and permit the emergence of self-organising systems (or 
if that's too much, having the ability to drop a component into a system 
and have it adopt the policies of the system without configuration(in 
principle)).

I haven't touched too much on implementation details because they are a 
few consequences of this design (which I think are great, but may not 
sit well with other programming habits). If you can really grasp what I 
am saying it is actually moving towards what I said right at the 
beginning, i.e. focusing a bit more on the relationships of objects 
rather than just the objects themselves. Object orientated paradigms are 
good for describing objects in abstract space, but are insufficient for 
describing the effects of time because the effects of time are inherited 
from the system within which an instance of the object manifests.

That is a summary of my approach and as you can probably tell it 
requires a very specific method of component design hence questioning 
its immediate practicality. That said, I still think it is worth solving 
the problem because its already halved solved and the benefits are 
obvious. I will leave it here to get some feed back, I do have more to 
say on the subject.

On a side note, if there is anything specific about the documentation 
you would like looking at, I can take a look and see if I can help. As I 
am using James at the moment so its operation is personally more 
important than its development (in that my current position requires 
it). In this way, if I can improve the documentation, this in turn will 
improve the user base and I will benefit from the impact of a broader 
community.

I hope you find this is of interest and look forward to any suggestions.

Regards,

Simon


















---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org