Hello everybody,

Again I've done my best to produce a relevant and comprehensive
requirements document for a component idea: FrameworkTools.

Enjoy your reading!
Please feel free to submit feedback!

Regards, James.

eZ Component: FrameworkTools, Requirements
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Author: James Pic
:Revision: $Revision$
:Date: $Date$

Target and scope
================

The scope of this document is to describe the requirements for a component
providing classes to implement a SoftwareFramework_ architecture to develop
data-driven applications.
This document does not describe the design of the named component, but only
summarizes the requirements for it to be discussed on the developer mailing
list.  Where suitable, design related topics will be touched, but a
dedicated
design document is available, defining APIs, classes and the architectural
structure of the component.

Note that if you don't understand a term, you should have a look at the
section `Clarification of terms`_.

Introduction
============

The goal of FrameworkTols component is to give users a basis for such
architectures for web applications written in PHP 5.

The compononent shall not provide a fully featured implementation of a
SoftwareFramework_, but should help users to easily create their own,
custom implementations.

There are two ways to develop a SoftwareFramework_.

Way 0: Develop and factorize
----------------------------

Develop an application, factorize into re-usable libraries (Django).

In this case, power users can be rapidely confronted to limitations such as
lack of factorization, and the need to either:

- do the decoupling himself and patch the framework, maintain his branch
until
  the patches are accepted upstream, if ever.
- re-invent what is already implemented in a "contrib" application.

The need for BC break is also encountered when updating the framework with
this kind of process.

FrameworkTools should make it possible for the user to maintain a framework
without causing any BC breaks.

Way 1: Study needs and implement
--------------------------------

A correct study of the needs allow to implement the SoftwareFramework_ with
proper object-oriented design in the first place.

There should not be any factorisation left to do, BC breaks are then
optionnal.

The need
--------

Data driven applications
````````````````````````

Java is still in the hype for most projects that are valuable to software
developers, design patterns like `Naked Objects`_ allow to build a data
driven
application with high overhead but low cost.

There is currently no PHP implementations of `Naked Objects`_ design
pattern.

Flexible data structures
````````````````````````

eZ Publish currently solves this problematic, but there is no loosly coupled
component that allows it.

The strength of DatabaseSchema_ and PersistentObject_ components is
demonstrated when implementing a data structure for a agilely designed
application.

The experience shows that in most cases:

- a quote must be done before being supplied with detailled data structures
- it is very hard for the client to allocate budget for the software
engineer
  to come on site and detail the data structure
- it is very hard to have a detailled data structure anyway!

eZ Components does not yet provide a library to design the data structure
once
and only once. Developping generic frameworks providing a generic CRUD_
controller require loading both the DatabaseSchema_ and PersistentObject_
components:

- DatabaseSchema_ provides complete informations about fields,
- PersistentObject_ provides complete informations about objects and
  relations.

Three solutions are possible:

- Embed the fields informations in PersistentObject_, deriving from its
  original requirements, making it able to replace DatabaseSchema_ with high
  overhead.
- Embed the relations informations in DatabaseSchema_, but then
  PersistentObject_ would still be needed or else arrays and arrays of
arrays
  would have to be dealt with.
- Use a third component to define the complete data structure: fields and
  relations at once. Provide tieins to generate definitions not only for
  DatabaseSchema_ and PersistentObject_, but also other components like
  UserInput_ or Workflow_.

Component integration
=====================

eZ Components already provide some components that are useful when
implementing a SoftwareFramework_. However, one basic goal of eZ Components
is to keep each component as independent as possible and to realize
dependencies through so-called tie-in components. Therefore the mechanisms
realized in an SoftwareFramework component should be that far abstracted,
that other components can be tied in and provide only very basic
implementations on its own. This also allows users to implement their own
mechanisms. The following components have been identified as possible
tie-ins:

- PersistentObject_ (models)
- DatabaseSchema_ (models)
- Workflow_ (crud controller)
- MvcTools_ (user interface)
- UserInput_ (controllers)

.. _PersistentObject:
http://ezcomponents.org/docs/tutorials/PersistentObject
.. _DatabaseSchema: http://ezcomponents.org/docs/tutorials/DatabaseSchema
.. _MvcTools: http://ezcomponents.org/docs/tutorials/MvcTools
.. _UserInput: http://ezcomponents.org/docs/tutorials/UserInput
.. _Workflow: http://ezcomponents.org/docs/tutorials/Workflow

For each of these components a tie-in component could considered to be
implemented at a later stage. This should be kept in mind when designing the
classes/interfaces for the FrameworkTools component.

Design requirements
===================

This section summarizes the requirements.

No dependencies
  Allowing users to define a data structure OAOO_, without coupling with
  anythdng such as an ORM_, a DBAL_, an MVC_ implementation, a UI_ component
  ...
  This requirement is default to eZ Components coding standarts.

Definitions consistency
  Definitions of data structures should be possible, but optionnal.

State and data structure definitions together
  Developing re-usable, data-structure independant libraries requires to
work
  with the data structure definition, as well as the object bound to a
state.

Tracking definitions
  An application's collection of data structure definitions should be
  accessible by the generic library part of the user implemented framework.

Tracking objects states
  User's selected ORM may or may not implement an identity map. The
component
  should implement an identity map for objects that are bound to a state but
  which business logic is not part of the ORM. This is not only to allow
  document-based databases, but also to allow making objects which states do
  not need to be saved in a database.

One level higher than php variable types
  The user should be able to define data structure field types that are not
as
  simple as a php variable type (example: email field, url field ...).

Special Considerations
======================

Data structure definitions should be serializable and with an exportable
state: to save data structures in a database instead of some configuration
file. This can be usefull for eZ Publish.

We should keep testing capabilities for the extensions to this component and
the applications build upon it in mind during the design and implementation
phase.

We cannot provide the testing environment itself:

- Does not fit into the component
- Our test "component" is not an official component and can only be used to
  test eZ Components themselves.

However, we could provide detailed information and possibly some helper
classes for the testing of applications build on this component.

In addition, this component should neither provide any automation facilities
(e.g. code generation, deployment) nor integration with components that are
not explicitly needed by it (e.g. Configuration, Authentication or
Database).
Integration with such components could:

- Be build using a tie-in
- Be part of a potential "Framework" component/package stuff that might be
  created in future.

Clarification of terms
======================

.. _MVC: http://en.wikipedia.org/wiki/Model-view-controller
.. _UI: http://en.wikipedia.org/wiki/UI
.. _ORM: http://en.wikipedia.org/wiki/Object-relational_mapping
.. _DBAL: http://en.wikipedia.org/wiki/DBAL
.. _Naked Objects: http://en.wikipedia.org/wiki/Naked_objects
.. _CRUD: http://en.wikipedia.org/wiki/Create,_read,_update_and_delete
.. _OAOO: http://en.wikipedia.org/wiki/Once_and_only_once
.. _SoftwareFramemork: http://en.wikipedia.org/wiki/Software_Framework
-- 
Components mailing list
Components@lists.ez.no
http://lists.ez.no/mailman/listinfo/components

Reply via email to