Cortiveo i GEngine - prirucnik

↑ Nazad

GEngine nije „splet legacy koda" nego koherentna arhitektura sastavljena od poznatih obrazaca. Imena su po Fowlerovoj knjizi Patterns of Enterprise Application Architecture (PoEAA) i po Design Patterns (GoF).

Tabela: obrazac → gde je u kodu → čemu služi

PatternGde u GEngine-uŠta rešava
Metadata MappingGColumnHeader, GColumnString/Integer/..., GMySqlDatabase.dbtCreateopis kolone na jednom mestu → DDL, SQL, ekran, štampa, izvoz
Table ModuleDbtObject, GDataSource2d — jedna instanca pokriva celu tabeluponašanje tabele na jednom mestu, bez objekta po redu
Record Setredovi u memoriji + GColumnHeader opisi; getRow(i).getInt("Kolona")tabelarni podaci nezavisni od izvora (baza ili .txt)
Layer SupertypeGDataSourceLevel00 → 05 → 10 → 20 → 30 → 40 → 50svaki nivo dodaje jednu odgovornost
Bridge / DriverGDataDriverMySql, GDataDriverMemory, GDataDriverNull; GEngineAccess, GEngineExcelisti podaci preko drugog skladišta
Command + Chain of Responsibilitycallback(GCbMessage) sa TRIGGERALWAYS, SETACTION, EDITACTION i pMessage.consume()jedna ulazna točka za sve događaje, umesto stotine hook metoda
CompositeGContainer, GContainerTable, GCell, GRecordPanelekran je drvo elemenata, generisano iz kolona
Template MethodloadData(), createData(), recreateData() koje potomci dopunjujuskelet postupka u osnovnoj klasi

Kako izgleda callback (Command)

@Override
public GCbMessage callback(GCbMessage pMessage)
{
    switch (pMessage.getId()) {
        case TRIGGERALWAYS:                       // pre svakog snimanja
            set(ID.getName(), getString(PACKAGE.getName()).trim() + "." + getString(TABLE.getName()).trim());
            break;
        case SETACTION:                           // koje akcije ekran nudi
            getActionGroup().getActionGroup(GActionGroup.OPCIJE).add(null, mActionCreate, mActionEdit);
            return pMessage;
        case EDITACTION:                          // korisnik je pokrenuo akciju
            if (lCommand.equalsIgnoreCase("TableCreate")) {
                pMessage.consume();               // komanda je pojedena, ne ide dalje
                ...
            }
    }
}

consume() je ono što ovo čini Chain of Responsibility: ko obradi komandu, zaustavi je.

Benefiti (zašto se uopšte piše ovako)

  1. Jedna definicija — sve posledice. Dodaš kolonu u jedan Java fajl: tabela, grid, forma, validacija, izvoz, štampa i meni se povuku sami. Za mali tim koji drži stotine formi — ogromna ušteda.
  2. Tipizirano. Kolone su objekti; greška se vidi u kompajliranju, ne u produkciji.
  3. Šema ide sa kodom (getInfo().setVersion(1,1,15)) i rekreira se kod klijenta.
  4. Zamenljivo skladište. Sav SQL nastaje na jednom mestu → port na PostgreSQL/MSSQL je posao jedne klase, ne cele aplikacije.

Cena (i šta se od toga može popraviti)

CenaZaštoŠta se može
amplifikacija pozivasvaka ćelija ide kroz metapodatkekeširanje kolona po tabeli; meriti Cortiveo tracerom
dubina nasleđivanja (7)ponašanje je razbacano po nivoimane diraj kičmu; koristi cortiveo trace da vidiš ko stvarno radi
nema migracije šemedbtCreate = DROP + CREATEdodati dbtAlter koji poredi klasu i information_schema
tok kroz callbackne vidi se statičkiruntime trag je izvor istine

Reference za učenje

Linkovi su iz mog znanja, nisu provereni klikom u ovoj sesiji — ako neki ne radi, traži naslov.

Tekst — obrasci koje ova aplikacija koristi

Video

Alati koje koristimo

Izvor: 03-patterns-i-reference.md