You are on page 1of 30

Oblikovni obrasci u programiranju

Uvodno predavanje

Siniša Šegvić

Sveučilište u Zagrebu
Fakultet elektrotehnike i računarstva
Zavod za elektroniku, mikroelektroniku
računalne i inteligentne sustave

→ 1/30
SADRŽAJ UVODNOG PREDAVANJA
□ Motivacija za načela i obrasce programskog oblikovanja:
□ problemi vezani uz složenost interakcije među komponentama
□ obuzdavanje složenosti apstrakcijom i organizacijom
□ Oblikovne osnove za ublažavanje interakcijskih problema:
□ ne-funkcionalni zahtjevi: ne odnose se na funkcionalnost sustava
□ utjecaj tih zahtjeva na dinamiku razvoja
□ Uklapanje oblikovanja u razvojne procese:
□ kako i kada planirati organizaciju programa?
□ usporedba "lakih" i "teških" razvojnih modela (metodologija)
□ O predmetu:
□ glavne teme, pretpostavljeno znanje
□ način održavanja nastave, razdioba bodova, literatura

Uvodno predavanje → Sadržaj uvodnog predavanja 2/30


MOTIVACIJA: PROBLEMI
Zašto je programsko inženjerstvo teško?
□ Problemi vezani uz funkcionalnost programa:
□ sofisticirana funkcionalnost
□ postizanje adekvatne brzine izvođenja
□ ostvarivanje lakog, intuitivnog i ugodnog korištenja
□ Problemi vezani uz poslovno okruženje:
□ ograničeni vremenski i materijalni resursi
□ neprecizni i promjenljivi funkcionalni zahtjevi
□ Problemi vezani uz organizaciju:
□ složenost interakcije među komponentama programa
□ otežavaju zadovoljavanje svih ostalih zahtjeva

Zašto je teško organizirati interakciju komponenata?


□ strahovito puno načina za organiziranje sustava (eksp. složenost!)

□ prikladnost organizacije vidljiva tek pri implementaciji (kasno!)


Organiziranje interakcije: ključni zadatak programskog oblikovanja!
Uvodno predavanje → Motivacija 3/30
MOTIVACIJA: SLOŽENOST [BROOKS75,BROOKS95]
Složenost interakcije je nezaobilazna poteškoća razvoja programa:

□ implementirati jedan program s 30


funkcionalnosti puno teže nego 30
zasebnih programa
□ funkcionalnosti međudjeluju,
najčešće negativno
□ ne postoji tehnologija koja bi
ubrzala razvoj za red veličine
□ no silver bullet

□ ako projektu koji kasni dodijelimo nove inženjere --- kašnjenje će


se povećati (mythical man-month)
□ jedan pristup bio bi izdvojiti funkcionalnosti u zasebne programe i
povezati ih skriptnim jezikom (ali to ne možemo uvijek!)
□ tema kolegija: pristupi za smanjivanje međuovisnosti
komponenata te ublažavanje njenih štetnih efekata
Uvodno predavanje → Motivacija 4/30
MOTIVACIJA: PRIMJER 1
Graf sistemskih poziva pri dohvatu stranice preko http protokola:

https://ma.ttias.be/system-calls-in-apache-linux-vs-iis-windows/

Razmatramo dodatak: uvođenje nove metode autentikacije


□ što je teže, natipkati algoritam ili skužiti kako ga optimalno uklopiti?
Uvodno predavanje → Motivacija (2) 5/30
MOTIVACIJA: PRIMJER 2A
Zašto je složenost programskog sustava problematična?

subversion/libsvn_fs_fs/err .[10] subversion/libsvn_fs_fs/id


[2:1] [2:1]

.[13] .[7]

subversion/libsvn_fs_fs/tree subversion/libsvn_fs_util/fs-util
[2:1] .[13] .[1]
.[8] subversion/libsvn_fs_fs/dag subversion/libsvn_fs/fs-loader
.[18] [2:1] [2:1]
subversion/libsvn_fs_fs/fs_fs .[1]
[2:1] .[19]
subversion/libsvn_fs/access
.[16]

subversion/libsvn_fs_fs/fs .[18] subversion/libsvn_fs_fs/lock .[23]


.[3] [2:1] [2:1]

subversion/libsvn_fs_fs/key-gen
[2:1]

subversion/libsvn_fs_base/err .[32] subversion/libsvn_fs_base/id


[2:1] [2:1]
.[1]
.[51]

subversion/libsvn_fs_base/bdb/dbt .[16] subversion/libsvn_fs_base/util/skel .[9] subversion/libsvn_fs_base/key-gen


[2:1] [2:1] [2:1]
.[26]
subversion/libsvn_fs_base/trail .[15]
[2:1]
subversion/libsvn_fs_base/bdb/txn-table .[28]
[2:1] .[14] subversion/libsvn_fs_base/bdb/strings-table
subversion/libsvn_fs_base/bdb/bdb_compat [2:1] .[8]
[2:1]
.[9]
.[4] subversion/libsvn_fs_base/bdb/env .[2]
.[2] [2:1]
subversion/libsvn_fs_base/util/fs_skels .[3]
[2:1] subversion/libsvn_fs_base/bdb/uuids-table .[22]
subversion/libsvn_fs_base/fs .[13] subversion/libsvn_fs_base/uuid .[17] [2:1]
[2:1] [2:1] .[14]
subversion/libsvn_fs_base/bdb/copies-table
.[7] [2:1]
.[292]
.[159] subversion/libsvn_fs_base/lock .[163] subversion/libsvn_fs_base/bdb/lock-tokens-table .[170] subversion/libsvn_fs_base/bdb/locks-table
subversion/libsvn_fs_base/tree
.[122] .[146] [2:1] [2:1] [2:1] .[177]
[2:1]
subversion/libsvn_fs_base/bdb/bdb-err
.[9]
subversion/libsvn_fs_base/bdb/rev-table [2:1]
subversion/libsvn_fs_base/revs-txns .[5]
[2:1] .[11]
[2:1]
.[5]
subversion/libsvn_fs_base/bdb/changes-table
.[8]
[2:1]
subversion/libsvn_fs_base/bdb/node-origins-table
.[16] .[3] [2:1]
.[39]
subversion/libsvn_fs_base/dag .[29]
[2:1] subversion/libsvn_fs_base/node-rev .[28] subversion/libsvn_fs_base/reps-strings .[32] subversion/libsvn_fs_base/bdb/reps-table
[2:1] .[4] [2:1] [2:1]

