luni, octombrie 08, 2007

Compozitie fizica

Principalul aspect al arhitecturii il reprezinta decompozitia: impartirea intregului in parti constituente. Aceste parti pot fi fizice sau logice(conceptuale). Incercam sa le enumeram pe cele fizice si mai apoi pe cele logice specificand legaturile dintre ele.

Prin componente fizice se inteleg acele elemente de compozitie care au o reprezentare fizica (in general elemente induse de un limbaj de programare care au o reprezentare in file system). Enumerate de la complex la simplu ele sunt:
  1. Aplicatie enterprise (.ear)
  2. Modul (module .jar, .war, etc – unitate de deployment)
  3. Pachet (package – ierarhie de directoare in file system)
  4. Unitate de compilare (compilation unit - fisier)
  5. Tip (type)

In sine ele au relevanta si prezenta fizica in unul din timpii proiectului: compile, runtime, configuration time, etc.

Aplicatie enterprise
Un astfel de element de arhitectura apare numai in cazul unei aplicatii construite conform J2EE (serverul de aplicatii are container de EJB-uri) - altfel este indeajuns un modul web.
Impartirea pe aplicatii a sistemului se realizeaza pe criterii de business si de executie in runtime (serverul de aplicatii).
O aplicatie enterprise este alcatuita din mai multe module – jar, war, ejb, etc conform specificatiei J2EE – aceste module sunt descrise intr-un fisier de configureare conform J2EE.
Daca sunt mai multe aplicatii care alcatuiesc un singur sistem, acestea se integreaza prin puncte stabile de acces: expunere de API-uri (interfete, DTO-uri, exceptii) eventual URL-uri stabile (REST) si in cel mai nefavorabil caz prin baza de date (expunere de view-uri).
Securitatea este gestionata de serverul de aplicatii impreuna cu celelalte servicii de middleware si poate fi partajata intre toate aplicatiile sistemului printr-un sistem SSO.
Este de preferat ca plicatiile sa gestioneaza propria lor schema de baze de date (eventual un spatiu de nume dintr-o schema) si sa expuna API pentru integrare (expuneme de functionalitati spre exterior).
Pot expune interfete-serviciu pentru integrarea cu alte aplicatii din alte sisteme (cu care pot rula in acelasi JVM sau pe JVM-uri diferite).
Injectarea de implementari de servicii se face in runtime via JNDI (aplicatiile pot rula in acelas JVM sau JVM-uri diferite).


Modul
Reprezinta un element fizic reprezentat print-un .jar, .war, etc deploy-abil in runtime.
Un modul special este cel web (.war) care necesita un container de servleturi si JSP-uri pentru runtime si contine tipuri specifice: servlet, filtru si resurse specifice: JSP-uri, fisiere de configurare.
Impartirea pe module se realizeza in general pe criterii de deployment.
Un modul este alcatuit in edit time din mai multe pachete continand types (pot contine si resurse).
Modulele sunt generate din edit time de o unealta de build - Maven – pentru fiecare modul sursele si resursele sunt stocate in locatii diferite in file system.
In editare reprezita de asemenea subproiecte de Eclipse.
In general ele corespund in plan conceptual unui subsistem reprezintand intersectia intre un layer tehnologic si un vertical slice de business, dar pot contine un intreg layer sau un vertical slice.

Pachet
Reprezinta un element fizic al arhitecturii – o ierararhie de directoare in file system.
Un pachet cuprinde mai multe unitati de compilare care sunt la randul lor elemente fizice.
Conceptual este parte a unui subsistem. Mai multe pachete alcatuiesc un subsistem.
Impartirea pe pachete se realizeaza pe criterii de business si tehnologice.
In denumirea unui pachet se gaseste astfel cel putin numele unui subsistem + un nume specific din cele enumerate in continuare:
- managedbeans
reprezinta legatura intre layer-ul de prezentare si domeniu (corestund Action-urilor de Struts)
- services
sunt reprezentate de SLSB's
- domain
cuprinde entitatile necesare (si) in procesul de persistenta (EJB Entity Beans)
intre ele sunt relatii de asociere
nu au logica ci doar stare (domeniu anemic)
- dto
cuprinde obiecte folosite in transportul intre layerele alicatiei (numite si VO – Value Objects)
obiecte surogat, doar cu stare fara funtionalitate/logica
- exceptions
exceptii custom ale aplicatiei - de sistem sau de business

Unitate de compilare
O unitate de compilare cuprinde unul sau mai multe tipuri (unitatea de compilare = compilation unit este un fisier .java).
In Java orice unitate de compilare expune cel putin un tip public – trebuie sa aiba cel putin o definitie de tip पब्लिक.

Tip
Tipul = type reprezinta o definitie de clasa, interfata, enum, etc (prin type se intelege un tip de data referinta – variabile de tip referinta pointeaza in runtime spre o zona din memoria HEAP)
Un type este alcatuit din membri care pot fi
o metoda – logica/functionalitate
o field - stare
Un tip este incarcat de class loader in runtime.