2010-09-30

Vreme je za Linux

Godinama ranije su izlazili tekstovi koji su se pitali da li je ovo godina
linux-a ili predviđali da će naredna to biti. I svi su omašili :) Iako
isključivo koristim linux već godinama mogu reći da je pitanje godine linux-a
stvar prošlosti. Linux je tu među nama i više nije nikakav stranac kog čekamo da
se pojavi. Pogledajte IT oglase. Uopšte nije neuobičajeno da se u njima kao
jedna od stavki pominje i linux. Web programiranje je usko vezano s njim. Uz
programiranje na java platformi često ide linux. Android se ne može zamisliti
bez njega. Kad se doda iPhone i Mac OSX, deca Unix-a nikad nisu bila bliža nama.

U narednih mesec dana očekuju nas dve velike premijere. Prvo 10.10.'10.
izlazili Ubuntu i drugari u verziji 10.10 :) I ne samo da se igra na foru
poklapanja datuma i verzije, nego kad se verzija pročita binarno dobija se čista
desetka! Taman kad se uhodamo sa Ubuntom a ono već početkom novembra pojaviće se
drugi linux div: Fedora 14.

Šta nam donosi novi Ubuntu pročitajte u izveštaju: Ubuntu 10.10 Preview: Steady Progress for Maverick

Par linkova za linux početnike:
40 Must Know Linux Terminologies

40 Basic Linux Command-line Tips and Tricks

40 Linux Shell Commands for Beginners

Hm, moram priznati da ni sam ne znam sve ove komande i trikove :)

Za napredne pingvine prilažem tekst o 6 one linera: http://www.thegeekstuff.com/2010/09/linux-one-liners/

Kako da instalirate sopstveni DNS i time smanjite tromost interneta: Setting up and Using Bind. Ja sam probao i mogu odmah da vam kažem da nije sve kao u tekstu. Fajlovi se na Ubuntu nalaze na drugoj lokaciji i ne postoji jedan conf fajl za BIND već je on podeljen. Ali da se sve srediti :)

Izašao je Ubuntu 10.10 RC i njegovi drugari pa ih testirajte dok ne izađu finalne verzije: https://wiki.ubuntu.com/MaverickMeerkat/TechnicalOverview

A za one koji razmišljaju da instaliraju Linux od nule nek pogledaju PinguyOS, Ubuntu koji je fino ispoliran.

2010-09-29

The state of Java

Stephen Colebourne je u tekstu The next big JVM language izneo nekoliko vrlo zanimljivih opaski i ideja. Prvo se kritički osvrće na javu i nabraja šta u njoj ne valja i na osnovu toga postavlja kriterijume za savršeni JVM jezik. Potom prolazi kroz sve nove JVM jezike i ocenjuje ih na osnovu postavljenih kriterijuma. Na kraju zaključuje da ni jedan jezik ne zadovoljava sve kriterijume.

To ga dovodi do ideje da ne treba tražiti novi jezik već popraviti samu javu. Tolika popravka bi svakako značila raskid kompatibilnosti sa ranijim kodom. Ali Colebourne predlaže upotrebu konvertora koda, nešto što je već primenjeno u Pythonu :)

Jedna od njegovih kritka jave su Exception klase koje ne nasleđuju RuntimeException (tzv. checked exceptions). U tekstu Checked exceptions dalje razrađuje tezu

U vezi sa ovim je i tekst For those naysayers who say Java will be dead…, u kojem se tvrdi

Java will be the money-maker for cloud computing over the next few years.

i to pokazuje najnovijom pohvalom Oracle-a da je oborio rekord u performansama na svom Exalogic Elastic Cloud. Takođe se pominje i VMWare koji se sve više fokusira na javu i javine tehnologije kupovinom Spring frameworka. Izgleda da će to biti dobro i za Groovy i Grails. Oba su vlasništvo VMWara preko Springa, a Grail za razliku od sličnih projekata (Rails, Django) koristi JVM i Spring tehnologiju. Spring već sad nudi svoj framework spakovan sa Tomcate-om napucanim do nivoa app servera i sve to cloud ready!