.[11]
subversion/libsvn_fs_base/bdb/nodes-table
[2:1]

.[306]

(graf ovisnosti komponenata jednog paketa biblioteke libsvn)

Uvodno predavanje → Motivacija (3) 6/30


MOTIVACIJA: PRIMJER 2B
Zato što iza jedne stanovite granice složenosti struktura programa
postaje neprozirna... cvsh_src/ccam/par/ccam_param

cvsh_src/ext/klt/old/klt/main

cvsh_src/ext/libvs/karla/v1/hr_fer_zemris_mastif_LibVSInterface

cvsh_src/ext/lines/ipp_wphtData
[2:1]

cvsh_src/ext/ipv/ext_ipt

cvsh_src/ext/libvs/karla/hr_fer_zemris_mastif_LibVSInterface
[2:1]

cvsh_src/ext/klt/old/klt/example3
.[2]
cvsh_src/ext/klt/old/klt/example1
.[2]

cvsh_src/ext/klt/old/klt/example4
.[1] .[9]
.[7] cvsh_src/ext/klt/old/klt/base
.[2] cvsh_src/ext/klt/old/klt/klt cvsh_src/ext/klt/old/klt/klt_util
cvsh_src/ext/klt/old/klt/storeFeatures .[5]
[2:1] cvsh_src/ext/klt/old/klt/convolve [2:1] .[14]
.[2] .[5]
[2:1] .[31] .[9]
cvsh_src/ext/klt/old/klt/pnmio cvsh_src/ext/klt/old/klt/error
.[18]
cvsh_src/ext/klt/old/klt/example2
.[2] .[1]
.[4] .[6] cvsh_src/ext/klt/old/klt/pyramid .[3]
cvsh_src/ext/klt/old/klt/selectGoodFeatures [2:1]
cvsh_src/ext/klt/old/klt/example5
.[6]
.[1]
cvsh_src/ext/klt/old/klt/trackFeatures
cvsh_src/ext/klt/old/klt/writeFeatures

.[3] .[1] cvsh_src/util/util_math


[2:1]
.[10]
.[1]

.[6]
.[2]
cvsh_src/ext/zhang/ipp_morphRegion
[2:1]
.[1] .[2]

cvsh_src/grid/root/grid_primitives
[2:1]
.[2]

cvsh_src/ext/lines/ipp_extractLines .[1]
.[2]
.[1] [2:1]
cvsh_src/grid/alg/grid_alg_rasterLine
.[2] [2:1]
cvsh_src/ext/lines/ext_lines .[1] cvsh_src/ext/lines/ipp_wpht
.[1]
[2:1] [2:1] .[1]
.[1] .[2]

.[2] .[2] .[4]


cvsh_src/ipp/ipp_findMax
[2:1] .[2] cvsh_src/ext/canny/ck/ipp_ck_1d
[2:1]
.[2] .[2]
.[1]
.[2] cvsh_src/ext/canny/ck/ipp_ck_2d
.[1] [2:1]
.[1]
.[4] .[2]
.[3]
.[2] cvsh_src/ipp/ipp_values
cvsh_src/ext/canny/ext_cannyUtil
[2:1] .[1] .[2] .[1]
[2:1]
.[1] cvsh_src/util/util_cxx
cvsh_src/ext/canny/ck/ipp_ck_gauss .[1]
.[1] [2:1]
.[2] cvsh_src/ext/lines/ext_linesUtil [2:1]
[2:1] .[1]

.[4] .[2] cvsh_src/ext/canny/ipp_gradient


[2:1]

cvsh_src/grid/root/grid_region
.[3] [2:1]
.[1] cvsh_src/ext/canny/ipp_histeresis .[2]
.[2]
[2:1]
cvsh_src/ext/zhang/ipp_locateCircles .[1]
[2:1]
.[2]
.[3] .[1]
.[1]

.[1] .[1] .[1] .[1]


.[1] .[2]
.[3]
.[1]
cvsh_src/ipp/ipp_annotations
[2:1] .[2] cvsh_src/img/access/img_access_util
cvsh_src/ext/canny/ipp_convolve_ver [2:1]
[2:1]
.[1]
.[10]
.[6]
.[3]
.[1]
.[4]
.[1] .[2] cvsh_src/ipp/ipp_negate
cvsh_src/ext/canny/ipp_convolve_gauss .[4]
[2:1] [2:1]
cvsh_src/ext/canny/ipp_convolve_ver_gen
.[2] [2:1]
.[1] .[1]
cvsh_src/ext/canny/ipp_convolve_hor .[2]
.[8]
cvsh_src/ext/canny/ext_canny [2:1]
[2:1] cvsh_src/ext/canny/ipp_convolve_hor_gen .[2]
.[2] [2:1]
.[1]
.[2]
.[1]

.[1] .[2] .[2]


.[1]
cvsh_src/ext/canny/ipp_nms
.[1] .[2]
[2:1]
.[3]
.[5] cvsh_src/ipp/ipp_addMask
.[11] .[1]
[2:1] .[1]

.[3] .[2]
.[1] cvsh_src/ipp/ipp_mask
cvsh_src/ipp/ipp_binarize [2:1]
[2:1] cvsh_src/img/access/img_access_dispatch
.[2] .[2]
.[1]
.[6]
.[1]
.[1] .[1]
cvsh_src/ext/zhang/ipp_matchGrid .[1]
[2:1] .[15]
.[1]
cvsh_src/ext/lines/alg_lines cvsh_src/ipp/ipp_histogram
.[1]
[2:1] .[2] .[4]
.[1] cvsh_src/ipp/ipp_regionGrowing
[2:1] .[4] .[2]
.[1] .[2]

.[2]
.[3]
.[4] .[5]
.[2]
cvsh_src/ipp/ipp_projection
.[5] [2:1]

.[1] cvsh_src/ipp/ipp_rescale .[1]


cvsh_src/ext/harris/ext_harris .[3]
.[5] [2:1]
[2:1] .[1]
.[1]
.[1] .[2]
.[37]
.[1]
.[1]
cvsh_src/ext/harris/ipp_findPoints
[2:1] .[4]
.[1]
.[8] cvsh_src/ipp/ipp_loop
.[2]
.[2]
cvsh_src/ipp/ipp_vector .[3]
[2:1] .[4] .[10]
.[1] .[2]
.[1]
.[2] cvsh_src/alg/alg_projection .[1]
.[2]

