Oblikovni obrasci u programiranju (OOUP)
neslužbene stranice predmeta
O predmetu
Predmet proučava programsko oblikovanje
kao vještinu organiziranja interakcije komponenti
s ciljem postizanja poželjnih svojstava programskog sustava.
Obrazlaže se potreba za oblikovanjem programskih podsustava
koji pored dobrih statičkih svojstava
(korektnost, performansa, upotrebljivost)
imaju i dobra dinamička svojstva
(lako održavanje, otpornost na promjene).
Promatraju se simptomi koji ukazuju
na neadekvatna dinamička svojstva programa,
te uvode općenita načela oblikovanja kojima se
uzroci simptoma mogu otkloniti.
Detaljno se ponavljaju tehnike
za ostvarivanje prilagodljivog koda:
prikazivanje organizacije dijagramima,
dinamički polimorfizam, predlošci, ugovorno oblikovanje.
Proučava se izražavanje dinamičkog polimorfizma
u C++-u, Javi i Pythonu, kao i odgovarajuća izvedba u C-u.
Uvodi se pojam oblikovnog obrasca kao isprobanog rješenja
kojim se uvedena općenita načela mogu ostvariti
u razredima čestih konkretnih problema.
Detaljno se proučavaju važniji oblikovni obrasci
kao konceptualna rješenja koja se mogu
primijenjivati u svakodnevnoj praksi.
Obrasci se prikazuju na način
da se prvo uvede problem do kojeg možemo doći
ako ne obraćamo pažnju na načela oblikovanja.
Zatim se prezentira struktura rješenja
te prikazuju sudionici i njihova suradnja.
Na kraju se razmatraju efekti obrasca,
diskutiraju implementacijski detalji,
prikazuje izvorni kôd, navode primjeri upotrebe,
te analiziraju međusobni odnosi sa srodnim obrascima.
Detalji izvedbe
Predmet se sastoji od dva sata predavanja tjedno,
te laboratorijskih vježbi
koje se kolokviraju jednom u svakom ciklusu.
Pretpostavljena su osnovna znanja
iz domene objektno orijentiranog programiranja
stečena na uvodnim kolegijima.
Koncepte ćemo ilustrirati u različitim
modernim programskim jezicima.
Temeljne koncepte poput izvedbe dinamičkog polimorfizma
i pozivanja funkcija u dinamičkim bibliotekama
ćemo pokazati u C-u, materinjem jeziku računala.
Detalje izvedbe dinamičkog polimorfizma dodatno ćemo
ilustrirati u C++-u, gdje ćemo analizom
generiranog strojnog koda proučavati
prostornu i vremensku cijenu dinamičkih poziva.
Mnoge oblikovne obrasce ćemo pokazati
na primjerima popularnih biblioteka Jave i Pythona.
Konačno, neke od naprednijih pristupa
za izgradnju fleksibilnih programa
ilustrirat ćemo u Pythonu,
jednom od najavangardnijih jezika danas.
Ispit se sastoji od teorijskog (30%) i problemskog dijela (70%).
Problemski dio obuhvaća razumijevanje dinamičkog polimorfizma,
primjenu načela i obrazaca pri rješavanju konkretnih problema,
te prepoznavanje obrazaca u nekomentiranom izvornom kôdu.
Teorijski dio ispita obuhvaća važnije činjenice
izložene na predavanjima.
Predavanja
-
Uvodno predavanje (tjedan 1)
pdf
-
Načela oblikovanja (tjedni 2-5)
pdf
-
Osnovni oblikovni obrasci (tjedni 6-9)
pdf
-
Ostali oblikovni obrasci (tjedni 10-13)
pdf
-
Kanal sa snimkama predavanja:
yt
Laboratorijske vježbe
-
Laboratorijska vježba 1 (dinamički polimorfizam u C-u i C++-u)
html
-
Laboratorijska vježba 2 (načela, osnovni obrasci)
html
-
Laboratorijska vježba 3 (tvornice, GUI1)
html
-
Laboratorijska vježba 4 (GUI2, složeniji obrasci)
html
-
Često postavljana pitanja o C++-u
html
Studentski seminari
-
David Kerman:
Alokatori u standardnoj biblioteci C++-a
(pdf).
-
Ivan Martinović:
Višestruko nasljed̄ivanje u statički tipiziranim jezicima
(pdf).
Primjeri pismenih ispita
-
Laboratorijske provjere 2020/21
(lab1,
lab2,
lab3,
lab4)
-
Međuispit 2011/12
(pdf)
-
Međuispit 2012/13
(pdf)
-
Završni ispit 2011/12
(pdf)
-
Međuispit 2016/17
(pdf)
-
Pismeni ispit 2016/17
(pdf)
-
Međuispit 2018/19
(pdf)
-
Završni ispit 2017/18
(pdf)
-
Završni ispit 2018/19
(pdf)
-
Međuispit 2020/21
(pdf)
Korisne knjige
Načela i obrasci programskog oblikovanja
-
Design Patterns;
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides;
Addison-Wesley; 1995
-
Agile Software Development: Principles, Patterns, and Practices;
Robert C. Martin; Prentice Hall; 2002
-
Large-Scale C++ Software Design;
John Lakos; Addison-Wesley; 1996
-
Modern C++ Design: Generic Programming and Design Patterns Applied;
A. Alexandrescu; Addison-Wesley; 2001
-
Head First Design Patterns;
Elisabeth Freeman, Eric Freeman, Bert Bates, Kathy Sierra;
O'Reilly Media, Inc.; 2004
-
The Elements of Programming Style;
Brian W. Kernighan, P. J. Plauger;
Computing Mcgraw-Hill; 1978
Razvojne metodologije
-
The Mythical Man-Month; F. Brooks;
Addison Wesley; 1995
-
The Pragmatic Programmer;
A. Hunt, D. Thomas; Addison Wesley; 2000
-
Generative Programming: Methods, Tools, and Applications;
Krysztof Czarnecki, Ulrich Eisenecker;
Addison-Wesley Professional; 2000
-
Extreme Programming Adventures in C\#;
Ron Jeffries;
Microsoft Press; 2004
C, C++, generičko programiranje
-
[More] Effective {C++|STL}; S. Meyers;
Addison Wesley; 1996
-
Generic Programming and the STL:
Using and Extending the C++ Standard Template Library
Addison-Wesley Professional Computing Series;
Matthew H. Austern; 1998
-
C++ FAQs; Marshall P. Cline, Greg Lomow, Mike Girou;
Addison-Wesley Professional; 1998
-
Demistificirani C++;
Julijan Šribar i Boris Motik;
Element; 2006
-
C++ Templates: The Complete Guide;
by David Vandevoorde, Nicolai M. Josuttis
Addison-Wesley Professional; 2002
-
Object oriented programming with ANSI C;
Axel Tobias Schreiner
(pdf)
Zanimljivi članci
Istraživanja o programskoj organizaciji i arhitekturi
-
Brian Foote and Joseph Yoder, Big Ball of Mud, PLOP'97
(pdf)
-
Hayden Melton, Ewan Tempero:
An Empirical Study of Cycles among Classes in Java,
OOPSLA'06
(pdf)
-
Brian Foote:
Pattern labyrinth
(html)
-
Patterns at hillside.net
(html)
Programsko oblikovanje, organiziranje interakcije komponenata
-
R. Martin:
Principles and Patterns
(pdf)
-
R. Nystrom: Game Programming Patterns
(html)
-
Joel Spolsky:
Don't Let Architecture Astronauts Scare You
(html)
O C-u i C++-u
-
Dan Saks:
Virtual functions in C
(html)
-
Inicijaliziranje statičkih varijabli u statičkim bibliotekama
(html)
-
Biblioteka Boost
(html)
-
C++ FAQ @ isocpp.org
(html)
-
FAQ Bjarnea Stroustrupa
(html)
-
Najlakši način za naučiti C++ u 21 dan
(html)
-
FAQ Marshala Clinea
(html)
-
Scott Meyers i Andrei Alexandrescu:
"C++ and the Perils of Double-Checked Locking"
(pdf)
-
Curtis Krauskopf
"C++ Interview Questions"
(html)
Općenito o programskom inženjerstvu
-
Software Engineering at Google
(html)
-
TIOBE Programming Community Index
(html)
-
Bug koji je uništio Arijanu
(1, 2)
-
Kako napisati dobar CV
(html)
-
Buba koja je u standarnoj biblioteci Jave
mirno proležala devet godina
(html)
-
B. Stroustrup o nastavnim programima u programskom inženjerstvu
(html)
-
Kako postati hacker, od Erica Raymonda
(html)
-
Hackers and painters, od Paula Grahama
(html)
-
Jack Reeves o oblikovanju programske podrške
(html)
-
P. Graham o pokretanju tvrtke
(html)
-
Standard jezika C++, ISO/IEC 14882, draft 2023
(pdf)
-
Standard jezika C, ISO/IEC 9899, draft 2007
(pdf)
-
Programmer Competency Matrix
(html)
-
M. Fowler: O agilnom razvoju
(html)
-
P. Graham o patentima
(html)
O programskom stilu
-
O programskom stilu (Wikipedia)
(html)
-
Googleov programski stil za C/C++
(html)
-
Vodič za pisanje programa koji se ne mogu održavati
(html)
O komuniciranju na Internetu
-
O načinima citiranja u online diskusijama (Wikipedia)
(html)
-
RFC 1855, Nettiquette guidelines
(html)
-
P. Graham o izražavanju neslaganja
(html)