Side by side poređenje Jave EE 6 i Springa 3.0. Java EE se tek u poslednje 2 verzije pronalazi i kreće putem koji je Spring utabao mnogo, mnogo pre. Zato se procenjuje da broj korisnika Springa mnogostruko nadmašuje broj korisnika EE: Java EE 6 and Spring 3.0

Top Java programming tools, pregled 4 razvojna okruženja za javu, njihova ocena i poređenje

NetBeans and Maven – A quick start guide, u slici i reči, autor je čitajući istu knjigu kao i ja prošao kroz isto iskustvo :)

Oracle je usvojio plan B za Javu 7. Dakle odustaje se od nekih ranije najavljivanih dodataka za Javu 7 ali se zato ne pomera njen izlazak: http://www.baptiste-wicht.com/2010/09/jdk-7-features-updated-plan-b-is-apparently-here/

Takođe i za Javu ME se predstavljaju planovi. Tu je Java najviše ugrožena od strane Googlovog Androida, pa sve sevaju varnice između ove 2 kompanije, sa sve tužbom Oracla i Googlovim bojkotovanjem JavaOne konferencije: Oracle finally outlines roadmap for mobile Java

2010-09-28

Bazno o bazama

Objašnjenje u slici, reči i tabelama šta su indeksi, čemu služe i kako da znamo na koju kolonu da ih postavimo u tekstu: An Absolute Beginner’s Introduction to Database Indexes

Na istom blogu se nalazi i objašnjenje šta je B-tree indeks pomenut u prethodnom postu: A Simple Explanation on How B-Tree Database Indexes Work

Pisao sam o korišćenju connection pool-a u Tomcat-u. U toku razvoja se vrlo često mesto Tomcat-a koristi Jetty, a kako se u njemu koristi connection pool i kako se podešava možete pročitati na: http://docs.codehaus.org/display/JETTY/DataSource+Examples

Pošto se Jetty uglavnom korisiti u Maven-u preko plugin-a, pročitajte kako da podesite DataSource za tu priliku: http://java.dzone.com/articles/jetty-maven-plugin-running

Šta se dešava sa db transakcijama ako se bazi ne pristupa direktno JDBC-om već preko JPA u tekstu Transactions in a JPA World

2010-09-27

U slavu naše profesije

Peter Denning u tekstu The Great Principles of Computing koji je napisan za American Scientist razmatra mesto i ulogu računarstva i infromatike. Njegova misao je da infromatika i računarstvo može predstavljati jednu od četiri osnovne oblasti nauke:
Computing may be the fourth great domain of science along with the physical, life and social sciences
Zato budimo ponosni na našu profesiju :)

12 stvari koje svaki programer treba da zna, brzo, kratko i tačno:

Ovo pokazuje kako naša profesija nije ni malo naivna ;)

Projektni obrasci i principi

John Lindquist je došao na genijalnu ideju kako da objasni projeknte obrasce (design patterns) preko screencasta. Upotrebio je analogiju sa igricom StarCraft da pokaže razlog za upotrebu obrazaca. Potom je u screencastu krenuo da rešava razlog na klasičan način i time ukaže na problem, a potom nudi rešenje u obrascu. Fantastično očigledno. Ovo bi trebalo emitovati na Projektovanju softvera na FON-u :) Za sada je opisao 5 obrazaca: http://johnlindquist.blogspot.com/search/label/design%20patterns

Kad smo kod obrazaca, evo jednog prostog a vrlo korisnog, pri tom nije toliko poznat jer ne pripada grupi GOF pattern-a: Null object pattern

Dobar sajt sa opisom GOF obrazaca kao i projektnih principa na kojima svi obrasci počivaju: http://www.oodesign.com/

2010-09-26

Vim - imperator

Pročitao sam jedan izuzetan tekst o Vim editoru. Do tada sam razmišljao o njemu kao arhaičnom editoru iz doba monohromatskih monitora i rada iz konzole, te da je za editovanje bolje koristiti editor sa GUI-om (moja višegodišnja pretraga za dobrim editorom se završila sa jEdit-om). A ako je potrebno nešto editovati iz konzole tu je MC, nano i joe editor.