.[3]
cvsh_src/alg/alg_histogram
.[2]
.[7] .[1]
.[1]
.[2] .[2] cvsh_src/img/access/img_access_wrap
.[2]
.[1] cvsh_src/ipp/ipp_range
.[2] [2:1] .[1]
cvsh_src/alg/alg_rescale
.[2] .[2]
.[1] .[3] .[2]
cvsh_src/ext/harris/ipp_grad2ndMoment
.[1] [2:1]
.[2]
cvsh_src/ext/zhang/alg_matchGrid
cvsh_src/img/access/img_access_pix
.[3]
.[1]
.[2] .[3]
.[2]
.[2] cvsh_src/ext/noise/ipp_noiseReplaceUniformMasked
.[1] [2:1] cvsh_src/ext/harris/ipp_harris .[1]
.[1] .[1]
.[1] [2:1]
.[1]
.[9] .[1]
.[1]
.[1] .[2] .[1]
.[1] cvsh_src/ext/noise/ipp_attenuate .[1]
[2:1] .[19]
.[2]
.[2] .[3] .[1] cvsh_src/ext/canny/ipp_convolve
cvsh_src/ext/zhang/avf_workerZhang .[2]
[2:1] .[1]
.[1]
.[1]
cvsh_src/ext/noise/ipp_noiseAdditiveGaussian
[2:1]
.[1] .[1] .[1]
cvsh_src/img/access/img_access_guard
cvsh_src/ext/harris/ipp_nms7x7 .[1]
.[9] [2:1]
cvsh_src/ext/lines/ext_linesPartition .[3] .[2]
.[3] .[4] [2:1] .[2]
.[3]
cvsh_src/ipp/ipp_transform
.[2]
.[2]
.[2] .[3] cvsh_src/ipp/ipp_lincomb
cvsh_src/math/proj2d/math_proj2d_ann .[2]
.[1] [2:1]
[2:1]
.[1]
.[1]
.[1] .[3]
.[2]
.[3]
.[3] .[2]
.[1]
.[1] .[1]
cvsh_src/ext/zhang/ext_zhang
[2:1] .[1]
cvsh_src/win/ann/win_ann_abstract
.[1]
.[1] .[1]
.[1]
.[1]
.[3]
.[3] .[1]
.[4] cvsh_src/ext/harris/ext_harrisUtil .[3] cvsh_src/ext/noise/alg_noiseTS cvsh_src/ipp/ipp_homography .[2]
cvsh_src/ext/harris/alg_harris
[2:1] [2:1] .[1]
.[3] .[1] .[1] .[1]
.[1]
.[2]
.[10] .[4]
cvsh_src/ext/lmdif/lmdif_test
.[1] .[1]

.[1] cvsh_src/util/util_debug
.[2] [2:1] .[1]
cvsh_src/img/access/img_access_comb
.[1] cvsh_src/ext/lmdif/lmdif
.[2] .[1]
cvsh_src/math/proj2d/alg_homography_test .[1] .[2] [2:1]

.[1] .[2]
.[1]
.[1]
.[1]
.[3] .[1]
cvsh_src/lib/grab/vs_grab_macx1394_test
cvsh_src/lib/grab/vs_grab_macx1394 cvsh_src/ipp/ipp_add .[2]
[2:1] [2:1]
cvsh_src/math/proj2d/math_proj2d_homography
.[2] [2:1] .[2]
cvsh_src/lib/grab/vs_grab_linux1394_test .[1]
.[2]
cvsh_src/ipp/ipp_stretch .[2]
[2:1]
.[2]
cvsh_src/lib/grab/vs_grab_linux1394
.[1] [2:1]
cvsh_src/ext/canny/alg_canny .[1]
.[1] cvsh_src/lib/grab/vs_grabUtil
.[2] [2:1] .[2]

.[2]
cvsh_src/ipp/ipp_equalize cvsh_src/ipp/ipp_radial .[2]
[2:1] [2:1]
cvsh_src/ext/klt/ext_klt_view .[1]
[2:1] .[2]

.[1]
.[1]
.[1]
.[8] .[1]
.[6] cvsh_src/alg/alg_average .[1]
.[1] .[60]
.[1] cvsh_src/win/ann/win_ann_util
[2:1]
.[10]
.[5]
.[2]

.[1] .[1] .[1]

.[4]
cvsh_src/ipp/ipp_subsample
cvsh_src/ext/steer/alg_steer .[1]
[2:1] .[12]
.[2] .[3]
.[1]
.[3]
.[1]

.[1] .[1]
.[1]
.[4]
cvsh_src/ext/ipv/alg_ipvTriangle cvsh_src/alg/alg_radial
.[2]
.[1]
cvsh_src/img/img_dbg
.[2] [2:1]
.[2]
.[2]
.[1]
.[1]
.[1]
cvsh_src/ext/zhang/avf_workerZhangTest
.[4]
.[1] cvsh_src/img/access/img_access_copy
.[1] [2:1]

.[1] .[1]
.[2]
.[1] .[5]
cvsh_src/alg/alg_decoratorScale
[2:1]

.[1] .[1] .[11]


.[2]
cvsh_src/ui/ui_reportAbstract
.[1]
.[1]
.[1]
.[1]
.[2] cvsh_src/alg/alg_equalize cvsh_src/ext/klt/ext_klt
[2:1] .[1]

.[2]
.[4]
cvsh_src/math/la/math_la2D
.[2] .[1]
[2:1]
cvsh_src/util/util_time_macx
cvsh_src/ext/sift/ext_sift_avLowe

.[1]

.[1]

.[1]
cvsh_src/win/root/win_test
.[1] .[1] .[1]
.[1]
.[1] cvsh_src/math/la/math_la
.[3] [2:1]
.[1] .[1]
.[2]
.[1] .[2]
.[3] .[4]

.[1] cvsh_src/win/event/win_event
.[1]
.[1] [2:1]
.[5]
cvsh_src/win/event/win_event_abstract
.[2]
.[1]
.[2]
.[4]
cvsh_src/util/util_time
cvsh_src/ext/klt/alg_klt .[1]
.[1]

.[1] .[1]
.[1]
.[2]

.[2] cvsh_src/win/ann/win_ann
[2:1]

