klasifikacijski zavisna organizacija podataka revizija 5
autor: Ivan Vodišek Šibenik, 2009.
Uvod Svemir. Obilje različitih podataka. Neki od tih podataka korisni su nama, živim bićima. Podatke je moguće grupirati na različite načine, što nam može poslužiti za lakši pronalazak informacija. Ovdje je opisan način transformacije dvodimenzionalnih tablica u kompaktan oblik dobiven grupiranjem istovrsnih podataka. Kao što ćemo vidjeti, jedan isti sustav tablica je moguće klasificirati, tj. grupirati na različite načine, te u više hijerarhijskih razina, formirajući različita hijerarhijska stabla klasa za isti skup podataka. Ako ste upoznati s OOP tehnologijom (objektno orijentirano programiranje), ovaj rad se može smatrati proširenjem trenutno postojeće OOP tehnologije u slijedećem smislu: osim što je jedan isti skup objekata moguće klasificirati na različite načine, svojstva klasa međusobno mogu biti parametarsko-funkcijski povezana. To znači da bi se mijenjanjem sadržaja jednog svojstva mijenjali i sadržaji drugih, s njim povezanih svojstava. Ovakav sustav teži ka potpunoj zamijeni metoda klasa programiranih imperativnim programskim kodom.
1
Klase i objekti Jedan od intuitivnih načna grupiranja podataka koji nam je nekako sam po sebi poznat je grupiranje podataka u dvodimenzionalnu tablicu. Takve tablice sastoje se od zaglavlja i redaka. U zaglavlju tablice naznačeno je koje i kakve podatke sadrži svaki redak tablice. Kao primjer na kojem ćemo temeljiti daljnje izlaganje, upotrijebiti ćemo tablicu koja u svojim retcima sadrži podatke o nekim osobama:
ime
vrsta
boja kose
Maja
Ženska
Smeđa
Mila
Ženska
Smeđa
Mate
Muški
Smeđa
Mirko
Muški
Smeđa
Mario
Muški
Plava
Mimi
Ženska
Plava
tablica 1.
Postoje slučajevi kada se neki podaci u određenom broju redaka ponavljaju, kao što je to slučaj sa podacima “vrsta” i “boja kose” iz našeg primjera. Takva ponavljanja pružaju nam priliku da grupiramo podatke prema njhovoj sličnosti. Jedan od mogućih načina grupiranja podataka iz našeg primjera je grupiranje prema koloni “vrsta”:
vrsta Ženska
Muški
ime
boja kose
Maja
Smeđa
Mila
Smeđa
Mimi
Plava
Mario
Plava
Mate
Smeđa
Mirko
Smeđa
tablica 2.
2
Grupe podataka dobivene opisanim načinom nazivati ćemo klasama, a kolonu prema kojoj grupiramo podatke klasifikacijskom osnovom. Retke tablice ćemo nazivati objektima. U tablici 2. prema klasifikacijskoj osnovi “vrsta” izdvojili smo dvije klase: “Ženska” i “Muški”. Iste je objekte uglavnom moguće klasificirati na više međusobno nezavisnih načina, upotrebljavajući u pojedinim slučajevima različite osnove klasifikacije. Na primjer, objekte iz prethodne tablice moguće je klasificirati i prema klasifikacijskoj osnovi “boja kose”:
boja kose
ime
vrsta
Maja
Ženska
Mila
Ženska
Mate
Muški
Mirko
Muški
Mario
Muški
Mimi
Ženska
Smeđa
Plava
tablica 3.
Moguća je i kaskadna višerazinska klasifikacija objekata u stablastu strukturu:
ime
vrsta
boja kose
Smeđa Maja Ženska Mila Mate Muški Mirko Plava vrsta
Muški
Mario
Ženska
Mimi
tablica 4.
Objekte iz tablici 4. također je moguće prikazati i nekim drugim redoslijedom višerazinskog klasificiranja (npr: 1. “vrsta”, 2. “boja kose”). 3
Elementi objekata - svojstva Dosad smo vidjeli na koji se način objekti mogu grupirati u klase. U pojedinim klasifikacijskim pregledima, kolone tablica prema kojima nismo vršili klasifikaciju nazivati ćemo svojstvima klasa. Objekti pojedine klase, osim svojih inicijalnih svojstava, mogu sadržavati i dodatna svojstva specifična samo za tu pojedinu klasu (ekvivalent OOP-ovom proširivanju skupa svojstava naslijeđenih od roditeljske klase). U slijedećoj tablici, koja je prema klasif. osnovi “zanimanje” podijeljena na klase “Student” i “Liječnik”, prikazana su i dodatna svojstva tih klasa (“smijer” i “godina”, te “specijalizacija”). ime zanimanje Student
vrsta smijer
godina
Maja
Ženska
Prirodni
5
Mila
Ženska
Društveni
2
Mate
Muški
Društveni
3
Mirko
Muški
Prirodni
4
Mario
Muški
Neurolog
Mimi
Ženska
Kardiolog
specijalizacija Liječnik
tablica 5.
Naravno, pojedine objekte je moguće klasificirati i prema ovdje opisanim dodatnim svojstvima, što se može vidjeti u slijedećem primjeru: ime
vrsta
smijer
zanimanje
Student
godina Maja
Ženska
5
Mirko
Muški
4
Mila
Ženska
2
Mate
Muški
3
Kardiolog
Mimi
Ženska
Neurolog
Mario
Muški
Prirodni
Društveni
Liječnik spec.
tablica 5.
4
Tipovi svojstava i njihovi sadržaji Svako svojstvo ima svoj tip koji opisuje moguće sadržaje tog svojstva. Tip svojstva je objekt ili skup objekata koje svojstvo: 1. smije sadržavati prilikom korisničkog odabira - u ovom slučaju, kad korisnik upisuje sadržaj nekog svojstva, tada se mora pobrinuti da taj sadržaj pripada skupu objekata obuhvaćenih tipom tog svojstva. Ovdje tip svojstva dobiva smisao u osiguravanju uniformnosti sadržaja svojstva. Pomoću takve uniformnosti može se postići neka razina univerzalnosti upotrebe svojstva. Npr. sve sadržaje svojstava moguće je prikazati kao niz znakova, a sadržaje svih svojstava koji označavaju boju moguće je prikazati još i kao kvadratiće dane boje. Bez tipova svojstava, svojstvu koje označava boju mogao bi se dodijeliti i podatak koji nije boja, što bi rezultiralo nefunkcioniranjem sustava koji dotično svojstvo prikazuje kao obojani kvadratić. Također, tip svojstva može poslužiti za unos sadržaja svojstva tako da se korisniku na izbor ponude samo oni objekti koji pripadaju tom tipu. Tipovi podataka imaju vrlo važnu ulogu i u automatskoj konstrukciji dolaska do rješenja zadnih problema. 2. sadrži automatski, bez korisničke intervencije - ovaj slučaj pokriva potrebe parametarski određivanog sadržaja svojstva. Npr. ako su poznata svojstva “put” i “vrijeme” tada se brzina može izračunati pomoću formule: brzina = put / vrijeme, a tip svojstva “brzina” bi bio matematički izraz: “put / vrijeme”. Tip svojstva predstavljen je nizom parova naziva svojstava i njihovih traženih vrijednosti. Tip svojstva obuhvatiti će već postojeće objekte čija svojstva sadrže vrijednosti navedene u spomenutom nizu. Slijedeći primjeri tipova svojstava odražavaju stanje objekata iz tablice 5. Izraz: [zanimanje: Student | smijer: Prirodni] predstavlja skup objekata s imenima “Maja” i “Mirko”, a izraz: [zanimanje: Liječnik | specijalizacija: Kardiolog] predstavlja objekt s imenom “Mimi”. Ponekad je također potrebno da tip svojstva pokazuje na neko drugo svojstvo. U tim slučajevima potrebno je naznačiti i naziv traženog svojstva. Izraz: [zanimanje: Student | smijer: Društveni | vrsta: Ženska] . ime predstavlja ime “Mila”. Postoji još i slučaj kada tražimo sadržaj svojstva objekta, a upit nam izdvaja više od jednog objekta. Npr. izraz: [zanimanje: Student | smijer: Društveni] . ime predstavlja skup imena “Mila” i “Mate”. Tipove je moguće i kombinirati. Npr. izraz: [zanimanje: [ime: Mirko] . zanimanje | vrsta : Ženska] . ime predstavlja skup imena “Mila” i “Maja”. Objekte obuhvaćene tipom svojstva je moguće prilikom njihovog dodjeljivanja 5
nadopuniti i proizvoljnim novim svojstvima (ekvivalent OOP overloadingu). Tada je također moguće i dodatno specificirati postojeća svojstva dodjeljivanih objekata (ekvivalent OOP overridingu). Te nadopune i izmjene tada vrijede samo za svojstvo kojem smo dodijelili takav nadograđeni i izmijenjeni tip.
Primjena Područje primjene ovakvog sustava je vrlo široko i seže od izrade naprednog tabličnog kalkulatora ili baze podataka, pa sve do ambiciozno zamišljenog koncepta datotečnog i čitavog operativnog sustava. Naime, u određene klase možemo mapirati listu podataka iz ulaznih jedinica (npr. tipkovnica), dok listu podataka u nekoj drugoj klasi možemo zadužiti da kontrolira stanja izlaznih jedinica (npr. ekran). Povezivanjem tih dvaju listi, tj. postavljajući listu stanja izlaznih jedinica (npr. linije, likovi i slova) u odnos zavisan o listi stanja ulaznih jedinica (npr. niz pritisnutih tipaka na tipkovnici), može se dobiti funkcionalno korisničko sučelje kako polja za unos teksta, tako i operativnog sustava. U slijedećem primjeru prikazano je kako bi mogla izgledati aplikacija temeljena na ovdje opisanom sustavu: renderer trenutno osvijetljenog objekta ovdje iscrtava svoje podatke full screen dodavanje novog svojstva za klasu opredjeljenje : Korisnički programer +
Osoba
opredjeljenje
zanimanje
Programer
ime
Osoba
vrsta
+
prog. jezik platforma Maja
Ženska
c++, Java
PC, Apple
Mirko
Muški
c++
Apple
Mila
Ženska
Java
Fizikalne simulacije
Mate
Muški
c++, c#
Baze podataka
Kardiolog
Mimi
Ženska
Neurolog
Mario
Muški
Sistemski p.
+
Korisnički p.
ime
Mila
vrsta
Ženska
zanimanje Programer
područje
Liječnik
opredjeljenje Korisnički p. +
prog. jezik
Java
područje
Fizikalne simulacije
spec.
područje renderera klase zanimanje : Programer
dodavanje novog objekta pod klasama zanimanje : Programer | opredjeljenje : Korisnički p.
Zaključak Ovaj rad baca svjetlo na jednostavnu ideju: “klasa = sadržaj svojstva”. Takvim poimanjem klasa, u sprezi s međusobno zavisnim svojstvima dobiva se fleksibilan model za manipulaciju podacima. Iako takav model izgleda obećavajuće, tek će se u praksi pokazati njegova stvarna upotrebljivost.
6
Dodatak A: neki primjeri klasa U tablici 7. slijede neki od primjera klasa koje mogu biti korisne. Klasa IsNull koja ispituje da li postoji ijedan objekt u danoj klasi, uz klasu Char spada u primitivne klase. Za primitivne klase ne postoji adekvatna definicija u našoj notaciji, već se postojanje i definicija tih klasa trebaju interno implementirati u programskom rješenju temeljenom na našem sustavu.
Class util
IF
param : Bool
trueResult : Class
falseResult : Class
ovdje smo definirali privremenu bezimenu klasu čije objekte dosežemo pomoću susjednog svojstva IF . param
IsNull
param : List
IsEqual
lParam : Class
result : [choice : [ IF . param! ]! ] . result! choice : Bool
result : Class
True
IF . trueResult
False
IF . falseResult
funkcija IsNull definiran je interno kao primitivna klasa ovakvog oblika.
result : Bool
result : [
rParam : Class
IsEqual . rParam Bool
util : IsNull | param : [ util : IsEqual! | lParam : rParam! ]
] . result!
expression
Simple
funkcija ispitivanja jednakosti objekata definirana je preko primitivne funkcije IsNull. Ako je klasa IsEqual prazna kada u njoj izdvojimo objekte čiji je lParam jednak rParam, tada je njen rezultat False.
True False
Compound And
lParam : Bool
rParam : Bool
result : Bool
True
True
True
True
False
False
False
True
False
False
False
False
lParam : Bool
rParam : Bool
result : [ : Not | param : [ : And | lParam : [ Not | param : [ Or ] . lParam! ] . result! | rParam : [ Not | param : [ Or ] . rParam! ] . result! ] . result! ] . result!
param : Bool
result : Bool
True
False
False
True
item : Class
next : List
Or
Not
operator And je definiran pomoću semantičke tablice
operator Or je definiran pomoću operatora And i Not
klasa List definirana je rekurzivno List
tablica 7. 7
Dodatak B: definicijska domena Slijede primjeri filtriranja i sortiranja listi podataka (tablica 8 i tablica 9). Mogućnost njihovog definiranja u našem sustavu trebala bi opisivati potpunost domene definabilnih algoritama. Kao glavnim konstrukcijskim elementima ovdje se koristimo rekurzijom uz izmjenu postojećih i nadopunu novim svojstvima (OOP overriding i overloading). overload-ano svojstvo condition proslijediti će se prilikom prosljeđivanja klase List kao parametra svojstva source. Class util
FilteredList
ovdje je operator IF naivno zapisan u formatu IF(condition, trueResult, falseResult). result : [ tmp : IF( source . condition, [ source ], IF( source . next == [ null ], [ null ], [ FilteredList | source : source. next ] . result . tmp, ) )| item : IF( [ tmp ] == [ null ], primjer rekurzije i [ null ], overriding-a [ tmp . item ] )| next : IF( [ tmp ] == [ null ], [ null ], [ FilteredList | source : tmp . next ]. result ) ]!
source : [ List | condition : Bool ]
svojstvo tmp pokazuje na prvi objekt u listi source za koji svojstvo condition vraća True.
tablica 8.
Class util
SortedList
sourceList : [ List | isLessThan : Bool ]
overload-ano svojstvo isLessThan proslijediti će se prilikom prosljeđivanja klase List kao parametra svojstva sourceList.
insertItem : [ listToPopulate : List | result : [ listToPopulate | result next : IF(SourceList . isLessThan (listToPopulate . next . Item) OR isNull (listToPopulate . next), List | item : SourceList . item! | next : listToPopulate . next!, [
insertItem | listToPopulate : super . next! ] . result! ) ]! ] result : [ IF ( isNull(SourceList), null, [
insertItem | listToPopulate : [ SortedList | sourceList : super . next ] . result! ]. result! ) ]!
tablica 9. 8
svojstva su poredana okomito radi optimalnog iskorištenja prostora na papiru