Izgleda da je uz vežbu moguće jako produktivno koristiti vim editor, daleko produktivnije nego druge koji se koriste mišom, eventualno sa par shortcutova i prolaskom kroz menije preko mnemonika sa tastature. Podešavanjem i instaliranjem dodataka može se svašta uraditi sa Vim-om. Pri tom se troši malo resursa (za razliku od jEdita :)) a stabilnost garantuje to što se Vim razvija skoro 20 godina!

Naravno, editor je samo editor. IDE će za neke zadatke ipak biti daleko lakše za korišćenje. No znanje rada sa Vim-om i tu se može iskoristiti. Jer svaki dobri IDE i editor mora da ima Vim mode. Tako je u Eclipse, NetBeans, IDEA, čak i jEdit ima vi plugin :)

Tekst koji me je potakao na sve ovo: Coming Home to Vim
Još dobirh tekstova o Vimu:
How I boosted my Vim
Essential Vim
Graphical vi-vim Cheat Sheet and Tutorial
Vim Movement Shortcuts Wallpaper

2010-09-23

Ćirilični slobodni fontovi

Ako vam se čini da nema dovoljno lepih ćiriličnih fontova ili vam je dosadilo da se naša slova p i t u kurzivu ćirilicom ispisuju kao ruska, postoji rešenje! Poslužite se sa 8 naših ćiriličnih fontova koja su potpuno slobodni za korišćenje:


Resavska BG
Resavska BG Sans
Adamant BG
Neoplanta BG
Lovely BG
ПЛАТАН БГ
Ниоки БГ
Адамант Санс БГ

Fontovi su tesitrani na mom linuxu uveženi u OpenType obliku

2010-09-22

Tekstovi o skalabilnosti

Stonebraker pionir u razvoju relacionih sistema za upravljanje bazama podataka priča o novinama u polju njegovog rada i o svom novom sistemu kojeg predstavlja kao postrelacioni. Želja mu je da dobije prednosti NoSQL baza a da ne žrtvuje ACID. SciDB: Relational daddy answers Google, Hadoop, NoSQL

Malo NoSQL igrarija:
Cassandra cluster in a single machine with Ubuntu and VirtualBox

Applying Scalability Patterns to Infrastructure Architecture

Nešto iz Google kuhinje: Sibyl - Lage scale machine learning

NoSQL sistem za upravljanje bazama dokumenata. Learning Mongodb

2010-09-14

Blogeri studentima

Predavanja koja povezuje maksima „Open source pristup znanju“ održaće se u oktobru, novembru i decembru. Predavaće Dragan Varagić, Bogdan Kecman, Goran Rakić, Milan Stojanov, Nebojša Radović - Eniac, Stefan Jocić i Istok Pavlović.

Organizator ovog događaja je FONIS – udruženje studenata informatike FON-a.

Više o predavačima i rasporedu predavanja na: http://b2s.fonis.rs/#b2shome

IT vestii

J2EE transactions explained

Oracle set to merge Java virtual machines

Why Android Is Stealing Share from iOS

Drools JBoss Rules 5.0: Complex Event Processing

Ten Things I Hate About Object-Oriented Programming

Bilo je i komentara ovih linkova, ali je glupi blogspot to pojeo...

2010-09-11

IT vesti

PostgreSQL korača krupnim koracima napred. Posle verzije 8.3 u kojoj je značajno unapređena brzina, verzije 8.4 koja je donela windowing funkcije i neke uobičajene operacije na tabelama pretvorene u izraze, predstojeće verzije 9.0 sa Straming Replication i Hot Standby već je krenulo da se radi na verziji 9.1: PostgreSQL 9.1 Alpha Arrives Ahead of 9.0 GA

Nadam se da će ove promene i poboljšanja uz Oracle-ovo preuzimanje MySQL-a doprineti većoj popularnosti ovog sjajnog rdbms.