.[1]
.[2] .[1] .[2]
cvsh_src/util/util_time_linux
.[2]
.[1]
.[1]

cvsh_src/util/util_time_w32 .[1]

.[3] .[1]
.[1]
cvsh_src/ext/match/alg_match
.[1]
.[3] .[1]
.[1]
.[2]
.[2]
.[1] .[1]

.[1]

cvsh_src/ext/sift/ext_sift_keypoint_util
[2:1]
.[1]
.[2] .[2] .[3]
.[3]
cvsh_src/ext/sift/ext_sift_keypoint
.[1] .[1] cvsh_src/ext/sift/ext_sift_base .[3]
.[2] [2:1]
[2:1]

.[4]
.[3]
cvsh_src/ext/match/ext_match
[2:1]
cvsh_src/alg/alg_grayscale cvsh_src/ext/match/ext_match_sift .[1]
[2:1] .[3]
.[3]
.[2]
.[2] cvsh_src/math/la/math_la_util
[2:1] cvsh_src/grid/draw/grid_draw
[2:1]
cvsh_src/ext/sift/alg_sift .[1]
.[1]
cvsh_src/ext/match/ext_match_fake
[2:1] .[1]
.[5] .[1]
cvsh_src/math/proj2d/math_proj2d_util
.[1] .[1] [2:1]
.[2]
.[3] .[2] .[2] cvsh_src/math/tnt/math_tnt_la
.[1]
[2:1] .[1]
.[2] .[1] cvsh_src/math/tnt/math_tnt
.[2] .[3] [2:1]
.[1]
cvsh_src/win/x/win_x_connection
[2:1]

.[1] .[2]
cvsh_src/grid/draw/grid_draw_x
.[2]
[2:1] cvsh_src/win/x/win_x_renderer
.[1] .[6] [2:1]
.[2] .[2] cvsh_src/vs/vs_base
.[1] [2:1]
.[2]
cvsh_src/img/access/img_access_fill
cvsh_src/win/x/win_x .[5] cvsh_src/win/x/win_x_thread
.[6] [2:1]
[2:1] [2:1] .[1] cvsh_src/win/x/win_x_renderer_imlib
[2:1]
.[1]
.[1]
cvsh_src/ui/ui_report .[1]
[2:1] .[3]
.[5] .[8]

cvsh_src/win/root/win_wrap .[7] cvsh_src/win/root/win_base


.[1]
[2:1] .[1] [2:1]

.[1] .[1]
.[2]
.[4]
cvsh_src/lib/grab/vs_grab_linuxV4L .[1] .[1] cvsh_src/vs/vs_file
cvsh_src/win/event/win_event_queue cvsh_src/lib/avi/vs_file_wmv_unix
[2:1] .[3] cvsh_src/lib/avi/vs_file_wmv [2:1]
[2:1] .[1]

cvsh_src/lib/grab/vs_grab_w32PXC .[3] .[1] .[1]


.[1] .[1]
.[1] [2:1] cvsh_src/vs/vs_grab
.[3] [2:1] .[1]
.[1] .[2]
cvsh_src/alg/alg_types .[2]
.[1] [2:1]
.[2] .[1] .[2] cvsh_src/lib/avi/vs_file_avi
.[1]
cvsh_src/alg/alg_crop .[1] .[35]
.[1]
.[2]

cvsh_src/avf/avf_workerPointCam
[2:1] .[1]
.[2] .[1]
.[2]
.[1] .[3]

.[2] cvsh_src/math/proj2d/math_proj2d_transform .[2]


cvsh_src/vs/vs_file_srs [2:1] cvsh_src/lib/avi/vs_file_wmv_w32
cvsh_src/alg/alg_saver [2:1] .[4]
.[5] .[1]
.[3]
.[1] cvsh_src/util/util_w32 .[3]
.[1] [2:1]
.[1]

cvsh_src/lib/avi/vs_file_avi_unix .[2] cvsh_src/img/img_util


.[3] .[2] [2:1] .[15]

cvsh_src/lib/avi/vs_file_avi_w32 .[6]
.[1] cvsh_src/img/img_wrap
.[1]
[2:1]
.[1] cvsh_src/lib/avi/util_avi_unix
cvsh_src/alg/alg_nop cvsh_src/img/io/img_io_load_ras
[2:1]
cvsh_src/lib/avi/util_avi_w32
.[1]
cvsh_src/alg/alg_multiplex .[2]
.[1]
cvsh_src/img/img_vectorAbstract
cvsh_src/alg/alg_subsample .[1] .[1]
.[1]
.[2]
.[1] .[1]
.[3]
.[3]
.[1]
.[2]
.[1] .[2]
cvsh_src/ext/ipv/alg_ipvIpt .[1] .[6]
cvsh_src/img/img_vector
.[1]
[2:1] .[1] cvsh_src/util/util_registry
.[1]
[2:1]
.[6]
cvsh_src/alg/alg_base
[2:1] .[4]

.[2] .[1]
.[1]
.[2]
.[1] .[5]
cvsh_src/ext/empty/alg_empty cvsh_src/lib/grab/vs_grab_w32MCI .[28]
.[4] [2:1]

.[3] .[2]
.[3] .[2]
.[1] cvsh_src/avf/avf_worker
[2:1] .[1]
.[3]
cvsh_src/lib/avi/util_avi

.[1] .[6]
cvsh_src/ext/signsHSI/alg_signsGT .[3]
.[1] .[1]
.[2] cvsh_src/img/io/img_io_save_ras
cvsh_src/img/access/img_access_test [2:1]
.[6]
.[2]
cvsh_src/grid/draw/grid_draw_fileEps
cvsh_src/win/w32/win_w32 .[5] cvsh_src/win/w32/win_w32_worker .[5]
.[2] [2:1]
[2:1] [2:1] .[5]
cvsh_src/ccam/pt/ccam_pt_dumb cvsh_src/util/util_endian
.[5] .[5] .[1] cvsh_src/util/util_ras .[1]
[2:1] [2:1]
.[3] .[1] [2:1]

.[2] .[1]
cvsh_src/win/ann/win_ann_dump .[3] .[1]
[2:1]
.[1]
.[1] .[11]
cvsh_src/ccam/pt/ccam_pt_test .[2] cvsh_src/img/io/img_io_save_bmp cvsh_src/util/util_bmp
cvsh_src/avf/avf_workerDllAdapter [2:1] [2:1]
.[6]
.[1]

