Oblikovni obrasci u programiranju - Zavod za elektroniku ...ssegvic/pubs/ooup0Intro.pdf ·...
Transcript of Oblikovni obrasci u programiranju - Zavod za elektroniku ...ssegvic/pubs/ooup0Intro.pdf ·...
Oblikovni obrasci u programiranjuUvodno predavanje
Siniša Šegvić
Sveučilište u ZagrebuFakultet elektrotehnike i računarstvaZavod za elektroniku, mikroelektronikuračunalne i inteligentne sustave
→ 1/28
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
□ Značaj oblikovanja u razvojnim procesima:□ 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/28
Motivacija: problemiZaš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/28
Motivacija: složenost [brooks95]Složenost interakcije je nezaobilazna poteškoća razvoja programa:
□ implementirati jedan program s 30 funkcionalnosti puno teže nego30 programa s po jednom funkcionalnošću(funkcionalnosti međudjeluju, najčešće negativno)
□ ne postoji tehnologija koja ćepovećati produktivnostprogramskog inženjerstva za redveličine u sljedećih 10 godina(no silver bullet)
□ ako projektu koji kasni dodijelimonove inženjere --- kašnjenje će sepovećati (mythical man-month)
□ jedan pristup bio bi izdvojiti funkcionalnosti u zasebne programe ipovezati ih skriptnim jezikom (ali to ne možemo uvijek!)
□ tema kolegija: pristupi za smanjivanje međuovisnostikomponenata te ublažavanje njenih štetnih efekata
Uvodno predavanje → Motivacija 4/28
Motivacija: primjer 1Složenost je svud oko nas; evo kakvim grafom poziva funkcijabiblioteke rezultira dohvat jedne jedine stranice preko http protokola:
□ primjer dodatka: uvođenje nove metode autentikacije
http://mattiasgeniar.be/2008/11/09/system-calls-in-apache-linux-vs-iis-windows/
Uvodno predavanje → Motivacija (2) 5/28
Motivacija: primjer 2aZašto je složenost programskog sustava problematična?
subversion/libsvn_fs_base/err[2:1]
subversion/libsvn_fs_base/id[2:1]
.[32]
subversion/libsvn_fs_fs/dag[2:1]
subversion/libsvn_fs_fs/fs_fs[2:1]
.[18]
subversion/libsvn_fs_base/bdb/reps-table[2:1]
subversion/libsvn_fs_base/bdb/bdb-err[2:1]
.[39]
subversion/libsvn_fs_base/fs[2:1]
.[306]
subversion/libsvn_fs_base/lock[2:1]
subversion/libsvn_fs_base/bdb/lock-tokens-table[2:1]
.[163]
subversion/libsvn_fs/fs-loader[2:1]
subversion/libsvn_fs_base/reps-strings[2:1]
.[32]
subversion/libsvn_fs_fs/tree[2:1] .[13]
subversion/libsvn_fs_base/bdb/node-origins-table[2:1]
.[8]
subversion/libsvn_fs_base/uuid[2:1]
subversion/libsvn_fs_base/bdb/uuids-table[2:1].[17]
subversion/libsvn_fs_base/dag[2:1] subversion/libsvn_fs_base/node-rev
[2:1]
.[29]
subversion/libsvn_fs_base/tree[2:1]
.[159]
subversion/libsvn_fs_base/bdb/strings-table[2:1] .[8]
subversion/libsvn_fs_fs/fs[2:1]
subversion/libsvn_fs_fs/lock[2:1]
.[18]
subversion/libsvn_fs_base/util/fs_skels[2:1]
.[3]
subversion/libsvn_fs_base/bdb/rev-table[2:1]
.[9]
subversion/libsvn_fs_fs/err[2:1]
subversion/libsvn_fs_fs/id[2:1]
.[10]
subversion/libsvn_fs_base/bdb/dbt[2:1]
subversion/libsvn_fs_base/util/skel[2:1]
.[16]
.[1]
subversion/libsvn_fs_base/bdb/env[2:1]
.[2]
subversion/libsvn_fs_fs/key-gen[2:1]
subversion/libsvn_fs_base/bdb/changes-table[2:1]
.[11]
subversion/libsvn_fs_base/bdb/nodes-table[2:1]
.[11]
.[13]
.[4]
.[2]
subversion/libsvn_fs_base/revs-txns[2:1]
.[292]
.[7]
subversion/libsvn_fs_base/trail[2:1]
.[15]
.[22]
subversion/libsvn_fs_base/bdb/copies-table[2:1]
.[14]
.[28]
.[3]
.[4]
subversion/libsvn_fs_base/key-gen[2:1]
.[9]
.[19]
subversion/libsvn_fs_base/bdb/locks-table[2:1] .[177]
subversion/libsvn_fs_util/fs-util
.[1]
.[8]
.[16]
.[13]
.[3]
.[170]
.[23]
subversion/libsvn_fs_base/bdb/bdb_compat[2:1]
.[16]
.[146]
.[5]
.[5]
.[7]
subversion/libsvn_fs_base/bdb/txn-table[2:1]
.[122]
subversion/libsvn_fs/access
.[1]
.[51]
.[9]
.[26]
.[28]
.[14]
(graf ovisnosti komponenata jednog paketa biblioteke libsvn)
Uvodno predavanje → Motivacija (3) 6/28
Motivacija: primjer 2bZato što iza jedne stanovite granice složenosti struktura programapostaje neprozirna...
cvsh_src/grid/draw/grid_draw_colours[2:1]
cvsh_src/img/io/img_io_load_pxm
cvsh_src/img/img_util[2:1]
.[3]
cvsh_src/img/io/img_io_load[2:1]
.[2]
cvsh_src/img/access/img_access_pix
cvsh_src/ui/ui_report[2:1]
cvsh_src/ui/ui_reportAbstract
.[1]
cvsh_src/alg/alg_base[2:1]
.[5]
cvsh_src/math/tnt/math_tnt[2:1]
cvsh_src/ext/noise/ipp_attenuate[2:1]
cvsh_src/ipp/ipp_loop
.[3]
.[1]
cvsh_src/img/access/img_access_dispatch
.[2]
cvsh_src/img/access/img_access_comb
.[1]
cvsh_src/img/img_dbg[2:1]
.[2]
cvsh_src/ext/rs232/unix/rs232_unix_low[2:1]
cvsh_src/lib/grab/vs_grab_w32MCI[2:1]
.[2]
cvsh_src/vs/vs_grab[2:1]
.[2]
cvsh_src/util/util_bmp[2:1]
.[1]
cvsh_src/ipp/ipp_histogram[2:1]
.[5]
cvsh_src/util/util_cxx[2:1]
.[1]
.[2]
.[1]
cvsh_src/win/root/win_wrap[2:1]
cvsh_src/win/root/win_base[2:1]
.[7]
cvsh_src/lib/avi/vs_file_wmv_w32
cvsh_src/lib/avi/vs_file_wmv
.[1]
cvsh_src/util/util_registry[2:1]
.[1]
.[2]
cvsh_src/ext/klt/old/klt/example3
cvsh_src/ext/klt/old/klt/klt[2:1]
.[2]
cvsh_src/avf/avf_workerDllAdapter
cvsh_src/avf/avf_worker[2:1]
.[2]
cvsh_src/util/util_string[2:1]
.[1]
cvsh_src/ext/libvs/ext_libvs_interface_jni[2:1]
cvsh_src/ext/libvs/ext_libvs_interface[2:1]
.[1]
cvsh_src/ext/lines/ipp_wpht[2:1]
cvsh_src/grid/root/grid_primitives[2:1]
.[1]
cvsh_src/img/access/img_access_wrap
.[1]
.[2]
cvsh_src/img/access/img_access_guard
.[1]
cvsh_src/ext/canny/ext_canny[2:1]
cvsh_src/ipp/ipp_mask[2:1]
.[1]
cvsh_src/ipp/ipp_addMask[2:1]
.[1]
cvsh_src/ipp/ipp_vector[2:1]
.[1]
cvsh_src/img/access/img_access_copy[2:1]
.[3]
cvsh_src/ipp/ipp_binarize[2:1]
.[1]
cvsh_src/ext/canny/ipp_histeresis[2:1]
.[2]
cvsh_src/ext/canny/ipp_nms[2:1]
.[2]
cvsh_src/ext/canny/ipp_convolve_gauss[2:1]
.[1]
cvsh_src/ipp/ipp_values[2:1]
.[3]
cvsh_src/ext/canny/ipp_gradient[2:1]
.[1]
cvsh_src/ext/sift/alg_sift
cvsh_src/util/util_time
.[1]
.[1]
.[1]
.[1]
cvsh_src/ext/sift/ext_sift_keypoint_util[2:1]
.[2]
cvsh_src/math/la/math_la2D[2:1]
.[1]
cvsh_src/alg/alg_types[2:1]
.[2]
.[2]
cvsh_src/win/event/win_event_abstract
.[1]
cvsh_src/ext/sift/ext_sift_base[2:1]
.[1]
cvsh_src/vs/vs_file_srs[2:1]
cvsh_src/vs/vs_file[2:1]
.[1]
cvsh_src/img/io/img_io_load_ras[2:1]
.[3]
cvsh_src/ext/klt/old/klt/error
cvsh_src/ext/harris/ipp_grad2ndMoment[2:1]
.[1]
.[2]
.[1]
.[2]
.[1]
cvsh_src/ext/zhang/avf_workerZhangTest
.[2]
cvsh_src/win/ann/win_ann[2:1]
.[1]
cvsh_src/ext/zhang/ipp_matchGrid[2:1]
.[2]
cvsh_src/ext/zhang/ext_zhang[2:1]
.[3]
.[2]
cvsh_src/win/event/win_event[2:1]
.[1]
cvsh_src/vs/vs_base[2:1]
.[1]
cvsh_src/lib/grab/vs_grab_macx1394_test
cvsh_src/lib/grab/vs_grab_macx1394[2:1]
.[3]
cvsh_src/ext/rs232/rs232[2:1]
cvsh_src/ccam/visca/ccam_visca_directMgr[2:1]
cvsh_src/ccam/visca/ccam_visca_direct[2:1]
.[1]
cvsh_src/ext/noise/ipp_noiseReplaceUniformMasked[2:1]
.[4]
.[1]
.[2]
.[1]
cvsh_src/ext/libvs/karla/hr_fer_zemris_mastif_LibVSInterface[2:1]
cvsh_src/grid/draw/grid_draw[2:1]
.[1]
cvsh_src/win/ann/win_ann_abstract
.[2]
cvsh_src/ext/harris/ipp_findPoints[2:1] .[4]
.[2]
.[2]
.[2]
cvsh_src/lib/grab/vs_grab_linux1394[2:1]
cvsh_src/util/util_debug[2:1]
.[1]
.[4]
.[3]
cvsh_src/avf/avf_workerPointCam[2:1] .[2]
.[1]
.[2]
.[1]
cvsh_src/ccam/pt/ccam_pt[2:1]
.[1]
.[1]
.[1]
cvsh_src/ipp/ipp_range[2:1]
.[8]
.[2]
.[3]
.[3]
cvsh_src/cli/cli_dev[2:1]
cvsh_src/ipp/ipp_projection[2:1]
.[1]
.[2]
.[1]
.[2]
cvsh_src/vd/vd_base[2:1]
cvsh_src/img/img_wrap[2:1]
.[4]
cvsh_src/ext/klt/old/klt/convolve[2:1]
.[5]
cvsh_src/ipp/ipp_annotations[2:1]
cvsh_src/grid/root/grid_region[2:1]
.[1]
.[2]
cvsh_src/ext/klt/old/klt/selectGoodFeaturescvsh_src/ext/klt/old/klt/pyramid
[2:1].[6]
cvsh_src/math/proj2d/math_proj2d_util[2:1]
.[2]
cvsh_src/lib/avi/vs_file_avi
.[1]
cvsh_src/vs/vs_file_dir[2:1]
cvsh_src/vs/vs_file_many[2:1].[3]
cvsh_src/ccam/pt/ccam_pt_calib[2:1]
.[3]
.[10]
cvsh_src/util/util_endian[2:1]
.[1]
.[2]
.[2]
cvsh_src/ext/sift/ext_sift_avLowe
.[1]
.[2]
.[3]
cvsh_src/vd/vd_file_single[2:1]
cvsh_src/vd/vd_file[2:1]
.[3]
cvsh_src/img/io/img_io_save_util[2:1]
.[11]
cvsh_src/cli/cli_wrap[2:1]
cvsh_src/cli/cli_wrapAbstract
.[1]
.[4]
cvsh_src/ext/klt/old/klt/example1
.[2]
cvsh_src/ext/canny/ext_cannyUtil[2:1]
.[4]
.[2]
cvsh_src/ext/klt/old/klt/klt_util[2:1]
.[31]
cvsh_src/alg/alg_dllStub
cvsh_src/util/util_dll
.[1]
.[1]
.[2]
.[4]
.[1]
.[3]
cvsh_src/ext/match/ext_match[2:1]
.[2]
.[2]
.[4]
.[8]
cvsh_src/math/la/math_la[2:1]
.[10]
.[19]
cvsh_src/ipp/ipp_regionGrowing[2:1]
.[11]
.[4]
.[5]
.[2]
.[2]
cvsh_src/lib/grab/vs_grab_linux1394_test.[2]
cvsh_src/lib/grab/vs_grabUtil[2:1]
.[1]
cvsh_src/ext/lines/alg_lines
.[1]
.[3]
cvsh_src/ext/lines/ext_linesUtil[2:1]
.[2]
.[1]
.[3]
cvsh_src/ipp/ipp_equalize[2:1]
.[1]
.[1]
.[5]
cvsh_src/alg/alg_crop
.[1]
.[1]
.[1]
.[2]
.[1]
.[2]
.[1]
.[4]
cvsh_src/util/util_math[2:1]
.[6]
cvsh_src/util/util_fs[2:1]
cvsh_src/util/util_ras[2:1]
.[1]
cvsh_src/alg/alg_multiplex
.[1]
cvsh_src/img/img_vector[2:1]
.[1]
.[3]
cvsh_src/alg/alg_rescale
cvsh_src/ipp/ipp_rescale[2:1]
.[1]
.[1]
.[2]
cvsh_src/ext/harris/ipp_harris[2:1]
.[1]
.[2]
.[1]
.[2]
cvsh_src/ext/klt/birch/base
cvsh_src/alg/alg_average
.[1]
cvsh_src/ipp/ipp_lincomb[2:1]
.[1]
.[1]
.[2]
cvsh_src/util/util_os[2:1]
cvsh_src/ext/klt/old/klt/example4
.[1]
.[4]
.[9]
.[2]
cvsh_src/ext/rs232/w32/rs232_w32_imp[2:1]
cvsh_src/ccam/pt/ccam_pt_test.[1]
cvsh_src/ext/canny/ipp_convolve[2:1]
.[1]
cvsh_src/ext/canny/ck/ipp_ck_2d[2:1]
.[1]
.[2]
.[1]
.[2]
cvsh_src/ext/noise/alg_noiseTS
.[1]
.[1]
.[1]
.[1]
cvsh_src/ipp/ipp_homography[2:1]
.[1].[1]
cvsh_src/win/ann/win_ann_util[2:1]
.[1]
cvsh_src/ext/noise/ipp_noiseAdditiveGaussian[2:1]
.[3]
.[4]
.[1]
.[1]
cvsh_src/ext/lines/ext_lines[2:1]
.[2]
cvsh_src/ext/canny/alg_canny
.[2]
.[1]
.[1]
.[3]
.[1]
cvsh_src/lib/avi/util_avi_unix
cvsh_src/lib/avi/util_avi.[1]
cvsh_src/ext/canny/ipp_convolve_hor[2:1]
cvsh_src/ext/canny/ipp_convolve_hor_gen[2:1]
.[8]
cvsh_src/alg/alg_projection
.[1]
.[1]
.[3]
cvsh_src/ipp/ipp_negate[2:1]
.[1]
.[1]
.[2]
.[1]
.[1]
.[5]
.[15]
.[1]
cvsh_src/img/access/img_access_util[2:1]
.[1]
.[2]
.[1]
.[1]
cvsh_src/ipp/ipp_add[2:1]
.[1]
.[2]
.[1]
.[2]
cvsh_src/ext/ipv/ext_ipt
cvsh_src/vs/vs_file_txt[2:1]
.[4] cvsh_src/ext/klt/birch/klt_util[2:1]
cvsh_src/ext/klt/birch/klt[2:1]
.[8]
cvsh_src/ext/zhang/avf_workerZhang
.[1]
.[1]
.[5]
.[3]
.[2]
cvsh_src/ext/zhang/ipp_locateCircles[2:1]
.[1]
.[1]
cvsh_src/ipp/ipp_subsample[2:1]
.[2]
.[1]
.[1]
cvsh_src/grid/draw/grid_draw_x[2:1]
.[1]
cvsh_src/ext/canny/ipp_convolve_ver[2:1]
cvsh_src/ext/canny/ipp_convolve_ver_gen[2:1]
.[10]
cvsh_src/ccam/par/ccam_par[2:1]
.[2]
.[3]
cvsh_src/ext/klt/old/klt/storeFeatures.[2]
cvsh_src/grid/draw/grid_draw_file[2:1]
cvsh_src/grid/draw/grid_draw_rgb[2:1]
.[1]
.[3]
cvsh_src/lib/grab/vs_grab_w32PXC[2:1]
cvsh_src/util/util_w32[2:1]
.[3]
.[3]
.[1]
.[2]
.[1]
.[2]
.[2]
.[4]
cvsh_src/ext/canny/ck/ipp_ck_1d[2:1]
.[2]
.[2]
.[4]
cvsh_src/ccam/visca/ccam_visca_interface.[1]
cvsh_src/ext/rs232/rs232_util[2:1]
.[2]
cvsh_src/alg/alg_equalize
.[1]
.[1]
.[3]
.[1]
cvsh_src/ccam/par/ccam_par_fixed[2:1]
.[3]
cvsh_src/util/util_fs_w32
.[1]
cvsh_src/ext/klt/alg_klt
cvsh_src/ext/klt/ext_klt_view[2:1]
.[4]
.[1]
.[1]
.[1]
.[3]
cvsh_src/win/ann/win_ann_dump[2:1]
.[1]
.[1]
cvsh_src/ext/ipv/ext_ipv_libmastif[2:1]
.[1]
.[1]
.[1]
.[1]
.[1]
.[1]
cvsh_src/cvsh/cvsh_createAlg[2:1]
.[3]
cvsh_src/thr/thr_primitives_unixcvsh_src/thr/thr_primitives
.[1]
cvsh_src/ccam/pt/ccam_pt_visca[2:1]
.[1]
.[2]
.[5]
.[15]
cvsh_src/ext/signsHSI/alg_signsHSI
.[1]
.[1]
cvsh_src/ext/signsHSI/nadjiBoju[2:1]
.[1]
.[1]
cvsh_src/ext/signsHSI/RGBtoHSI[2:1]
.[1]
.[1]
.[3]
cvsh_src/ext/signsHSI/narastanje[2:1]
.[1]
cvsh_src/vs/vs_file_single[2:1]
.[9]
.[3]
.[7]
cvsh_src/math/proj2d/alg_homography_test
.[1]
cvsh_src/math/proj2d/math_proj2d_ann[2:1]
.[2]
.[2]
.[1]
.[1]
.[3]
.[1]
cvsh_src/util/util_dll_w32.[1]
cvsh_src/util/util_dll_unix.[1]
.[1]
cvsh_src/ipp/ipp_transform
.[1]
cvsh_src/img/img_vectorAbstract
.[2]
.[3]
.[4]
.[1]
cvsh_src/lib/avi/vs_file_wmv_unix
.[1]
.[1]
.[1]
cvsh_src/ext/steer/alg_steer
.[1]
.[1]
.[1]
.[1]
.[3]
.[2]
cvsh_src/math/la/math_la_util[2:1]
.[1]
cvsh_src/grid/draw/grid_draw_fileEps[2:1]
.[3]
.[2]
.[9]
.[2]
.[4]
.[2]
.[2]
.[6]
cvsh_src/ext/zhang/alg_matchGrid
.[1]
.[1]
.[6]
.[3]
.[1]
.[1]
.[4]
.[1]
cvsh_src/ipp/ipp_radial[2:1]
.[1]
.[1]
cvsh_src/vd/vd_win[2:1]
.[4].[3] .[1]
.[4]
cvsh_src/ext/ipv/alg_ipvIpt
.[1]
.[3]
.[1]
.[2]
.[1]
.[1]
.[2]
.[1]
cvsh_src/math/proj2d/math_proj2d_transform[2:1]
.[3]
cvsh_src/ext/klt/old/klt/example2
.[2]
cvsh_src/ipp/ipp_stretch[2:1]
.[1]
.[2]
.[1]
.[2]
cvsh_src/alg/alg_subsample
.[1]
.[1]
.[3]
.[6]
cvsh_src/win/w32/win_w32_worker[2:1]
.[1]
.[4]
.[3]
cvsh_src/win/event/win_event_queue[2:1]
.[2]
cvsh_src/thr/thr_base[2:1]
.[2]
cvsh_src/img/io/img_io_save_bmp[2:1]
.[1]
cvsh_src/grid/draw/grid_draw_w32[2:1]
.[1]
.[3]
.[3]
cvsh_src/ext/klt/old/klt/base
.[1]
.[2]
.[5]
cvsh_src/cli/cli_parser[2:1]
.[2]
.[5]
cvsh_src/math/proj2d/math_proj2d_homography[2:1]
.[10]
.[3]
cvsh_src/cvsh/cvsh_main
.[1]
cvsh_src/ui/ui[2:1]
.[14]
cvsh_src/ext/rs232/unix/rs232_unix[2:1] .[1]
.[3]
.[1]
.[1]
cvsh_src/ext/lines/ext_linesPartition[2:1] .[3]
.[1]
.[2]
cvsh_src/math/tnt/math_tnt_la[2:1]
.[2]
.[2]
cvsh_src/ext/lmdif/lmdif[2:1]
.[2]
cvsh_src/ext/signsHSI/alg_signsGT
.[1]
.[1]
.[1]
.[3]
cvsh_src/ext/harris/ext_harris[2:1]
.[1]
.[3]
.[1]
.[1]
.[1]
.[1]
.[2]
.[1]
cvsh_src/ext/harris/ipp_nms7x7[2:1]
.[1]
.[2]
.[2]
.[3]
.[1]
.[2]
.[1]
.[2]
.[3]
.[1]
.[1]
.[1]
.[2]
cvsh_src/ext/klt/ext_klt[2:1]
.[8]
.[2]
cvsh_src/lib/avi/vd_file_avi[2:1]
.[3]
.[1]
cvsh_src/ext/lines/ipp_wphtData[2:1]
.[1]
.[3]
cvsh_src/lib/imgio/img_io_load_png
.[2]
.[2]
cvsh_src/vs/vs_grab_test
.[1]
.[1]
cvsh_src/ext/harris/alg_harris
.[1]
.[1]
.[1]
.[3]
cvsh_src/ext/harris/ext_harrisUtil[2:1]
.[4]
cvsh_src/ext/klt/old/klt/trackFeatures
.[6]
cvsh_src/ext/ipv/ext_ipv_libmastif_dummy .[1]
cvsh_src/ext/zhang/ipp_morphRegion[2:1]
.[3]
.[1]
.[2]
.[1]
cvsh_src/ext/match/ext_match_sift[2:1]
.[1]
.[4]
cvsh_src/win/x/win_x_renderer[2:1]
cvsh_src/img/io/img_io_load_bmp
.[2]
.[2]
.[1]
cvsh_src/vd/vd_file_srs[2:1]
.[3]
.[1] cvsh_src/img/io/img_io_save_pxm[2:1]
.[10]
cvsh_src/img/io/img_io_save_ras[2:1]
.[5]
.[3]
cvsh_src/img/access/img_access_fill[2:1]
.[1]
.[2]
.[11]
.[1]
.[2]
cvsh_src/thr/thr_base_test
.[2]
cvsh_src/ext/rs232/w32/rs232_w32_test
cvsh_src/ext/rs232/w32/rs232_w32[2:1]
.[1]
.[37]
cvsh_src/ui/ui_cmd[2:1]
.[2]
cvsh_src/win/root/win_test
.[2]
.[1]
.[1]
.[1]
.[1]
.[1]
.[1]
cvsh_src/ext/lines/ipp_extractLines[2:1]
.[1]
.[1]
.[2]
.[1]
.[2]
cvsh_src/img/io/img_io_save[2:1]
.[1]
.[1]
cvsh_src/ext/klt/birch/trackFeaturescvsh_src/ext/klt/birch/pyramid
[2:1].[6]
cvsh_src/ccam/pt/ccam_pt_dumb[2:1]
.[2]
.[1]
cvsh_src/win/w32/win_w32[2:1]
.[5]
.[10]
.[1]
.[1]
cvsh_src/ipp/ipp_findMax[2:1]
.[1]
.[4]
.[2]
.[1]
.[2]
.[1]
.[1]
.[2]
.[12]
.[4]
.[6]
.[6]
.[2]
.[4]
.[4]
.[1]
.[1]
.[1]
.[1]
cvsh_src/cvsh/cvsh_createVD[2:1]
.[11]
.[2]
cvsh_src/alg/alg_decoratorScale[2:1]
.[2]
cvsh_src/cvsh/cvsh_createVS[2:1]
.[8]
cvsh_src/alg/alg_grayscale
.[1]
.[2]
cvsh_src/vs/vs_file_util[2:1]
.[9]
.[1]
.[2]
.[1]
.[3]
cvsh_src/ext/libvs/karla/v1/hr_fer_zemris_mastif_LibVSInterface
.[3]
.[3]
.[1]
.[2]
.[1]
.[1]
.[2]
.[10]
cvsh_src/ext/klt/old/klt/example5
.[2]
cvsh_src/win/x/win_x_thread[2:1]
.[1]
.[5]
.[1]
.[2]
.[1]
.[1]
cvsh_src/win/x/win_x_renderer_imlib[2:1]
.[2]
.[6]
cvsh_src/util/util_time_macx
.[1]
.[4]
cvsh_src/avf/avf_createCcam[2:1]
.[1]
.[3]
.[1]
.[2]
.[2]
cvsh_src/alg/alg_histogram
.[2]
.[1]
.[2]
cvsh_src/win/x/win_x_connection[2:1]
.[1]
.[4]
.[6]
.[2]
.[1]
.[2]
cvsh_src/ext/sift/ext_sift_keypoint[2:1]
.[1]
.[9]
cvsh_src/lib/grab/vs_grab_linuxV4L[2:1]
.[2]
.[3]
.[2]
.[2]
.[1]
.[2]
.[1]
.[4]
cvsh_src/grid/alg/grid_alg_rasterLine[2:1]
.[1]
cvsh_src/ext/libvs/ext_libvs_test
.[1]
.[2]
cvsh_src/lib/avi/util_avi_w32
.[1]
.[1]
.[3]
.[5]
.[1]
.[2]
cvsh_src/ext/klt/birch/storeFeatures.[2]
.[2]
.[1]
.[2]
.[2]
cvsh_src/ext/rs232/unix/rs232_unix_test
.[1]
.[6]
.[6]
.[5]
.[1]
.[3]
.[2]
.[2]
.[1]
.[3]
.[28]
.[19]
.[6]
cvsh_src/util/util_fs_unix .[1]
cvsh_src/ccam/pt/ccam_pt_dpAsc[2:1]
.[2]
.[2]
.[5]
.[1]
.[35]
.[1]
.[3]
.[3]
.[2]
.[1]
.[1]
.[2]
.[1]
.[1]
.[2]
.[1]
.[3]
.[5]
.[18]
.[1]
.[1]
.[2]
.[2]
cvsh_src/avf/avf_main
.[2].[1]
.[1].[3]
.[3]
.[2]
cvsh_src/util/util_time_linux
.[1]
.[60]
cvsh_src/lib/avi/vs_file_avi_unix
.[1]
.[1]
.[2]
.[1]
.[2]
cvsh_src/ext/klt/old/klt/main
cvsh_src/ext/klt/birch/convolve[2:1]
.[23]
.[1]
.[2]
.[1]
.[2]
cvsh_src/ext/ipv/ext_ipv_libmastif_test
.[1]
.[11]
.[5]
.[1]
.[2]
.[4]cvsh_src/ext/lmdif/lmdif_test.[1]
.[7].[9]
cvsh_src/ext/klt/old/klt/pnmio
.[14]
.[6]
.[10]
cvsh_src/ext/klt/birch/error
.[7]
cvsh_src/ext/match/alg_match
.[2]
.[2]
.[1]
.[1]
.[1]
.[1]
.[2]
.[2]
.[1]
.[4]
.[5]
.[1]
.[5]
cvsh_src/thr/thr_primitives_w32 .[1]
.[9]
.[2]
cvsh_src/ext/canny/ck/ipp_ck_gauss[2:1]
.[2]
cvsh_src/ext/empty/alg_empty
.[1]
.[1]
.[1]
.[2]
cvsh_src/lib/imgio/img_io_load_jpeg
.[2].[2]
.[3]
.[1]
.[1]
.[1]
cvsh_src/alg/alg_saver
.[1]
.[1]
.[5]
.[1]
.[2]
.[1]
.[1]
.[1]
.[1]
.[3]
.[1]
.[3]
.[2]
.[3]
.[2]
.[2]
.[3]
.[6]
cvsh_src/avf/avf_workerDllStub
.[1]
.[2]
.[1]
.[1]
.[1]
.[1]
.[2]
.[2]
cvsh_src/ext/klt/birch/selectGoodFeatures
.[6]
.[9]
cvsh_src/alg/alg_nop
.[1]
.[1]
.[2]
.[3]
.[1]
.[3]
.[2]
.[1]
.[2]
.[2]
cvsh_src/ext/ipv/alg_ipvTriangle
.[6]
.[1]
.[1]
.[3]
.[1]
.[3]
.[2]
.[2]
.[1]
.[2]
cvsh_src/ext/klt/old/klt/writeFeatures
.[4]
cvsh_src/ccam/par/ccam_param
cvsh_src/alg/alg_radial
.[1]
.[1]
.[1]
.[1]
.[3]
cvsh_src/lib/avi/vs_file_avi_w32
.[1]
.[1]
.[2]
.[1]
cvsh_src/util/util_time_w32 .[1]
cvsh_src/ext/match/ext_match_fake[2:1]
.[2]
.[1]
.[1]
.[1]
.[2]
.[1]
.[2]
.[7]
.[2]
cvsh_src/img/access/img_access_test
.[3]
.[1]
cvsh_src/win/x/win_x[2:1]
.[5]
.[1]
.[2]
.[17]
cvsh_src/ccam/pt/ccam_pt_mgr[2:1]
.[1]
.[1]
(graf ovisnosti komponenata jednog programa srednje veličine)Uvodno predavanje → Motivacija (4) 7/28
Motivacija: primjer 3Do dobre koncepcije dolazimo apstrakcijom (skrivanjem nebitnog)
ftp://ftp.oreilly.com/pub/poster/oreilly_linux_poster.pdf
Uvodno predavanje → Motivacija (5) 8/28
Motivacija: primjer 4Moderni programski okviri apstrahiraju programske biblioteke isklopovske arhitekture (klijentski kod ne mora znati za to)
Tensorfow execution engine
C++/libstdc++
Python/numpy Java, Go, ...
Eigen OpenBLAS cuDNN
OpenMP
GPUCPU
CUDA
Tema kolegija: načela i pristupi za ostvarivanje korisnih apstrakcija.
Uvodno predavanje → Motivacija (6) 9/28
Motivacija: OOUPZaš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 (7) 10/28
Motivacija: Fokus OOUP-aFokus 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ćavajuoblikovanje 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 (8) 11/28
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?
NAMEgets - get a string from standard input (DEPRECATED)
SYNOPSISchar *gets(char *s);
DESCRIPTIONNever use this function.
□ nema garancije da jezično korektna i jasna komponenta imazadovoljavajuća svojstva i u širem oblikovnom kontekstu!
Uvodno predavanje → Motivacija (9) 12/28
Motivacija: Jezik vs oblikovanje (2)Primjer: komponenta Image izravno koristi vanjsku biblioteku acmeTiff v1.0
class Image{
// ...
void load(char const* path);
};
void Image::load(char const* path){
switch (util:: extension(path )){
// ...
case "tif":{
ImageFmt fmt;
acmeTiffGetFmt(path , fmt);
this ->reformat(fmt);
acmeTiffLoad(path ,this ->getBuffer ());
}
};
Ovakve ovisnosti o vanjskim komponentama mogu stvoriti probleme.□ procjena razvojnog napora za libtiff: 18 osoba-godina (COCOMO).
Uvodno predavanje → Motivacija (10) 13/28
Motivacija: Jezik vs oblikovanje (3)Razmotrimo sljedeći (sasvim mogući) scenarij:
□ u acmeTiff v1.0 otkriveni neugodni bugovi□ acmeTiff 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 imamodvije verzije komponente (glavobolja za održavanje)Rješenje:
□ izdvojiti metodu load u zasebnu komponentu□ ta komponenta mora ispitati je li acmeTiff dostupna (introspekcija)□ u slučaju nedostupnosti bacamo iznimku
Nema garancije da jezično korektna i jasna komponenta imazadovoljavajuća svojstva i u širem oblikovnom kontekstu!
Uvodno predavanje → Motivacija (11) 14/28
Oblikovne osnove: ciljevi razvojaKoja 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, toleriranjepromjena(programsko oblikovanje)
Statička (1-3) vs. dinamička (4-5) svojstva programaOrganizacija - ključ dinamike programskog sustava!
Uvodno predavanje → Oblikovne osnove 15/28
Oblikovne osnove: važnost dinamike razvojaDinamička svojstva su važna jer se pokazuje da se do dobrih programane 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/28
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/28
Oblikovne osnove: kako postići dobru dinamikuDobru 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 seprikladnom 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/28
Proces: klasično vs agilno oblikovanjeModel razvojnog procesa propisuje smjernice razvoja programa
□ Royce 1970 - vodopadni model:zahtjevi→ oblikovanje→ izvedba→ispitivanje→ održavanje
□ 198x,199x: iterativne modifikacijevodopadnog 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 19/28
Proces: agilni modeliNedostatci (i "nedostatci") agilnih modela razvojnog procesa:
□ nema garancije da program stvarno radi!(što ako se bug manifestira u avionu na 3000m?)
□ 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 pristupiUvodno predavanje → Proces 20/28
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 prepravljaju i isporučuju)
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 irobotičke primjene...
Uvodno predavanje → Proces (2) 21/28
Proces: sloccount linuxsloccount 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=171338785 arch ansic =1127349 , asm =209975 ,sh=615, yacc =307,lex=300,
awk=96, python =45, pascal =41,sed=29,perl =28545820 fs ansic =545820377581 net ansic =377581356592 sound ansic =356409 , asm =183250442 include ansic =248816 , cpp=1515, pascal =75,asm=3674639 kernel ansic =74334 , perl =30536459 mm ansic =3645932743 crypto ansic =3274325316 security ansic =2531624193 scripts ansic =14432 , perl =4707,cpp=1791,sh=1175, yacc =967,
lex=742, python =37917146 lib ansic =1714610742 block ansic =107427712 Documentation ansic =5615,sh=1022 , perl =857, lisp =2185243 ipc ansic =52432658 virt ansic =26582283 init ansic =22831803 firmware asm =1598, ansic =205833 samples ansic =833493 usr ansic =491,asm=2
Uvodno predavanje → Proces (3) 22/28
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žuza 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 orijentiranogprogramiranja (dinamički polimorfizam ćemo temeljito ponoviti).
Uvodno predavanje → O predmetu 23/28
O predmetu: uvjeti, bodoviAktivnosti: predavanja, vježbe (C, C++, Python, Java, ?), međuispit,završni ispit, klasični ispit
Kalendar nastave:kraj ožujka: L1sredina travnja: L2kraj travnja: MIsredina svibnja: L3početak lipnja: L4sredina lipnja: ZIpočetak srpnja: KI
Kontinuirana provjera:laboratorij: 10 (A) + 10 (B)ispiti: 40, 40preduvjet: 40% laboratorija
Klasični ispit:preduvjet: 40% laboratorija
Mogućnost dobivanja bonus bodova za: korisne sugestije, prijedlogenovih tema ili vježbi, ekstra zadatke, seminare.
Ocjenjivanje: 2: 50%, 3: 63%, 4: 76%, 5: 89%.
Uvodno predavanje → O predmetu 24/28
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 obrasci3. 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.2-1.5, 3.1.3)
(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) 25/28
O predmetu: literaturaObrasci 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
□ Head First Design Patterns; Elisabeth Freeman, Eric Freeman,Bert Bates, Kathy Sierra; O'Reilly Media, Inc.; 2004
□ Large-Scale C++ Software Design; John Lakos; Addison-Wesley;1996
□ Effective Modern C++; S. Meyers; O’Reilly Media; 2014□ The Elements of Programming Style; Brian W. Kernighan, P. J.
Plauger; Computing Mcgraw-Hill; 1978
Uvodno predavanje → O predmetu (3) 26/28
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-WesleyProfessional; 2000
□ Extreme Programming Adventures in C#; Ron Jeffries; MicrosoftPress; 2004
Uvodno predavanje → O predmetu (4) 27/28
O predmetu: literatura (3)Literatura: C++, generičko programiranje
□ [More] Effective {C++|STL}; S. Meyers; Addison Wesley; 1996□ 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, NicolaiM. Josuttis Addison-Wesley Professional; 2002
□ Inside the C++ object model; Stanley Lippman; Addison-WesleyProfessional; 1996
Uvodno predavanje → O predmetu (5) 28/28