Tekst iz oblasti IT menadžmenta, napisan iz teorije i prakse, a zanimljiv u pristupu i povezivanju sa radovima japanskih stručnjaka iz organizacije u Toyota fabrici (čuveni Šigeo Šingo koji je jednom gostovao na Fakultetu organizocionh nauka): The Seven Wastes of Software Development

Mark Reinhold, glavnokomandujući razvojnog tima java platforme u Oracle, objavio je na svom blogu da će doći do odlaganja u planovima za izdavanje JDK u verziji 7. U tekstu se navode 2 mogućnosti: prva da se izdavanje 7. verzije pomeri za sa sredine 2011. na sredinu 2011. i druga da se deo planiranih dodataka za verziju 7 u JDK objavi sredinom 2011. kao JDK 7 a ostatak za kraj 2012. kao JDK 8.

Jedna od ozbiljnijih reakcija na ovu vest u tekstu JDK 7 delayed again... how bad is that?

Scalability udruženje

Grupa entuzijasta, koji vole da rešavaju aktuelne probleme u softverskoj industriji, okupila se na sajtu http://scalability.rs/. Kao što se iz imena može pretpostaviti najveći deo tema kojim se bave proizilazi iz rešavanja problema obrade ogromne količine podataka u uslovima ograničenih resursa: vremena, procesora, memorije...

Scalability grupa je već održala 3 susreta. Možete na blog sekciji sajta videti šta ste propustili, a da se to ne bi više dešavalo prijavite se na mailing listu.

2010-09-10

Reddit oglas sa zagonetkom :)

Reddit, sajt za postavljanje linkova ka zanimljivim vestima (vrsta social bookmarking Web 2.0 aplikacije), je objavio vrlo zanimljiv oglas za prijem novih stručnjaka.

U oglasu se traži da kandidat za posao reši par izuzetnih mozgalica od kojih je najveća dokaz P = ili != NP. Više o problemu na http://en.wikipedia.org/wiki/P%3DNP

A kao šlag na tortu dolazi mail na koji treba poslati CV. On je zadat u vidu zadatka! Pa hajmo ga rešiti :)

Adresa konkursa: http://blog.reddit.com/2010/08/reddit-is-hiring.html

DevProTalk roštilj - IT professionals meets[sic] BBQ

Internet forum DevProTalk organizuje susret (čitaj roštilj i pivo) ove subote (11. sep.) od 10 sati na Adi Ciganliji mesto za roštilj kod restorana Oaza.

Više o susretu na: http://www.devprotalk.com/t9082-devprotalk-rotilj--it-professionals-meets-bbq.html

2010-09-08

Tomcat connection pooling

Dobavljanje konekcije je skupo. Pravljenje globalne konekcije je loše rešenje u uslovima kad postoji više niti (npr. u web aplikaciji) jer se po jednoj konekciji obavlja jedna transakcija, što znači da ako više niti deli istu konekciju one će sa conn.commit() i conn.rollback() da smetaju međusobno. Rešenje je da se ima Connection Pool da kad se zahteva konekcija da se ne prvi novi objekat, a kad se povozove conn.close() da se konekcija ne zatvori već se vrati u pool i reciklira.

Tomcat ima ugrađenu podršku za poolove. U webapp/WEB-INF/web.xml (webapp ako je projekat pravljen pomoću Maven-a) fajlu se definiše resurs preko sledećeg taga:


<resource-ref>
<res-ref-name>jdbc/bankDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>


Ovde se definiše ime resursa, njegov tip i da će autentifikaciju obaviti servlet container (tomcat)

Zatim se u webapp/META-INF/context.xml daje definicija resursa:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/MyApp-1.0-SNAPSHOT">
<Resource
name="jdbc/bankDataSource"
type="javax.sql.DataSource"
auth="Container"
driverClassName="org.h2.Driver"
url="jdbc:h2://home/zlatan/test.h2;MODE=PostgreSQL"
username="sa"
password="sa"
maxActive="1"
maxIdle="1"
defaultAutoCommit="false"
testOnBorrow="true"
validationQuery="select 1"/>