.[1] .[1]
.[1]
cvsh_src/ccam/par/ccam_par_fixed .[3] .[3] cvsh_src/img/io/img_io_load_bmp
[2:1] cvsh_src/ccam/par/ccam_par
.[1] cvsh_src/img/io/img_io_save_pxm
[2:1]
[2:1]
.[2] cvsh_src/ccam/pt/ccam_pt
.[1] [2:1] .[1]
.[1] .[3]
.[1]

.[2] cvsh_src/grid/draw/grid_draw_file .[19]


.[4]
cvsh_src/ccam/pt/ccam_pt_dpAsc cvsh_src/grid/draw/grid_draw_w32 [2:1]
[2:1] [2:1]
.[1]
.[2]
.[2] cvsh_src/cvsh/cvsh_createAlg .[1]
.[1]
.[2] cvsh_src/img/io/img_io_save
.[3] [2:1] [2:1]
cvsh_src/img/io/img_io_load .[2]
.[3] .[10]
[2:1] .[1]

cvsh_src/ext/ipv/ext_ipv_libmastif .[2]
cvsh_src/lib/avi/vd_file_avi cvsh_src/ext/ipv/ext_ipv_libmastif_dummy .[1] .[2]
[2:1]
[2:1] .[3]
.[1]
cvsh_src/grid/draw/grid_draw_rgb .[2] cvsh_src/grid/draw/grid_draw_colours
cvsh_src/ext/ipv/ext_ipv_libmastif_test .[2]
cvsh_src/ext/signsHSI/alg_signsHSI .[3] [2:1] [2:1]
.[1] .[3]
.[5] .[1] .[2] .[4]
cvsh_src/ext/signsHSI/narastanje
cvsh_src/ext/libvs/ext_libvs_test [2:1]
.[9] .[2]
.[3] cvsh_src/vd/vd_file_single .[2]
.[1] [2:1] cvsh_src/ext/signsHSI/nadjiBoju
.[1] [2:1]
cvsh_src/vd/vd_file_srs .[3] cvsh_src/vd/vd_file .[3] .[2]
[2:1] [2:1] .[1] .[1]
cvsh_src/ext/signsHSI/RGBtoHSI
.[4] [2:1]
.[2]
.[5] cvsh_src/util/util_string
.[4] cvsh_src/vd/vd_base .[1] [2:1]
[2:1]
.[2]
.[3] .[1] .[3]
.[4] .[1]
.[1]
.[2] .[2] .[7] .[1]

cvsh_src/vd/vd_win cvsh_src/img/io/img_io_save_util cvsh_src/vs/vs_grab_test


[2:1] cvsh_src/ccam/pt/ccam_pt_calib [2:1]
.[10] [2:1]

.[2] .[11] cvsh_src/lib/imgio/img_io_load_jpeg


cvsh_src/ui/ui .[11] cvsh_src/cvsh/cvsh_createVD
[2:1] [2:1] .[3] .[1]
cvsh_src/img/io/img_io_load_pxm
cvsh_src/ext/libvs/ext_libvs_interface .[1]
[2:1]
.[1] cvsh_src/lib/imgio/img_io_load_png

.[1]
.[1]
.[2] .[4] cvsh_src/cli/cli_wrapAbstract
.[14] cvsh_src/avf/avf_createCcam
[2:1] .[3]
.[1]

.[1] .[1]
.[3] cvsh_src/ccam/pt/ccam_pt_visca .[2]
[2:1] .[1]
.[5] cvsh_src/cli/cli_wrap
[2:1]
cvsh_src/ccam/pt/ccam_pt_mgr
cvsh_src/ext/libvs/ext_libvs_interface_jni [2:1] .[4]
[2:1] .[1]
.[1] cvsh_src/util/util_fs_unix cvsh_src/util/util_fs
.[1]
.[2] [2:1]
.[4] .[2] cvsh_src/ext/rs232/rs232_util
.[1]
cvsh_src/cvsh/cvsh_main cvsh_src/ccam/visca/ccam_visca_directMgr [2:1]
[2:1]
cvsh_src/cli/cli_parser .[1]
[2:1] .[1] .[1]
.[3] .[1] cvsh_src/ccam/visca/ccam_visca_interface

.[1]
cvsh_src/avf/avf_main
.[3] cvsh_src/ext/rs232/w32/rs232_w32_imp
cvsh_src/vs/vs_file_util .[1] [2:1]
.[2] .[6] cvsh_src/ccam/visca/ccam_visca_direct .[1]
.[8] [2:1]
.[2] [2:1]
.[17] cvsh_src/ext/rs232/w32/rs232_w32
.[1] [2:1] .[1]
cvsh_src/cvsh/cvsh_createVS .[2] cvsh_src/ext/rs232/rs232
[2:1] cvsh_src/thr/thr_base cvsh_src/alg/alg_dllStub [2:1]
[2:1] .[3]
.[1] .[9]
.[1] .[2] cvsh_src/ext/rs232/unix/rs232_unix
cvsh_src/util/util_os cvsh_src/avf/avf_workerDllStub [2:1] .[1] cvsh_src/ext/rs232/unix/rs232_unix_low
.[2] cvsh_src/cli/cli_dev .[1]
.[1] [2:1] cvsh_src/ext/rs232/w32/rs232_w32_test [2:1]
[2:1] .[1]
.[2]
cvsh_src/vs/vs_file_single .[3]
.[1]
cvsh_src/thr/thr_base_test [2:1]
.[2]
cvsh_src/ui/ui_cmd
[2:1] cvsh_src/vs/vs_file_txt .[4] cvsh_src/ext/klt/birch/klt_util
.[2] [2:1] cvsh_src/vs/vs_file_many [2:1]
.[3] [2:1] .[8]
.[1] .[10]
cvsh_src/vs/vs_file_dir .[1] .[2] cvsh_src/ext/klt/birch/klt
cvsh_src/util/util_fs_w32 cvsh_src/ext/klt/birch/storeFeatures
.[3] [2:1] cvsh_src/ext/rs232/unix/rs232_unix_test [2:1]

.[9] .[6] cvsh_src/ext/klt/birch/base


