PROGRAMIRANJE 2
Modularno programiranje
Robert Rozić, asis. dr. sc. Marko Rosić, prof.
Creative Commons
● Slobodno smijete:
○ dijeliti - umnožavati, distribuirati i javnosti priopćavati djelo
○ remiksirati - prerađivati djelo
● pod sljedećim uvjetima:
○ Imenovanje. Morate priznati i označiti autorstvo djela na način kako je specificirao autor ili
davatelj licence (ali ne način koji bi sugerirao da Vi ili Vaše korištenje njegova djela imate
njegovu izravnu podršku).
○ Nekomercijalno. Ovo djelo ne smijete koristiti u komercijalne svrhe.
○ Dijeli pod istim uvjetima. Ako ovo djelo izmijenite, preoblikujete ili stvarate koristeći ga,
preradu možete distribuirati samo pod licencom koja je ista ili slična ovoj.
U slučaju daljnjeg korištenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete ovog
djela. Najbolji način da to učinite je linkom na ovu internetsku stranicu. Od svakog od gornjih uvjeta moguće
je odstupiti, ako dobijete dopuštenje nositelja autorskog prava.
Ništa u ovoj licenci ne narušava ili ograničava autorova moralna prava.
Tekst licence preuzet je s https://creativecommons.org/.
Programiranje 2
Modularno programiranje
- Način organiziranja projektnog izvornog koda
- tehnika dizajniranja software-a koja je bazirana na osnovnom principu modularnog dizajna.
- Modularni dizajn kompleksni sustav cijepa na manje dijelove ili komponente tzv. module.
- Te komponente tj. module se mogu neovisno izrađivati i testirati.
- U mnogim slučajevima se također mogu koristiti i u nekim drugim sustavima.
Ukoliko želimo razviti program koji je lako čitljiv, pouzdan i relativno lak za
održavanje, potrebno je koristiti neki oblik modularnog dizajna software-a
i izbjegavati tzv. spaghetti kod (zapetljani kod bez jasne strukture)
Modularno programiranje
Pri izradi modularnog sustava, nekoliko modula razvija se odvojeno i više/manje
neovisni jedni o drugima.
Konačna aplikacija koja se izvršava se kreira povezivanjem više modula.
Svaki modul sadrži sve potrebno za izvršavanje samo određenog aspekta željene
funkcionalnosti.
Aspekti modularnog programiranja
Moduli najčešće formiraju direktni aciklični graf (directed acyclic graph) - DAG
To je graf bez usmjerenih ciklusa. Sastoji se od čvorova i usmjerenih grana.
Svaka grana povezuje jedan čvor sa drugim.
Ne postoji način da početkom u čvoru v vratimo na njega prateći redoslijed grana.
Ovaj koncept opisuje pozivanje modula jedan u drugom.
U slučaju gdje moduli formiraju DAG, mogu se hijerarhijski posložiti:
- Moduli najniže razine neovisni o drugim modulima
- Moduli viših razina koji su ovisni o modulima niže razine
Aspekti modularnog programiranja
Pri kreiranju modularnog sustava, umjesto kreiranja monolitne aplikacije, pišemo odvojene module
koji se kasnije slažu u konačnu aplikaciju.
Često se ovakvi moduli kompajliraju odvojeno, a kasnije su povezani “linkerom”.
Just-in-time kompajleri neki od ovih konstrukcija mogu izvršavati i za vrijeme izvođenja.
Pri radu s modularnim tehnikama programiranja nailazimo na uobičajene zajedničke uzorke za
korištenje modula i paketa uključujuči “divide and conquer” (podijeli pa vladaj) pristup
programiranju, korištenje apstrakcije i enkapsulacije, ideje pisanja proširivih modula itd.
Aspekti modularnog programiranja
Pisanje modularnog koda također je odličan način za dijeljenje koda tako što ćemo ga učiniti
dostupnim drugim programerima kako bi taj kod mogli koristiti u drugim programima i aplikacijama.
Za dijeljenje koda koristimo popularne alate kao što su GitHub, Python package index itd.
Kombinacijom ovih tehnika primjenjujemo “modularni način razmišljanja” kako bi kreirali što bolje
programe koje je lako održavati i na velikoj razini.
Modularno programiranje u Python-u
Što je Python modul ?
- Ne postoji određena sintaksa koja kreira python modul
- Svaka datoteka koja ima .py ekstenziju i sadrži Python kod
Modul može sadržavati objekte npr. datoteke, klase, atribute itd. kojima se može pristupiti nakon
uključivanja (import)
Postoji nekoliko načina za uključivanje modula u Python-u.
Python moduli
# Uključivanje math modula
import math
print(dir(math))
# Pozivanje pi atributa iz math modula
print(math.pi)
# Pozivanje funkcije sinus
math.sin(math.pi/2)
Python moduli
# Uključivanje više modula odjednom
import math, random
# Učitavanje pojedinih atributa modula
from math import sin, pi
# Uključivanje svih modula, za poziv bez imena modula
from math import *
Python moduli
# Alias na ime modula
import numpy as np
# Korištenje aliasa
np.sin(1)
# Alias na funkciju iz modula
from math import pi, pow as power, sin as sinus
Pisanje vlastitih modula
# Datoteka fibonacci.py
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
def ifib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
Pisanje vlastitih modula
# Datoteka test.py
import fibonacci
fibonacci.fib(5)
fibonacci.ifib(10)
# Pojedinačno
from fibonacci import fib, ifib
print(fib(5))
Pisanje vlastitih modula
# Datoteka fibonacci.py
print("Modul je ucitan!")
...
# Datoteka test.py
import fibonacci
# Ukoliko modul pokusamo ucitati opet, kod se nece izvrsiti
import fibonacci
# Za ponovni import koristimo reload iz importlib modula
from importlib import reload
reload(fibonacci)
Pisanje vlastitih modula
# Modul može biti učitan i kao skripta
if __name__ == "__main__":
import sys
print("Ucitano kao skripta")
fib(int(sys.argv[1])) # Argument iz terminala
Tipovi modula
- Python modul, napisani u pythonu
- .py ekstenzija
- Dinamički linkani C moduli Dynamically linked C modules
- .dll, .pyd, .so, .sl, …
- C moduli linkani interpreterom
Lista tih modula:
import sys
print(sys.builtin_module_names)
Python moduli
Kada učitavamo modul interpreter traži taj modul na sljedećim lokacijama ovim redom:
1. Direktorij datoteke koja se izvršava
2. Direktoriji PYTHONPATH, globalne environment varijable OS-a
3. Standardni Python direktorij npr. za Linux /usr/lib/python3.9
import random
print(random.__file__)
Zadaća
Funkciju iz prethodne zadaće učitati kao funkciju modula u novi program i pozvati je nakon traženja unosa
od korisnika.
PythonCourse
Modular programming with Python, Erik Westra
sumarum.sum.ba
Lozinka za pristup: Mostar2021! / Orasje2021!
marko.rosic@pmfst.hr
robert.rozic@fpmoz.sum.ba
HVALA NA POZORNOSTI !