</Context>


Prva 3 atributa Resource elementa su prepisana iz web.xml fajla. Zatim ide ime drajvera, url, uname, pass kao i kod ručnog pravljenja konekcije na bazu. Zatim se postavlja maksimalni broj konekcija u pool-u i maksimalan broj besposlenih konekcija. Isključuje se autoCommit za konekcije u pool-u. Poslednje 2 opcije uključuju ispitivanje da li je konekcija živa. Ispitivanje se radi pri pribavljanju konekcije iz pool-a a poslednja opcija je upit kojim se testira konekcija.

Postoje mnoge druge opcije koje nisam prikazao a među njima su najkorisnije removeAbandoned sa podešavanjima removeAbandonedTimeOut i logAbandoned, zatim opcija defaultTransactionIsolation i defaultTransactionIsolation.

U kodu se konekcija pribavlja na sledeći način:


Context context = new InitialContext();
DataSource ds = (DataSource) context.lookup(
"java:comp/env/jdbc/bankDataSource");
Connection conn = ds.getConnection();
// jer se u prethodnoj liniji konekcijaproverava pozivom select 1
// pa ako bi posle select 1 pozvali setTransactionIsolation() dobili
// bi gresku da se izolacija ne moze postaviti u sred transakcije
conn.commit();
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
// . . .


Napomena: za više o context.xml pogledati Tomcat dokumentaciju

Iako je ovde predstavljen Tomcatov način za definisanje connection pool-a on se može definisati i na aplikacionim serverima (Glassfish, IBM WebSphere...) no svaki od njih ima drugačiji način za definisanje poolova.

2010-09-07

JPA2/Hibernate kao fil na torti ili kao temelj kuće

JPA je Java persistence API, zvanični standard (ili kako ga oni zovu specifikacija) za objektno-relaciono mapiranje u Javi. Deo je JEE 5 specifikacije iako se može koristiti i u običnoj javi (JSE). Kao svaki standard JPA je tu da uvede red među različitim specifičnim ORM bibliotekama i pruži jedinstven način za rad s njima na dobrobit programera koji sad mogu na isti način da rade sa Hibernate i sa TopLink ORM biblotekama.

Prva JPA verzija kao deo JEE 5 je bila prilično siromašna u mogućnostima. Od svih velikih ORM biblioteka uzeto je samo ono što je zajedničko, najveći zajednički sadržalac. Uz JEE6 6 je izašlo drugo izdanje JPA standarda a već je implementiran u Hibernate 3.5+ i EclipseLink 2.0+ (bivšem TopLinku). Nova verzija je donela dosta novina ali i par razočarenja (o tome više u nekom drugom postu).

E sad da pokažemo kako nam JPA preko Hibernate (JPA/Hibernate) može pomoći. Nastavljam se na prethodni post. Pokazao sam kako se treba aplikacija podeliti u slojeve i kako se sa Springom pojednostavljuje sistem. Uvođenje JPA/Hiberate u takav sistem ima vrlo mali uticaj na arhitekturu. Ako je sve urađeno po JUS-u prelazak sa JDBC na JPA način rada sa bazom će uticati samo na sloj perzistencije. Eventualno će uticati ali minimalno na domenski sloj ako se podaci o tome kako se klase povezuju sa tabelama stave u kod u vidu anotacija. Drugi pristup je da se ti podaci smeste u xml fajl a kod ostavi netaknut. Ovolika izmena sa tako fino lociranim mestom menjanja pokazuje kvalitet višeslojnosti. Da je aplikacija loše podeljena preomena bi se prenosila u gomilu klasa.

Pošto smo u prošlom primeri imali samo jednu klasu u sloju perzistencije dajem njen izgled kad se radi preko JDBC-a:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DataSourceUtils;

public class CustomersInDB implements Customers {
  private DataSource dataSource;

