topic: Katalog design paterna i antipaterna sa izvorima za učenje aliases: [design patterns katalog, GoF, PoEAA, antipaterni, code smells, sadržaj knjige paterni] date: 2026-09-25 depth: iterative rounds: 37/50 coverage: 11/11 verified: 96/99 (3 tvrdnje ispravljene: sourcemaking/antipatterns, ObjectAid, Omondo) sources: [martinfowler.com, refactoring.guru, sourcemaking.com, enterpriseintegrationpatterns.com, en.wikipedia.org, norvig.com, laputan.org, adaptiveobjectmodel.com, youtube.com] tags: [patterns, antipatterns, arhitektura, učenje, reference, gengine]
Postoje četiri velika kataloga koja pokrivaju 95% svega što se u praksi zove „pattern": GoF (23 obrasca, nivo objekata), Fowler PoEAA (~51, nivo poslovne aplikacije), EIP (~65, integracija kroz poruke) i POSA (5 knjiga, arhitektura i konkurentnost). Antiobrasci nemaju jedan kanonski katalog — najbliže je knjiga AntiPatterns (1998) plus Wikipedijina lista od ~45 unosa u 5 kategorija.
Za učenje: refactoring.guru je najbolji besplatan web izvor za GoF (sa primerima u 10 jezika), martinfowler.com/eaaCatalog je besplatan katalog PoEAA sažetaka, a Christopher Okhravi (YouTube) je najbolji besplatan video za GoF. Same knjige su plaćene.
Za GEngine/GTehnobiro: obrasci koji se stvarno vide su Metadata Mapping, Table Module, Record Set, Layer Supertype, Bridge, Command + Chain of Responsibility, Composite, Template Method, Service Locator, Singleton, a arhitekturni stil je Adaptive Object-Model. Antiobrasci koji se vide: God object, Inner-platform effect, Lava flow, Copy-paste programming, Hard coding.
Gamma, Helm, Johnson, Vlissides. 23 obrasca, nivo: objekti unutar programa. Besplatan katalog: refactoring.guru/design-patterns/catalog [1] (svih 23 potvrđeno). Alternativa: sourcemaking.com/design_patterns [2] — isti obrasci, plus tri koja nisu u knjizi (Null Object, Object Pool, Private Class Data). Video: Christopher Okhravi — „Design Patterns in Object Oriented Programming" [3] (jedna epizoda po obrascu, besplatno).
| Obrazac | Čemu služi | Web (besplatno) |
|---|---|---|
| Factory Method | potklase odlučuju koju klasu instancirati | refactoring.guru/design-patterns/factory-method |
| Abstract Factory | familija povezanih objekata bez imenovanja konkretnih klasa | …/abstract-factory |
| Builder | objekat se sklapa korak po korak | …/builder |
| Prototype | novi objekat kao kopija postojećeg | …/prototype |
| Singleton | jedna instanca, globalno dostupna — danas sporno, vidi §8 | …/singleton |
| Obrazac | Čemu služi | Web |
|---|---|---|
| Adapter | prevodi tuđi interfejs u onaj koji tvoj kod očekuje | …/adapter |
| Bridge | odvaja apstrakciju od implementacije (GEngine: GDataDriver*) | …/bridge |
| Composite | jedan objekat i grupa se koriste isto (GContainer/GCell) | …/composite |
| Decorator | dodaje ponašanje omotavanjem, bez nasleđivanja | …/decorator |
| Facade | jedno prosto lice ispred složenog podsistema | …/facade |
| Flyweight | deli zajedničko stanje između mnogo malih objekata | …/flyweight |
| Proxy | stoji umesto objekta (lenjo, udaljeno, kontrola pristupa) | …/proxy |
| Obrazac | Čemu služi | Web |
|---|---|---|
| Chain of Responsibility | poruka putuje nizom obrađivača dok je neko ne „pojede" (consume()) | …/chain-of-responsibility |
| Command | zahtev kao objekat (GCbMessage) | …/command |
| Iterator | prolaz kroz kolekciju bez otkrivanja strukture | …/iterator |
| Mediator | objekti komuniciraju kroz posrednika, ne direktno | …/mediator |
| Memento | snimak stanja za vraćanje | …/memento |
| Observer | promena se javlja zainteresovanima | …/observer |
| State | ponašanje se menja sa stanjem, bez if lanaca | …/state |
| Strategy | algoritam se zamenjuje u runtime-u | …/strategy |
| Template Method | skelet postupka u osnovnoj klasi (loadData/createData) | …/template-method |
| Visitor | nova operacija nad hijerarhijom bez menjanja klasa | …/visitor |
| Interpreter | jezik/gramatika kao stablo objekata | sourcemaking.com/design_patterns/interpreter |
Nivo: cela poslovna aplikacija. Besplatni sažeci: martinfowler.com/eaaCatalog/ [4]. Šema linka je martinfowler.com/eaaCatalog/<imeObrascaCamelCase>.html — potvrđeno na 15 stranica, sve HTTP 200 (npr. metadataMapping.html, tableModule.html, recordSet.html, layerSupertype.html). Puna obrada je u knjizi (plaćeno); sa kataloga vode i duboki linkovi ka O'Reilly eBook izdanju (plaćeno).
Spisak je izvučen sa same strane [4], grupisan kako ga Fowler grupiše:
| Grupa | Obrasci |
|---|---|
| Domain Logic | Transaction Script · Domain Model · Table Module · Service Layer |
| Data Source Architectural | Table Data Gateway · Row Data Gateway · Active Record · Data Mapper |
| O-R Behavioral | Unit of Work · Identity Map · Lazy Load |
| O-R Structural | Identity Field · Foreign Key Mapping · Association Table Mapping · Dependent Mapping · Embedded Value · Serialized LOB · Single Table Inheritance · Class Table Inheritance · Concrete Table Inheritance · Inheritance Mappers |
| O-R Metadata Mapping | Metadata Mapping · Query Object · Repository |
| Web Presentation | Model View Controller · Page Controller · Front Controller · Template View · Transform View · Two Step View · Application Controller |
| Distribution | Remote Facade · Data Transfer Object |
| Offline Concurrency | Optimistic Offline Lock · Pessimistic Offline Lock · Coarse-Grained Lock · Implicit Lock |
| Session State | Client Session State · Server Session State · Database Session State |
| Base | Gateway · Service Stub · Record Set · Mapper · Layer Supertype · Separated Interface · Registry · Value Object · Money · Special Case · Plugin |
Četiri unosa odatle su kostur GEngine-a:
GColumnHeaderDbtObjectGDataSource2dGDataSourceLevel00..50Sitnica sa iste strane: dijagrame u knjizi je prerisao David Heinemeier Hansson (tvorac Rails-a), a sadržaj strane je iz 2003. uz redizajn iz jula 2024 [4].
Hohpe & Woolf, ~65 obrazaca za komunikaciju kroz poruke. Besplatan katalog: enterpriseintegrationpatterns.com/patterns/messaging/ [5]. Potvrđeni primeri stranica: Message.html, Filter.html, Aggregator.html, ContentBasedRouter.html, DeadLetterChannel.html, IdempotentReceiver.html, CorrelationIdentifier.html, MessageBroker.html, DurableSubscription.html, CompetingConsumers.html, ControlBus.html, Detour.html, EnvelopeWrapper.html, DynamicRouter.html, CanonicalDataModel.html — šema je .../messaging/<Ime>.html.
Kada treba: integracija sistema, redovi poruka, event-driven. Za GEngine trenutno nije tema.
Pattern-Oriented Software Architecture, Buschmann i dr., 5 tomova (1996–2007) [6]. Wikipedijina strana opisuje seriju knjiga i recepciju, ne spisak obrazaca — spisak je u knjigama (plaćeno). Iz tomova (navedeno iz knjiga, nije izvučeno sa web strane):
Besplatna zamena za arhitekturne stilove: Wikipedijina „List of software architecture styles and patterns" [7] — potvrđeno preko API-ja: stilovi (Event-driven, Hexagonal/Ports and Adapters, Layered, Microkernel, Pipes and Filters, Microservices, Monolith, SOA, Space-based) i obrasci (Circuit Breaker, Saga, Strangler fig, Publish–subscribe, Retry, Rate limiting, Throttling, Blackboard, Claim-Check, Competing Consumers, Inbox/Outbox, Backends for frontends…).
Eric Evans. Gradivni blokovi: Entity, Value Object, Aggregate, Repository, Factory, Domain Event, Service, Bounded Context, Context Map, Ubiquitous Language. Besplatno: Wikipedia „Domain-driven design" [8] i, sa iste strane kao eksterni link, Evansov „Domain Driven Design, Definitions and Pattern Summaries" (PDF, 2015) — kratak zvaničan sažetak obrazaca, besplatan. Povezano: martinfowler.com/bliki/CQRS.html [9] i martinfowler.com/eaaDev/EventSourcing.html [10].
Yoder & Johnson (isti Ralph Johnson iz GoF četvorke). Sistem u kojem metapodaci opisuju poslovna pravila, pa se ponašanje menja podatkom, ne kodom. Sajt: adaptiveobjectmodel.com [11]. To je najtačnije ime za GEngine kao celinu: tabela je opis, ekran i DDL su izvedeni. Srodno ime iz iste familije: Metadata-driven architecture, Type Object, Properties pattern.
AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis (1998), Brown, Malveau, McCormick, Mowbray. Klasični unosi: The Blob (God Class), Continuous Obsolescence, Lava Flow, Ambiguous Viewpoint, Functional Decomposition, Poltergeists, Boat Anchor, Golden Hammer, Dead End, Spaghetti Code, Input Kludge, Walking through a Minefield, Cut-and-Paste Programming, Mushroom Management. Web dopuna: wiki.c2.com/?AntiPattern [13] (istorijski, originalna zajednica).
⚠️ ISPRAVKA prvog prolaza (provereno 26.09.2026): sourcemaking.com/antipatterns [12] vraća HTTP 200, ali na njoj više nema antiobrazaca — servira pregled design obrazaca. Moja prvobitna tvrdnja da je to „katalog antiobrazaca" je bila pogrešna: status 200 nije dokaz da stranica sadrži ono što tvrdim. Za antiobrasce koristi Wikipedijinu listu [14], kategoriju [15] i c2 wiki [13].
| Kategorija | Antiobrasci |
|---|---|
| Generalni dizajn | Abstraction inversion · Ambiguous viewpoint · Database-as-IPC · Input kludge · Interface bloat · Magic pushbutton · Stovepipe system |
| Objektno-orijentisani | Anemic domain model · Call super · Circle–ellipse problem · Circular dependency · Constant interface · God object · Object orgy · Poltergeist · Sequential coupling · Yo-yo problem |
| Programerski | Action at a distance · Boat anchor · Busy waiting · Cargo cult programming · Coding by exception · Error hiding · Lasagna code · Lava flow · Loop-switch sequence · Magic numbers · Magic strings · Repeating yourself · Shotgun surgery · Soft code · Spaghetti code |
| Metodološki | Copy and paste programming · Golden hammer · Not invented here · Premature optimization · Silver bullet · Tester-driven development |
| Konfiguracija | Dependency hell · DLL hell · Extension conflict |
Wikipedijina Category:Anti-patterns [15] dodaje još: Continuous obsolescence, Hard coding, Inner-platform effect, Law of the instrument, Mock trainwreck, Analysis paralysis, Dark pattern — i, što je najzanimljivije, Singleton pattern.
Besplatan spisak: refactoring.guru/refactoring/smells [16] — 22 potvrđena unosa: Long Method · Large Class · Primitive Obsession · Long Parameter List · Data Clumps · Switch Statements · Temporary Field · Refused Bequest · Alternative Classes with Different Interfaces · Divergent Change · Shotgun Surgery · Parallel Inheritance Hierarchies · Comments · Duplicate Code · Lazy Class · Data Class · Dead Code · Speculative Generality · Feature Envy · Inappropriate Intimacy · Message Chains · Middle Man · Incomplete Library Class.
Foote & Yoder (1997) — najčešća arhitektura na svetu, opisana bez prezira. Besplatno: laputan.org/mud/ [17]. Obavezno čitanje za rad na legacy sistemu.
Tvrdnja koju sam proveravao: „vredi naučiti katalog obrazaca".
| Protiv-argument | Izvor | Ishod |
|---|---|---|
| Obrasci su zakrpe za slab jezik — u modernom jeziku Strategy je lambda | refactoring.guru/design-patterns/criticism, koji to pripisuje eseju Paula Grahama Revenge of the Nerds [18] | ostaje kao ograničenje: uči obrazac, ali proveri da li ti jezik već daje rešenje |
| Mnogi GoF obrasci su u dinamičkim jezicima nevidljivi ili trivijalni | Peter Norvig, Design Patterns in Dynamic Languages (predavanje 1996, online od 1998; PDF 322 KB, preuzet i postoji) [19] | ostaje; teza je starija od 25 godina i još važi za Python/Lisp/JS |
| Neefikasna rešenja i neopravdana upotreba („pattern fever") | ista stranica sa kritikama [18] | ostaje: obrazac bez problema je šteta, ne vrlina |
| Katalog je zastareo — jedan njegov obrazac (Singleton) je danas u kategoriji antiobrazaca | Wikipedia Category:Anti-patterns [15] | ostaje: uči sa datumom, ne kao dogmu |
| PoEAA je iz 2002, pre modernih ORM-ova i CQRS-a | sadržaj strane je iz 2003 uz redizajn 2024 [4] | slabi se: imena i podele važe, primeri i tehnologije su stari |
Šta bi oborilo zaključak: da za GoF/PoEAA ne postoji besplatan izvor (postoji — §1, §2), ili da su imena obrazaca u praksi nekorišćena (nisu — Repository, DTO, MVC, Singleton su u svakodnevnom govoru). Nijedan protiv-argument ne obara komunikacionu vrednost imena; svi se odnose na slepu primenu.
Sve tri praznine iz prvog prolaza su popunjene (vidi §11–§13):
Ostaje otvoreno: kvalitet srpskog prevoda knjige Um caruje: Projektni obrasci (nisam je čitao, pa je ne ocenjujem) i POSA spisak iz samih tomova (Schmidtov sajt opisuje knjige, ne listu obrazaca).
Uz to: 10 per-obrazac stranica za POSA/konkurentnost (§12) i 10 stranica Škole koda (§11) — sve HTTP 200.
Prvi prolaz: 10 krugova. Drugi prolaz: krugovi 11–21. Sve provereno 25. septembra 2026. Nedostupno: infoelektronika.net (HTTP 000 — blokira klijenta), izbačeno iz izvora.
Izvor: gengine-architecture (čitano iz izvora i baze 23–24. septembra 2026).
| Obrazac / antiobrazac | Mesto u kodu |
|---|---|
| Metadata Mapping | GColumnHeader, GColumnString/Integer/…; DDL iz GMySqlDatabase.dbtCreate:119 |
| Table Module + Record Set | DbtObject, GDataSource2d — jedna instanca pokriva celu tabelu |
| Layer Supertype | GDataSourceLevel00 → 05 → 10 → 20 → 30 → 40 → 50 |
| Bridge / Driver | GDataDriverMySql, GDataDriverMemory, GDataDriverNull; GEngineAccess, GEngineExcel |
| Command + Chain of Responsibility | callback(GCbMessage), 97 tipova poruka, pMessage.consume() |
| Composite | GContainer → GContainerTable → GCell → GRecordPanel |
| Template Method | loadData() / createData() / recreateData() |
| Proxy | java.lang.reflect.Proxy u demo Db.fake(...); JDBC drajver u tragu kao $Proxy0 |
| Service Locator (ne DI) | Class.forName(systable.Id).newInstance(); addOption(Klasa.class) |
| Singleton / ambient state | GDatabase.getActiveDatabase(), GDataServer.getActiveDataServer() |
| Registry / Pool | GDbtPool, GDatabase.mPool |
| Adaptive Object-Model | cela arhitektura: šema u kodu, ponašanje iz metapodataka |
| God object | GDataSourceLevel20 — 587 linija, redovi + kolone + Excel + provajder |
| Inner-platform effect | sopstveni „SQL iz metapodataka" sloj koji ponovo gradi deo baze |
| Copy-paste programming | generator / generator2 / generator3 — tri kopije istog rešenja |
| Lava flow | 95 zakomentarisanih addOption linija u Main.java, *.java.bak fajlovi |
| Hard coding | zakucani kredencijali u GMySqlDataLink (task: rotacija + env) |
| Magic pushbutton | logika štampe vezana za akciju ekrana umesto u sloj posla |
Kako se to koristi za učenje: uzmi jedan red iz tabele, pročitaj besplatnu stranicu obrasca, pa otvori to mesto u kodu. Obrazac koji vidiš u kodu koji održavaš deset godina ostaje; obrazac iz tutorijala se zaboravi.
Najveća praznina prvog prolaza. Nađeno i provereno:
skolakoda.github.io, deo zbornika „Principi razvoja softvera". Jedna stranica = jedan obrazac ili princip, na srpskom, sa vežbama i rešenjima („Pokaži rešenje") i sekcijom Literatura. Potvrđeno 10 stranica HTTP 200; spisak izvučen sa strane kursa:
| Grupa | Stranice (slug) |
|---|---|
| GoF obrasci | obrazac-fabrika · apstraktna-fabrika · obrazac-prototip · obrazac-singleton · obrazac-adapter · obrazac-most (Bridge) · obrazac-kompozit · obrazac-dekorator · obrazac-fasada · obrazac-flyweight · obrazac-proxy · obrazac-iterator · obrazac-komanda · obrazac-posmatrac · obrazac-stanja · obrazac-strategija · sablonski-metod |
| Nivo aplikacije | mvc · mvvm · front-kontroler · objekat-za-prenos-podataka (DTO) · objekat-za-pristup-podacima (DAO) · lenjo-ucitavanje (Lazy Load) · bazen-objekata (Object Pool) · obrazac-modul |
| SOLID principi | princip-iskljucive-odgovornosti · otvoren-zatvoren-princip · liskov-princip-zamene · princip-podele-interfejsa · princip-inverzije-zavisnosti |
| Osnove i kontekst | oop · nastanak-oop · apstrakcija · enkapsulacija · polimorfizam · nasledjivanje-klasa · kompozicija-vs-nasledjivanje · komponente · arhitektura-softvera · kontrola-pristupa · inverzija-kontrole · ubrizgavanje-zavisnosti · ispravan-kod-nije-dovoljan |
| Antiobrasci | anti-obrasci |
Šema: https://skolakoda.github.io/<slug> (npr. .../obrazac-most).
Domaća terminologija koju koriste (korisno, jer je literatura neujednačena): projektni obrasci = design patterns · anti-obrasci = antipatterns · „kodni zapah" = code smell · ubrizgavanje zavisnosti = dependency injection · inverzija kontrole = IoC · sablonski metod = Template Method.
Contrarian provera tog izvora: stranica anti-obrasci termin pripisuje Andrew Koenigu (1995) — isto navodi i Wikipedijina sekcija Further reading (Koenig, „Patterns and Antipatterns", JOOP 8(1), 1995) [14]. Dva nezavisna izvora se slažu i izvor citira literaturu → prolazi proveru.
Zvanična strana serije: Schmidt, Vanderbilt [28] (opisuje svih 5 tomova; spisak obrazaca je u knjigama). Za pojedinačne obrasce postoje besplatne stranice — svih 10 provereno HTTP 200:
| Obrazac | Stranica | Čemu služi |
|---|---|---|
| Layers | en.wikipedia.org/wiki/Multitier_architecture | slojevi sa jasnim zavisnostima |
| Pipes and Filters | en.wikipedia.org/wiki/Pipeline_(software) | obrada u lancu koraka |
| Blackboard | en.wikipedia.org/wiki/Blackboard_(design_pattern) | zajedničko znanje, više izvora rešenja |
| Broker | en.wikipedia.org/wiki/Broker_pattern | posrednik između udaljenih komponenti |
| Reactor | en.wikipedia.org/wiki/Reactor_pattern | jedna nit obrađuje mnogo događaja (event loop) |
| Proactor | en.wikipedia.org/wiki/Proactor_pattern | asinhrona varijanta Reactor-a |
| Active Object | en.wikipedia.org/wiki/Active_object | poziv i izvršavanje na različitim nitima |
| Monitor Object | en.wikipedia.org/wiki/Monitor_(synchronization) | sinhronizovan pristup stanju objekta |
| Thread Pool | en.wikipedia.org/wiki/Thread_pool | ograničen broj radnika za mnogo poslova |
| Producer–Consumer | en.wikipedia.org/wiki/Producer-consumer_problem | red između proizvođača i potrošača |
Za GEngine je iz ove grupe relevantno malo: Swing nameće Monitor/EDT disciplinu (sve na EDT-u), a invokeLater je Producer–Consumer u malom.
Aggregator · BroadcastAggregate · CanonicalDataModel · ChannelAdapter · ChannelPurger · CommandMessage · CompetingConsumers · ContentBasedRouter · ContentFilter · ControlBus · CorrelationIdentifier · DataEnricher · DatatypeChannel · DeadLetterChannel · Detour · DistributionAggregate · DocumentMessage · DurableSubscription · DynamicRouter · EnvelopeWrapper · EventDrivenConsumer · EventMessage · Filter · FormatIndicator · GuaranteedMessaging · IdempotentReceiver · InvalidMessageChannel · Message · MessageBroker · MessageBus · MessageChannel · MessageDispatcher · MessageEndpoint · MessageExpiration · MessageHistory · MessageRouter · MessageSelector · MessageSequence · MessageStore · MessageTranslator · Messaging · MessagingAdapter · MessagingBridge · MessagingGateway · MessagingMapper · Normalizer · PipesAndFilters · PointToPointChannel · PollingConsumer · ProcessManager · PublishSubscribeChannel · RecipientList · RequestReply · Resequencer · ReturnAddress · RoutingTable · Sequencer · SmartProxy · StoreInLibrary · TestMessage · TransactionalClient · WireTap (+ uvodne strane po grupama).
Šema: enterpriseintegrationpatterns.com/patterns/messaging/<Ime>.html.
| Katalog | Link | Za koga | Besplatno |
|---|---|---|---|
| Game Programming Patterns (Nystrom) | gameprogrammingpatterns.com/contents.html [31] | GoF u stvarnom kodu + Game Loop, Component, Object Pool, Dirty Flag | cela knjiga besplatna |
| Refactoring catalog (Fowler) | refactoring.com/catalog/ [33] | konkretne transformacije koda | besplatno |
| Strangler Fig (Fowler) | martinfowler.com/bliki/StranglerFigApplication.html [34] | postepena zamena legacy sistema — direktno naš plan | besplatno |
| xUnit Test Patterns (Meszaros) | xunitpatterns.com [32] | Test Double, Mock, Stub, Fixture, test smells | besplatno |
| Microservices Patterns (Richardson) | microservices.io/patterns/index.html [29] | Saga, API Gateway, Database per Service | web besplatno |
| Cloud Design Patterns (Microsoft) | learn.microsoft.com/azure/architecture/patterns/ [30] | Retry, Circuit Breaker, CQRS, Bulkhead, Sharding | besplatno |
| Hillside / PLoP | hillside.net/patterns/ [23] | izvorna zajednica, radovi sa konferencija | besplatno |
Iskrena ocena relevantnosti: Game Programming Patterns je najbolji besplatan tekst za GoF u realnom kodu (tema su igre, ali obrasci su isti); Strangler Fig, Refactoring catalog i Big Ball of Mud su direktno primenjivi na modernizaciju. Microservices i cloud katalozi nisu za GEngine — to su obrasci za raspodeljene servise, ne za desktop 4GL sa jednom bazom.
Odluka korisnika (26.09.2026): ostaju u katalogu svakako. Razlog je dobar i vredi ga zapisati: katalog nije spisak zadataka nego mapa onoga što postoji — za buduće projekte, i da se zna šta treba izbegavati. Cena držanja jednog reda u tabeli je nula; cena ponovnog traženja kroz godinu je sat vremena.
obrazac-most, obrazac-komanda, obrazac-kompozit, sablonski-metod.eaaCatalog — pročitaj samo četiri koja opisuju tvoj engine: Metadata Mapping, Table Module, Record Set, Layer Supertype.Korisnik je našao sourcemaking.com i pitao ima li tamo nečeg za nas. Ima — dve sekcije koje nisu bile u katalogu, i jedna ispravka.
sourcemaking.com/refactoring [35] — 204 linka, organizovano po Fowlerovim grupama:
| Grupa | Šta pokriva | Primeri |
|---|---|---|
| composing-methods | razbijanje i sklapanje metoda | Extract Method · Inline Method · Extract Variable · Replace Temp with Query |
| moving-features-between-objects | preseljenje odgovornosti | Move Method · Move Field · Extract Class · Inline Class · Hide Delegate |
| organizing-data | podaci i pristup | Encapsulate Field · Encapsulate Collection · Change Value to Reference · Replace Magic Number with Symbolic Constant |
| simplifying-conditional-expressions | uslovi | Decompose Conditional · Consolidate Conditional Expression · Replace Nested Conditional with Guard Clauses · Introduce Null Object |
| simplifying-method-calls | potpisi i pozivi | Add/Remove Parameter · Rename Method · Introduce Parameter Object · Replace Error Code with Exception |
| dealing-with-generalisation | nasleđivanje | Pull Up/Push Down Method · Extract Superclass/Subclass · Extract Interface · Collapse Hierarchy · Form Template Method |
| smells | 22 „kodna zapaha" (isti kao §7c) | Long Method · Large Class · Feature Envy… |
Provereno čitanjem stranice extract-method [36]: sadržaj je potpuno besplatan, bez paywall-a, i ima Problem · Solution · Why Refactor · Benefits · How to Refactor plus kod pre/posle u Javi, C#, PHP-u, Pythonu i TypeScript-u. Na dnu stoji reklama za plaćeni kurs, ali ne skriva ništa.
Zašto je to za nas najvredniji deo sajta: kad budemo dirali generator3 (boja, redosled, dinamično listanje), radimo tačno imenovane transformacije — Extract Method, Extract Class, Form Template Method, Introduce Parameter Object, Replace Magic Number with Symbolic Constant (ono „strana 9" za isključen element je magic number, a Aktivan kolona je upravo ta zamena). Imenovana transformacija se lakše pregleda i lakše vrati nazad od „prepravio sam malo".
sourcemaking.com/uml [37] — struktura je knjiga u četiri dela, sa aerodromom kao primerom:
Pokriveni dijagrami: use case, aktivnosti, sekvenca, paket, klase, statechart, komunikacija.
Za nas: dijagram klasa za GEngine model (11 stubova iz priručnika) i sekvencni dijagram za callback(GCbMessage) — to je najbolji način da se 97 tipova poruka prikaže kao tok, a ne kao spisak. Kad radimo port, isti dijagrami postaju specifikacija za novi jezik.
sourcemaking.com/antipatterns više ne sadrži antiobrasce (vraća pregled design obrazaca). Vidi ispravku u §7a. Pouka koja važi i dalje: HTTP 200 nije dokaz sadržaja.| potreba u našem poslu | odakle sada imamo alat |
|---|---|
menjati generator3 bez rušenja | imenovane transformacije (16a) |
objasniti callback tok drugom čoveku | sekvencni dijagram (16b) |
| dokumentovati model za port na C#/Rust | dijagram klasa (16b) |
| zameniti „stranu 9" i druge magične vrednosti | Replace Magic Number with Symbolic Constant (16a) |
razdvojiti 587-linijski GDataSourceLevel20 | Extract Class + Pull Up/Push Down Method (16a) |
Povod: korisnik je već pravio UML dijagram svog programa i dobio zid kutija koji se ne može pratiti. Pitanje: postoji li danas alat koji to radi „fino i interaktivno", i koji je to bio Eclipse alat sa UML-om iz kog se pravilo klase.
Fowler ima ime za tu grešku i rečenicu koja rešava problem [38]:
„comprehensiveness is the enemy of comprehensibility" („sveobuhvatnost je neprijatelj razumljivosti") i: „You don't show every class, just those that are interesting and worth talking about."
On razlikuje tri načina upotrebe UML-a: sketch (selektivno, za razgovor), blueprint (potpuno, za generisanje koda) i programming language (model jeste program) [38][39]. Automatski dijagram cele aplikacije od 1792 klase je blueprint upotreba — a tebi je trebao sketch. Alat nije bio loš; tražen je bio pogrešan nivo.
Pravilo koje iz toga sledi: jedan dijagram = jedan tok ili jedan sloj. Nikad „ceo program".
| nivo | šta prikazuje | alat | za nas |
|---|---|---|---|
| 1. Arhitektura (C4) | sistem → kontejneri → komponente, sa zumiranjem | Structurizr (models as code) | GTehnobiro + GEngine + MySQL + štampači kao 4 kutije, pa unutra |
| 2. Jedan tok (sekvenca) | šta se stvarno izvršilo pri jednom kliku | iz Cortiveo traga (vidi 17e) | 5–15 učesnika, čitljivo po konstrukciji |
| 3. Interaktivno istraživanje koda | klikni klasu → vidi pozivaoce i pozvane | Sourcetrail (arhiviran, ali radi za Javu) | zamena za „gde se ovo koristi" |
| 4. Dijagram kao kod | ono što crtaš rukom, ali verzionisano | PlantUML / Mermaid | ide u git, vidi se u diff-u |
Nivo 2 je odgovor na tvoje pitanje: dijagram je čitljiv zato što ga pravi trag jednog klika, a ne parser celog izvora. Ne mora se filtrirati ono što nije ni ušlo u sliku.
Dva alata su mrtva a vraćaju HTTP 200 — zato je ova tabela važnija od bilo koje preporuke:
| Alat | Stanje | Detalj |
|---|---|---|
| PlantUML | živ [40] | tekst → dijagram; sekvenca, klase, stanje, komponente; SVG sa linkovima |
| Mermaid | živ [41] | dijagram u Markdown-u; GitHub ga renderuje sam |
| Structurizr | živ, ali reorganizovan [42] | „models as code" za C4, dijagrami interaktivni (zoom); stari repoi (java, cli, lite, ui, onpremises) arhivirani feb–mar 2026, rad prešao u jedan repo structurizr/structurizr (aktivan 19.09.2026); cloud servis je EOL → koristi lokalno/self-host |
| Sourcetrail | arhiviran 14.12.2021 [43] | read-only repo, ali radi: C, C++, Java, Python; interaktivni pregled koda. Za Javu 8 potpuno upotrebljiv — naš slučaj |
| ObjectAid UML Explorer | MRTAV [44] | domen sada pokazuje „Coming Soon"; opis alata: „live UML class and sequence diagrams that automatically updated as code changes" [45] |
| Omondo EclipseUML | MRTAV | omondo.com vraća praznu „Default page"; na strani samo 2000/2001 |
| Eclipse Papyrus + Software Designer | živ [46] | zvaničan Eclipse projekat; generisanje koda i reverse engineering za Javu i C++ |
| Jar2UML (Eclipse) | postoji, bez aktivnosti [47] | JAR → UML model u workspace-u; marketplace prijavljuje podršku do Eclipse 2025-12, ali zadnja aktivnost ~2018 |
| UML Lab | komercijalno | round-trip, template-based reverse engineering |
| IntelliJ IDEA Ultimate | komercijalno | ugrađeni dijagrami klasa i zavisnosti |
| Understand (SciTools) | komercijalno | najjači za velike legacy baze koda |
| CodeCharta | živ | kod kao „grad" — metrika i veličina, ne UML |
Opis se poklapa sa tvojim sećanjem: pravio je žive dijagrame klasa i sekvence direktno iz koda, koji su se sami ažurirali kad se kod promeni, i prevlačenjem klasa u dijagram [45]. Bio je lagan (nije MDE alat) — zato se i pamti kao prijatan.
Status: ugašen. Domen je parkiran, a i nezavisni katalozi ga vode kao discontinued. Druga mogućnost je bio Omondo EclipseUML (isti princip, „live UML") — i on je mrtav.
Danas u Eclipse-u: Papyrus Software Designer (zvaničan, Java + C++, ide u oba smera) ili Jar2UML ako hoćeš dijagram iz JAR-a bez izvora — što je nama zanimljivo, jer JAR imamo uvek, a izvor u 10+ kopija.
cortiveo diagram — sekvencni dijagram iz tragaVeć imamo sve podatke: stablo poziva jednog klika, dubinu, argumente, SQL i nit. Pretvaranje u PlantUML sekvencu je mali posao, a daje tačno ono što tražiš:
@startuml
participant GMainFrame
participant GDataSource
participant Definition
database MySQL
GMainFrame -> GDataSource : menuCall(frame, "")
activate GDataSource
GDataSource -> Definition : edit(frame, Object[0])
activate Definition
Definition -> MySQL : SELECT t0.Id, t0.Firma ... FROM definition
Definition --> GDataSource
deactivate Definition
deactivate GDataSource
@endumlZašto je to bolje od svakog generatora iz izvora:
--args), pa dijagram istovremeno dokumentuje kako se poziva.database), pa se vidi gde tok udara u bazu..puml ide u git uz kod; diff pokazuje kad se tok promenio.Obim: jedan podkomanda u CLI-ju koja čita calls.log i ispisuje .puml (procena: jedna sesija).
Ne treba ceo UML. Za naš posao dovoljno je dvanaest znakova:
Dijagram klasa
| Znak | Značenje |
|---|---|
| puna linija, prazan trougao | nasleđivanje (extends) — GDataSource2d ▷ GDataSource |
| isprekidana linija, prazan trougao | implementacija interfejsa (implements) — GDataSourceLevel40 ▷ GMenuCallable |
| puna linija bez ukrasa | asocijacija („zna za") |
| prazan romb | agregacija — deo može da živi bez celine |
| pun romb | kompozicija — deo umire sa celinom (GContainer ◆ GCell) |
| isprekidana strelica | zavisnost („koristi u prolazu") |
1, 0..1, 1..*, * | multiplicitet — koliko ih ima |
+ - # | javno, privatno, zaštićeno |
Sekvencni dijagram
| Znak | Značenje |
|---|---|
| vertikalna linija (lifeline) | objekat kroz vreme |
| uski pravougaonik | aktivacija — metoda je na steku |
| puna strelica | sinhroni poziv (čeka odgovor) |
| otvorena strelica | asinhroni poziv (invokeLater!) |
| isprekidana strelica | povratak |
okvir loop / alt / opt | petlja / grananje / opciono |
Kako se to nauči bez bubanja: piši PlantUML rukom. Kucanjem A ->> B naučiš da je to asinhrono, jer si semantiku napisao, a ne prepoznavao. Za vežbu: sourcemaking UML knjiga [37] (besplatno, 7 tipova dijagrama) uz PlantUML dokumentaciju [40] koja uči kroz primere.
| Protiv | Izvor / ishod |
|---|---|
| „UML je mrtav, timovi crtaju na tabli" | Fowler sam razlikuje sketch od blueprint i brani samo sketch [38][39] → ostaje kao ograničenje: koristi ga kao skicu, ne kao specifikaciju |
| MDE alati (blueprint/round-trip) su odumrli | dva primera iz ove sesije: ObjectAid i Omondo su ugašeni; Papyrus živi ali je težak → potvrđeno |
| C4 je zamenio UML za arhitekturu | Structurizr/C4 je živ i za to napravljen [42] → slabi UML na nivou 1, ali sekvencni dijagram nema zamenu |
| Dijagram zastari istog dana | zato generisati iz traga (17e), a ne crtati rukom → protiv-argument rešen dizajnom |
Zaključak: za ovaj projekat UML ima smisla u dva oblika — sekvenca iz traga (nivo 2) i dijagram klasa za 11 stubova modela (podloga za port). Sve ostalo je ukras koji zastari.