cvsh_src/ext/klt/birch/convolve
cvsh_src/util/util_dll [2:1] .[7]
.[23]
.[1] cvsh_src/ext/klt/birch/error
cvsh_src/util/util_dll_w32 .[6] cvsh_src/ext/klt/birch/pyramid
cvsh_src/ext/klt/birch/trackFeatures
.[6] [2:1]
cvsh_src/thr/thr_primitives_w32 .[1] .[1]
cvsh_src/util/util_dll_unix
cvsh_src/ext/klt/birch/selectGoodFeatures .[9]

cvsh_src/thr/thr_primitives_unix .[1]
cvsh_src/thr/thr_primitives
.[1]

Uvodno predavanje → Motivacija (4) 7/30


MOTIVACIJA: PRIMJER 3
Do dobre koncepcije dolazimo apstrakcijom (skrivanjem nebitnog)

Moderni programski okviri apstrahiraju programske biblioteke i


sklopovske arhitekture (klijentski kod ne mora znati za to)
Python/ C++/
Java, Go, ...
numpy libstdc++

Tensorfow execution engine

Eigen OpenBLAS cuDNN

OpenMP CUDA

CPU GPU

Tema kolegija: načela i pristupi za ostvarivanje korisnih apstrakcija.


Uvodno predavanje → Motivacija (5) 8/30
MOTIVACIJA: OOUP
Zašto mislim da bi vam ovaj kolegij mogao biti interesantan?
□ Ciljana publika: budući profesionalni programeri
□ Činjenica: jednostavni programi napisani (sazrijevanje!)
(početni položaji zauzeti, ad-hoc pristupi ne pale)
□ Zaposlenje 1: održavanje mastodonta
(stabilno okruženje, razumijevanje postojeće organizacije)
□ Zaposlenje 2: rad na novom ambicioznom proizvodu
(dinamično okruženje, prilagođavanje organizacije domeni)
□ U oba slučaja težimo održivoj evoluciji proizvoda
□ Vidjet ćemo da ključ uspješne evolucije predstavlja adekvatna
programska organizacija!

Uvodno predavanje → Motivacija (6) 9/30


MOTIVACIJA: FOKUS OOUP-A
Fokus predmeta: organiziranje komponenata u veći sustav
□ koristit ćemo idiomatski pristup s vrha prema dnu;
razmatrat ćemo rješenja: načela, idiome, obrasce
□ treba nam duboko poznavanje tehnika koje omogućavaju
oblikovanje fleksibilnih programskih komponenata
□ mogu se 'saviti' kako bi 'upile' promjene
□ mogu se koristiti na različite načine
□ posebnu pažnju ćemo pokloniti dinamičkom polimorfizmu
□ mehanizme izvedbe u C++-u i Pythonu proučava prva laboratorijska
vježba

Uvodno predavanje → Motivacija (7) 10/30


MOTIVACIJA: JEZIK VS OBLIKOVANJE

Zašto poznavanje mehanike jezika nije dovoljno?


□ uspješni jezici su nesavršeni i opterećeni prošlošću
□ dani problem se može izvesti na mnogo korektnih načina:
jezični pokazatelji za njihovo vrednovanje prelokalni i nedovoljni!
□ primjer standardne biblioteke C-a: zašto gets ne valja?
NAME
gets - get a string from standard input ( DEPRECATED )

SYNOPSIS
char * gets ( char * s );

DESCRIPTION
Never use this function .

□ nema garancije da jezično korektna i jasna komponenta ima


zadovoljavajuća svojstva i u širem oblikovnom kontekstu!

Uvodno predavanje → Motivacija (8) 11/30


MOTIVACIJA: JEZIK VS OBLIKOVANJE (2)
Primjer: komponenta Image izravno koristi vanjsku biblioteku acmePdf v1.0