  public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
  }

  private Connection getConnection() {
    return DataSourceUtils.getConnection(dataSource);
  }

  @Override
  public Customer loadCustomer(String customerId) {
    try {
      PreparedStatement st = getConnection()
          .prepareStatement("select * from customers where id=?");
      try {
        st.setString(1, customerId);
        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
          throw new RuntimeException("Customer has been deleted");
        }
        return new Customer(
            customerId,
            rs.getString("name"),
            rs.getString("address"));
      } finally {
        st.close();
      }
    } catch (SQLException e) {
      throw new RuntimeException(e);
    }
  }

  @Override
  public void saveCustomer(Customer customer) {
    try {
      PreparedStatement st =
          getConnection().prepareStatement(
              "update customers set name=?, address=? where id=?");
      try {
        st.setString(1, customer.getName());
        st.setString(2, customer.getAddress());
        st.setString(3, customer.getId());
        st.executeUpdate();
      } finally {
        st.close();
      }
    } catch (SQLException e) {
      throw new RuntimeException(e);
    }
  }
}


Prelaskom na JPA dobija se sledeći izgled klase:

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

public class CustomersInDB implements Customers {
  @PersistenceContext
  private EntityManager entityManager; // Spring će uraditi dependency injection

  @Override
  public Customer loadCustomer(String customerId) {
    TypedQuery<Customer> q = entityManager
        .createQuery("select c from Customer as c where c.id=:id",
            Customer.class);
    q.setParameter("id", customerId);

    return q.getSingleResult();
  }

  @Override
  public void saveCustomer(Customer customer) {
    entityManager.merge(customer);
  }
}


U ovom kodu samo je TypedQuery deo JPA2. U JPA1 bi koristili Query interface koji nije generički pa bi morali Object referencu da pretvorimo u Customer prilikom poziva getSingleResult metode.

A da bi sve ovo radilo potrebo je u klasi u domenskoj klasi Customer ili u persistence.xml datoteci opisati povezivanje klasa i tabeli. Primer za opisivanje u domenskoj klasi preko antotacije:

@Entity
public class Customer implements Serializable, Cloneable {

  @Id
  @GeneratedValue
  private long internId;
  private String id;
  private String name;
  private String address;

  public Customer() {
  }

  public Customer(String id, String name, String address) {
    this.id = id;
    this.name = name;
    this.address = address;
  }

  // getters, setters, equals, hash, clone kao i ranije

}


Tabela sličnosti pojmova u JDBC i JPA:

JDBC JPA
database persistence unit
DataSourceEntityManagerFactory
Connection EntityManager


Mogli smo promene da izvedemo i na drugi način. Mogli smo da uopšte ne menjamo CustomersInDB klasu nego napravimo novu implementaciju Cusotmers interfejsa, recimo JPACustomersInDB i da u xml config datoteci za Spring DefaultCusotmersService beanu podmtnemo preko dependency injectiona tu novu implementaciju. To pokazuje kako je dependenci injection moćna stvar. Možemo izmeniti sistem a da ne menjamo postojeći kod!

Ako ste zainteresovani za JPA pogledajte tutorijal na http://www.vogella.de/articles/JavaPersistenceAPI/article.html Iako se tu obrađuje JPA 1 i to u Java SE, mislim da je za početak sasvim odgovarajuć i pošto se radi o običnoj javi nema dependency injection-a, Springa, aplikacionog servera, web programiranja i ostalih zbunjujućih stvari.

Staleži u java svetu

Htedoh dati naslov Klasne podele u java svetu u smislu podele na slojeve kako smo učili iz istorije da je svako društvo bilo podeljeno, ali reč klasa ima posebno značenje u programiranju.

Čitajući jednu dobru knjigu po prvi put sam video kako se na moderan način vrši raslojavanje programa u nivoe i čime se programeri pomažu da bi to raslojavanje uradili na najbolji način. Svi smo učili da savremena softverska arhitektura podrazumeva najmanje 3 sloja:

  1. korisnički interfejs
  2. sloj poslovne logike
  3. DB orijentisani sloj

U praksi se sve klase sistema dele u 4 kategorije:

  • Klase domenskog sloja koje predstavljaju objekte i veze izmađu objekate u poslovnom domenu (npr. u bankarstvu bi to bili računi, korisnici...). Te klase ne treba da znaju ništa o klasama drugih slojeva. Tako da npr. klasa Kupac ne treba da zna ništa o tome kako će se ona predstaviti korisniku sistema (kao web, swing, konzolno i kako u okviru tih mogućnosti). Takođe ne treba da zna kako će se čuvati u bazi niti kako će se koristiti transakcije za kontrolu paralelnog izvršavanja. Svaka klasa iz ovog domena se preslikava u jednu ili više tabela u bazi.
  • Aplikacioni sloj (naziva se i business transaction layer ili service layer) modeluje ponašanje sistema. Koristi sistemske transakcije da bi mogao omogućiti ispravan paralelni pristup. Klase ovog sloja treba da znaju samo za domenski sloj zato što manipulišu domenskim objektima (npr. klasa koja vrši novčane transfere mora imati pristup Račun objektu).
  • Sloj perzistentnosti čuva objekte u nekim trajnim skladištima (bazi uglavnom, ali može to biti i fajl ili EJB) i na zahtev ih uzima iz skladišta. Takođe omogućava sistemske transakcije za pristup skladištu (commit, rollback, transaciton isolation). Treba da zna samo za domenski sloj jer npr. mora da sačuva i pronađe Kupac objekat, i za aplikacioni sloj. Dozvoljeno je da se ima veza sa aplikacionim slojem ali je boljne izbeći takve veze. Upravo nam pomoć aplikacionih frameworkova omogućava da izbegnemo te veze.
  • Sloj korisničkog interfejsa treba da zna samo za domenski sloj jer treba da prikaže korisniku domenske objekte (prikaže Račun) i aplikacioni sloj jer taj sloj dobavlja i prihvata domenske objekte od interfejsa.

Primetite da se sloj poslovne logike podelio na aplikacioni i domenski.

Kako ovo funkcioniše pokazaću na primeru proste Wicket aplikacije koja omogućava izmenu podataka o korisniku. Sastoji se iz 3 stranice: prva prikaže formu za unos šifre korisnika, druga koja prikaže podatke korisnika čija je šifra uneta i treća koja prikaže da je izmena uspešno obavljena. Sva logika se nalazi iza 2. stranice jer ona mora da pronađe i prikaže korisnika za unetu šifru a da zatim snimi izmenu podataka o korisniku.

Ako bismo radili u čistom Wicket-u i JDBC-u dijagram klasa za ovaj primer bi izgledao ovako:




Ovde su korišćeni projektni obrasci: service pattern za Business transacition sloj i Data Access object (dobar opis DAO patterna: Core J2EE Pattern Catalog) za perzistenciju (klase: Customers i CustomersInDB).

Kao što se vidi krše se neka pravila razdvajanja sloja. Klasa DefaultEditCustomerService iz service sloja ima vezu sa DBTranasactionFactory i CustomersInDB iz peristence sloja. Osim toga i na drugim mestima postoji direktna veza sa implementacijom. Npr. EditCustomer bi trebalo samo da komunicira sa EditCustomerService interfejsom i da ne zna koja je implementacija u pitanju, međutim postoji direktna veza sa DefaultEditCustomerService implementacijom.

Ovaj problem se rešava preko Dependency injection-a recimo korišćenjem Spring frameworka. Dijagram klasa za to rešenje izgleda ovako:




Na dijagramu primećujete da su ostale samo veze ka interfejsima što znači da klase ne znaju sa kim komuniciraju, nestala je jaka spregnutost među njima upotrebom Springove podrške za dependency injection. Ali nestale su i klase koje se tiču transakcija jer smo upotrebili Springov transakcioni bean i na njega preusmerili metode iz aplikacionog sloja.

Kada se uporede ova dva dijagrama jasno se vidi koji je prostiji i lakši za razumevanje i održavanje.

Više o Dependenci Injectionu: članak Martina Fowlera i sažetiji članak na Wikipediji
Wikipedija o Springu: Spring Framework