class Image {
// ...
void load ( char const * path );
};
void Image :: load ( char const * path ){
switch ( util :: extension ( path )){
// ...
case " pdf " :{
ImageFmt fmt ;
acmePdfGetFmt ( path , fmt );
this - > reformat ( fmt );
acmePdfLoad ( path , this -> getBuffer ());
}
};

Ovakve ovisnosti o vanjskim komponentama mogu stvoriti probleme.


□ procjena razvojnog napora za libpoppler (pdf reader, GPL): 50+
osoba-godina (COCOMO).
Uvodno predavanje → Motivacija (9) 12/30
MOTIVACIJA: JEZIK VS OBLIKOVANJE (3)
Razmotrimo sljedeći (sasvim mogući) scenarij:
□ u acmePdf v1.0 otkriveni neugodni bugovi
□ acmePdf v2.0 izdan pod nezgodnom licencom
□ korisnici naše komponente su u nevolji (vendor lock-in anti pattern)

Neki korisnici mogu podnijeti višu cijenu, drugi ne: odjednom imamo
dvije verzije komponente (glavobolja za održavanje)
Rješenje:
□ izdvojiti metodu load u zasebnu komponentu
□ ta komponenta mora ispitati je li acmePdf dostupna (introspekcija)
□ u slučaju nedostupnosti bacamo iznimku

Nema garancije da jezično korektna i jasna komponenta ima


zadovoljavajuća svojstva i u širem oblikovnom kontekstu!

Uvodno predavanje → Motivacija (10) 13/30


SADRŽAJ UVODNOG PREDAVANJA
□ Motivacija za načela i obrasce programskog oblikovanja:
□ problemi vezani uz složenost interakcije među komponentama
□ obuzdavanje složenosti apstrakcijom i organizacijom
□ Oblikovne osnove za ublažavanje interakcijskih problema:
□ ne-funkcionalni zahtjevi: ne odnose se na funkcionalnost sustava
□ utjecaj tih zahtjeva na dinamiku razvoja
□ Uklapanje oblikovanja u razvojne procese:
□ kako i kada planirati organizaciju programa?
□ usporedba "lakih" i "teških" razvojnih modela (metodologija)
□ O predmetu:
□ glavne teme, pretpostavljeno znanje
□ način održavanja nastave, razdioba bodova, literatura

Uvodno predavanje → Sadržaj uvodnog predavanja 14/30


OBLIKOVNE OSNOVE: CILJEVI RAZVOJA
Koja svojstva programskog sustava želimo ostvariti?
1. korektnost: program obavlja svoj posao
(algoritmi, strukture podataka)
2. zadovoljavajuća performansa: program radi dovoljno brzo
(napredni algoritmi i strukture podataka, arhitektura računala)
3. ugodan izgled: lijepo korisničko sučelje
(ergonomija, grafičko oblikovanje)
4. lako održavanje: razumijevanje, ispitivanje, popravljanje
(programsko oblikovanje, dokumentacija)
5. fleksibilnost (podatnost): lako nadograđivanje, toleriranje
promjena
(programsko oblikovanje)
Statička (1-3) vs. dinamička (4-5) svojstva programa
Organizacija - ključ dinamike programskog sustava!

Uvodno predavanje → Oblikovne osnove 15/30


OBLIKOVNE OSNOVE: VAŽNOST DINAMIKE RAZVOJA
Dinamička svojstva su važna jer se pokazuje da se do dobrih programa
ne dolazi ``iz prve''

Primjer realnog scenarija nakon pola godine razvoja:


□ nepotpuna korektnost:
(polovična funkcionalnost, novi zahtjevi, bube švabe)
□ brzina možda i prihvatljiva
□ korisnici nezadovoljni lakoćom korištenja

Uz malo dobre sreće, v1.0 može biti prihvatljiva


□ investitori pristaju financirati novu verziju
□ čvrsti uvjet nastavka: dinamička svojstva programa!

Uvodno predavanje → Oblikovne osnove 16/30


OBLIKOVNE OSNOVE: VAŽNOST DINAMIKE RAZVOJA (2)
Zanimljiva priča iz života:
□ 1998: Google se ponudio Yahoou za 1e6US$
□ Page i Brin (tada znanstveni novaci) su htjeli nastaviti studij...
□ Yahoo odbija, Page i Brin u garaži prijateljice otvaraju d.o.o
□ 2002: Yahoo nudi Googleu 3e9US$
□ Google traži 5e9US$
□ Yahoo odbija
□ 2008: Microsoft nudi Yahoou 40e9US$
□ Yahoo odbija, Microsoft kupuje Fast za 1.2e9US$
□ 2018: Google vrijedi preko 500e9US$
□ Yahoo prodan za 5e9US$ (2016)

Google je nadjačao Yahoo (i ostale) jer se brže i bolje razvijao:


□ bolji program za indeksiranje interneta (engl. web crawler)

□ bolji algoritam za rangiranje stranica (pagerank)


□ bolje i brže korisničko sučelje (kratki kontekst, samo jedna slika)
Uvodno predavanje → Oblikovne osnove (2) 17/30
OBLIKOVNE OSNOVE: KAKO POSTIĆI DOBRU DINAMIKU
Dobru dinamiku programskog projekta omogućit će kôd:
□ kojeg je lako ispitati (engl. testable)
□ koliko brzo možemo provjeriti sumnju da komponenta X ne radi?
□ kojeg je lako razumjeti (engl. readable)
□ hoće li se snaći programer kojeg smo zaposlili prošli tjedan?
□ kojeg je lako popraviti odnosno izmijeniti (engl. maintainable)
□ koliko brzo možemo onemogućiti zbrajanje popusta?
□ kojeg je lako nadograditi (engl. extensible)
□ ako promijenimo A, hoćemo li morati mijenjati B, C, D?
Navedena svojstva (tzv. -ilities, non-functional requirements) postižu se
prikladnom organizacijom!
□ to je upravo predmet proučavanja našeg kolegija

Nabrojali smo dobra svojstva gotovih programa;


kako do takvih programa doći?

Uvodno predavanje → Oblikovne osnove (3) 18/30


SADRŽAJ UVODNOG PREDAVANJA
□ Motivacija za načela i obrasce programskog oblikovanja:
□ problemi vezani uz složenost interakcije među komponentama
□ obuzdavanje složenosti apstrakcijom i organizacijom
□ Oblikovne osnove za ublažavanje interakcijskih problema:
□ ne-funkcionalni zahtjevi: ne odnose se na funkcionalnost sustava
□ utjecaj tih zahtjeva na dinamiku razvoja
□ Uklapanje oblikovanja u razvojne procese:
□ kako i kada planirati organizaciju programa?
□ usporedba "lakih" i "teških" razvojnih modela (metodologija)
□ O predmetu:
□ glavne teme, pretpostavljeno znanje
□ način održavanja nastave, razdioba bodova, literatura

Uvodno predavanje → Sadržaj uvodnog predavanja 19/30


PROCES: KLASIČNO VS AGILNO OBLIKOVANJE
Model razvojnog procesa propisuje smjernice razvoja programa

□ Royce 1970 - vodopadni model:


zahtjevi → oblikovanje → izvedba →
ispitivanje → održavanje
□ 198x,199x: iterativne modifikacije
vodopadnog modela
□ 21. stoljeće: pojava agilnih razvojnih procesa
□ iterativno dodavanje prioritetne funkcionalnosti:
piecemeal growth vs. masterplan
□ kratke iteracije, dnevna testiranja, česta komunikacija,
prilagodljivost, tehnička izvrsnost
□ prihvaćanje realnosti: promjenljivi zahtjevi, nepredvidljivi problemi,
heterogenost razvojnog tima, ...

Uvodno predavanje → Proces 20/30


PROCES: AGILNI MODELI
Nedostatci (i "nedostatci") agilnih modela razvojnog procesa:
□ nema garancije da program stvarno radi!
(što ako se bug manifestira u avionu na 3000m visine?)
□ fokus na kôd, umjesto na oblikovanje: divlji zapad!

Prednosti agilnih modela razvojnog procesa:


□ agilni modeli zahtijevaju kontinuirano oblikovanje
□ u početku malo znamo o domeni i ne možemo oblikovati
□ ideja: svjesno alocirati resurse u ovisnosti o odnosu između cijene
razvoja i prihvatljivog rizika
□ nema garancije da agilno razvijeni program uistinu radi, ali to ne
nude ni alternativni pristupi
Uvodno predavanje → Proces 21/30
PROCES: EVOLUCIJA, INOVACIJA
Činjenica: uspješni programi današnjice nastali evolucijom
□ Windows Vista (50 MLoC) ← 86-DOS (1980)
□ Linux 2.6 (5 MLoC) ← Linux 0.01 (1991, 10 KLoC)

Zaključak: programiranje nije slično građevinarstvu!


□ bar ne toliko koliko to implicira vodopadni model
□ za konkurentnost potrebna konstantna inovacija!
(naše implementacije lako se kopiraju i prepravljaju)

Naš prirodni habitat je fronta tehnološke ekspanzije


□ profit se odselio s osobnog računala: tablični kalkulator je davno
napisan (VisiCalc, 1979, 7e5 primjeraka, Apple II)
□ mobilne platforme, oglašavanje, umrežene aplikacije;
razumijevanje slike, govora, prirodnog jezika; napredne ugrađene i
robotičke primjene...
Uvodno predavanje → Proces (2) 22/30
PROCES: SLOCCOUNT LINUX
sloccount linux-2.6.28.7 (kazala)
SLOC Directory SLOC -by - Language ( Sorted )
3340479 drivers ansic =3336030 , yacc =1688 , asm =1136 , perl =829 , lex =779 ,
sh =17
1338785 arch ansic =1127349 , asm =209975 , sh =615 , yacc =307 , lex =300 ,
awk =96 , python =45 , pascal =41 , sed =29 , perl =28
545820 fs ansic =545820
377581 net ansic =377581
356592 sound ansic =356409 , asm =183
250442 include ansic =248816 , cpp =1515 , pascal =75 , asm =36
74639 kernel ansic =74334 , perl =305
36459 mm ansic =36459
32743 crypto ansic =32743
25316 security ansic =25316
24193 scripts ansic =14432 , perl =4707 , cpp =1791 , sh =1175 , yacc =967 ,
lex =742 , python =379
17146 lib ansic =17146
10742 block ansic =10742
7712 Documentation ansic =5615 , sh =1022 , perl =857 , lisp =218
5243 ipc ansic =5243
2658 virt ansic =2658
2283 init ansic =2283
1803 firmware asm =1598 , ansic =205
833 samples ansic =833
493 usr ansic =491 , asm =2
Uvodno predavanje → Proces (3) 23/30
SADRŽAJ UVODNOG PREDAVANJA
□ Motivacija za načela i obrasce programskog oblikovanja:
□ problemi vezani uz složenost interakcije među komponentama
□ obuzdavanje složenosti apstrakcijom i organizacijom
□ Oblikovne osnove za ublažavanje interakcijskih problema:
□ ne-funkcionalni zahtjevi: ne odnose se na funkcionalnost sustava
□ utjecaj tih zahtjeva na dinamiku razvoja
□ Uklapanje oblikovanja u razvojne procese:
□ kako i kada planirati organizaciju programa?
□ usporedba "lakih" i "teških" razvojnih modela (metodologija)
□ O predmetu:
□ glavne teme, pretpostavljeno znanje
□ način održavanja nastave, razdioba bodova, literatura

Uvodno predavanje → Sadržaj uvodnog predavanja 24/30


O PREDMETU
Što ćemo proučavati?
□ elementi programske organizacije na razinama komponente
(.5 kLoC), te paketa ili podsustava (5 kLoC)
□ pretpostavljamo izvorni kôd opće namjene
□ komponente mogu biti dio mobitelske aplikacije, ugradbenog
uređaja, autonomnog robota, istraživačkog kôda, ...
□ organizacijska načela, te oblikovni obrasci kojima se ona postižu
za učestale razrede problema
□ izabrane programske tehnike za ostvarivanje oblikovnih ciljeva
(polimorfizam, dinamičke biblioteke, ugovorno oblikovanje)

Gradivo je većim dijelom agnostično s obzirom na operacijski sustav,


programski jezik i model razvojnog procesa.
Pretpostavljamo osnovna znanja iz domene objektno orijentiranog
programiranja (dinamički polimorfizam ćemo temeljito ponoviti).

Uvodno predavanje → O predmetu 25/30


O PREDMETU: UVJETI, BODOVI
Aktivnosti: predavanja, vježbe (C, C++, Python, Java, ?), međuispit,
završni ispit, klasični ispit

Kalendar nastave:
kraj ožujka: L1 Kontinuirana provjera:
sredina travnja: L2 laboratorij: 10 (A) + 10 (B)
kraj travnja: MI ispiti: 40, 40
sredina svibnja: L3 preduvjet: 40% laboratorija
početak lipnja: L4
Klasični ispit:
sredina lipnja: ZI
preduvjet: 50% laboratorija
početak srpnja: KI

Ocjenjivanje: 2: 50%, 3: 63%, 4: 76%, 5: 89%.

Mogućnost dobivanja bonus bodova za: korisne sugestije, prijedloge


novih tema ili vježbi, ekstra zadatke, seminare.

Uvodno predavanje → O predmetu 26/30


O PREDMETU: PLAN
Što ćemo raditi tijekom ovog semestra?
1. načela programske organizacije:
□ motivacijski primjer, tehnike programiranja
□ načela logičkog i fizičkog oblikovanja
2. osnovni oblikovni obrasci
3. ostali oblikovni obrasci
Vježbe će se izvoditi u C-u, C++-u, te Pythonu ili Javi
□ neke vježbe treba izvesti u C-u (1.1, 3.1.1) i C++-u (1.3-1.5)
(pogledajte cppčpp, javite kako da ga poboljšamo)
□ možete riješiti samo jednu od vježbi 3.1.2, 3.1.3, i 3.1.4
□ ostale vježbe možete pisati u proizvoljnom jeziku
□ prevoditelj i operacijski sustav su proizvoljni
□ termin za nadoknadu jedne vježbe: krajem semestra

Uvodno predavanje → O predmetu (2) 27/30


O PREDMETU: LITERATURA
Obrasci i načela 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
□ 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

Uvodno predavanje → O predmetu (3) 28/30


O PREDMETU: LITERATURA (2)
Modeli razvojnog procesa
□ 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

Uvodno predavanje → O predmetu (4) 29/30


O PREDMETU: LITERATURA (3)
Literatura: C++, generičko programiranje
□ [More] Effective {C++|STL}; S. Meyers; Addison Wesley; 1996
□ Inside the C++ object model; Stanley Lippman; Addison-Wesley
Professional; 1996
□ Effective Modern C++; S. Meyers; O’Reilly Media; 2014
□ C++ FAQs; Marshall P. Cline, Greg Lomow, Mike Girou;
Addison-Wesley Professional; 1998
□ Demistificirani C++; Julijan Šribar i Boris Motik; Element; 2006
□ Generic Programming and the STL: Using and Extending the C++
Standard Template Library; Addison-Wesley Professional;
Matthew H. Austern; 1998
□ C++ Templates: The Complete Guide; David Vandevoorde, Nicolai
M. Josuttis Addison-Wesley Professional; 2002

Uvodno predavanje → O predmetu (5) 30/30

You might also like