2 - Apstrakcija, Klase, Enkapsulacija

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 31

Apstrakcija, Klase,

Enkapsulacija

Predavač: doc. dr. sc. Goran Mauša


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 licencije preuzet je s http://creativecommons.org/.


Apstrakcija
Modeliranje objekata tako da se koriste samo bitne
komponente stvarnog objekta
Apstrakcija = kategorizacija

• Kategorizacija
• čovjeku prirodna stvar
• od nje se kreće prilikom razmišljanja o programu u čiju se izradu kreće
• Program koji razvijamo odnosi se na tzv. domenu
• Svaka poslovna domena ima svoje objekte koje stavljamo u kategorije (klase)
• fakultet: studenti, nastavnici, ispiti itd.
• ministarstvo: pismena, predmeti, zapisnici itd.
• U kategorijama identificiramo postupke koji su vezani uz pojedinu kategoriju
• npr. prijava ispita, upis predmeta, izračune ocjene na ispitu…
• Opis jednog poslovnog pravila na fakultetu
• “Student mora sakupiti 50% bodova da bi prošao ispit”
• bit će ugrađeno u postupke
Procedural vs. OO-Programming

• Procedural programming UNIT: function


• Object-oriented programming UNIT: class
• Procedural programming concentrates on creating functions,
while object-oriented programming starts from isolating the
classes, and then look for the methods inside them
• Procedural programming separates the data of the program
from the operations that manipulate the data, while object-
oriented programming focus on both of them

figure1: procedural figure2: object-oriented


Koncept klasa i objekata

• Apstraktno:
• “Class” refers to a blueprint. It defines the variables
and methods the objects support

• Konkretno:
• “Object” is an instance of a class. Each object has a
class which defines its data and behavior
Klasa
Klase i objekti VelikiStan

• koja je razlika između objekta i klase?


• objekt je jedan primjerak (instanca) klase

Objekt klase
Objekt klase VelikiStan
MaliStan

Objekt klase
VelikiStan

Klasa
Objekt klase
MaliStan MaliStan
Apstrakcija u proceduralnoj paradigmi
(bez OOP-a)
• Razmišljamo o cjelinama kôda (više naredbi), a ne
pojedinačnim naredbama
• Uvođenjem jasnih i dobro imenovanih apstrakcija kôd
postaje samodokumentirajući
double sum = 0.0;
double power = 1.0;
double factorial = 1.0;
sum += 1.0; sum = ePowerX( x );
for(int i = 1; i < 10; i++) {
power = power * x;
factorial = factorial * i;
sum += power/factorial;
}
Apstrakcija u OOP-u

• Modeliranje objekata tako da se koriste samo ATRIBUTI:


ime
bitne komponente stvarnog objekta prezime
jmbag
• Što znači bitno? visina
težina
• Npr. modeliramo studenta
datum rođenja
mjesto rođenja
• jmbag, ime i prezime su vjerojatno bitni mentor
ocjene
• Datum rođenja? …

• Bitan ako modeliramo sustav u kojem nam je bitna


starost studenta ili ispisujemo potvrde
• Nebitan ako modeliramo sustav za evidenciju
mentorstva (tada nam je bitan atribut mentor) KLASA
Student
• …
Od struktura u C-u do klasa u Javi (1)
• za složene tipove podataka, u C-u se koriste strukture
• karakteristike struktura:
• svatko može mijenjati vrijednosti atributa (članovi strukture),
• nema nikakve kontrole postavljaju li se vrijednosti članova strukture na
dopuštene vrijednosti ili da li se pravilno rukuje s objektom (stvaranje,
brisanje, …),
• jedina moguća kontrola (koja se lako zaobiđe) je pisanje
specijaliziranih funkcija za rad sa studentom (student_new,
student_destroy student_set_jmbag,
student_add_grade, …).
typedef struct { typedef struct {
int code; char id[11];
char title [100]; char *name;
int grade; char *surname;
} course_grade; int no_of_grades;
course_grade grades[60];
} student;
Od struktura u C-u do klasa u Javi (2)
student *student_new(char *id, char *name, char *surname) {
student *s = (student*) malloc(sizeof(student));
if(s == NULL) return NULL;
strcpy(s->id, id);
s->name = (char*)malloc(strlen(name)+1);
strcpy(novi->name, name);
s->surname = (char*)malloc(strlen(surname)+1);
strcpy(s->name, name);
s->no_of_grades = 0;
return s;
}
void student_destroy(student *p){
if(p == NULL) return;
free(p->name); void student_add_grade(student *s, int code,
free(p->surname); char *title, int grade) {
free(p); course_grade cgr;
} /* only add grade if course is passed*/
if(grade < 2 || grade > 5) return;
cgr.code = code;
strpcy(cgr.title, title);
cgr.grade = grade;
s->grades[s->no_of_grades++] = cgr;
}
Od struktura u C-u do klasa u Javi (3)

• Tako napisanim metodama:


• smanjuje se mogućnost pogreške u kodu (npr. funkcija za
stvaranje napisana je samo na jednom mjestu),
• članovi neće biti postavljeni na nekonzistentne vrijednosti.
• Problem: kako osigurati da svatko koristi te metode?
• npr. moguće je da netko (namjerno ili slučajno) unese negativnu
ocjenu ili promijeni broj ocjena
• praktično nemoguće izvesti u C-u
• teoretski moguće ako koristimo void* uz uvjet da nije dostupna
deklaracija strukture
• pravo rješenje je prebacivanje u objektni svijet razmišljanja
Klase (razredi)
Analogija s C-om

• Kao što C ima strukture (struct) za pohranu podataka, tako


se u Javi podaci mogu pohranjivati u klase (class)
• Nema „obične” varijable, već radimo analogno pokazivačima u C-u.
• U C-u pišemo:
typedef struct {
...
} X;
X *var = (X*)malloc(sizeof(X)));
• u Javi pišemo:
class X {
...
}
X var = new X();
• Napomena: Neki objektni jezici C-ovske sintakse (C#, C++) imaju i strukture i klase. U Javi
postoje samo klase.
Java razredi/klase

• Java uvodi poopćene “C-strukture”: razred (klasa) (engl. class)


• na elementarnoj razini razred je struktura, koja osim članskih
varijabli (atributa) ima i vlastite funkcije (metode), te nudi
kontrolu pristupa (tko može pristupiti čemu)
• Napomena:
• Neki objektni jezici C-ovske sintakse (C++, C#) imaju i strukture i klase.
• razlika je u vrsti podatka (tzv. value i reference type) i smještaju (stog ili hrpa)

• Java ima samo klase


Class Members

• A class can have three kinds of members:


• fields: data variables which determine the status of
the class or an object

• methods: executable code of the class built from


statements. It allows us to manipulate/change the
status of an object or access the value of the data
member

• nested classes and nested interfaces


Pr 1. Apstrakcija kolegija (1)
• Klasa sadrži članske varijable (atributi) i metode (ponašanje)

typedef struct {
int code;
char title [100]; class CourseGrade {
int grade;
int code;
} course_grade;
String title;
int grade;
}

...\src\hr\fer\oop\classes\example1\CourseGrade.java
Pr 1. Apstrakcija studenta (1)
• Klasa sadrži članske varijable (atributi) i metode (ponašanje)

typedef struct {
char id[11];
char *name;
char *surname;
class Student { int no_of_grades;
String id; course_grade grades[60];
String name; } student;
String surname;
int noOfGrades;
CourseGrade[] grades;
void addGrade(int code, String title, int grade){
...
}
void init() {
...
}
} ...\src\hr\fer\oop\classes\example1\Student.java
Pr 1. Izvršna metoda (1)

...\src\hr\fer\oop\classes\example1\Main.java

class Main {
public static void main(String[] args) {
Student s = new Student();
s.init(); Stvaramo
s.name = "Ivo"; novi objekt
s.surname = "Ivić"; tipa Student
s.id = "1234567890";
s.addGrade(105, "OOP", 5); Metode
s.addGrade(20, "ASP", 3); pozivamo na
s.addGrade(77, "PiPI", 2); konkretnom
System.out.println(s.averageGrade()); objektu
}
}
Pr 1. Izvršna metoda (2)
• Primjerak klase (objekt ili instanca) nastaje korištenjem
operatora new
• Varijabla s je referenca na objekt (slično pokazivaču u C-u)

• Operator new alocira u memoriji mjesto za jedan primjerak klase i


vraća referencu na novi objekt

• Metode pripadaju klasi i pozivamo ih „nad objektom” te klase


• Iznimka: statičke metode. Pozivaju se na klasi, a ne na objektu, npr.
Double.parseDouble(sBroj)

• Nema „ničijih” („globalnih”) metoda


Pr 1. Apstrakcija studenta (2)
• Ostatak koda klase Student
class Student {
final int ARR_SIZE = 60;
...
void init(){
grades = new CourseGrade[ARR_SIZE]; noOfGrades = 0;
}
void addGrade(int code, String title, int grade){
if (grade >= 2 && grade <=5){
CourseGrade courseGrade = new CourseGrade();
courseGrade.code = code;
courseGrade.title = title;
courseGrade.grade = grade;
grades[noOfGrades++] = courseGrade;
}
}
... ...\src\hr\fer\oop\classes\example1\Student.java
}
Pr 1. Apstrakcija studenta (3)
• Ostatak koda klase Student
class Student {
...
double averageGrade(){
int sum = 0;
for(int i=0; i<noOfGrades; i++){
sum += grades[i].grade;
}
return noOfGrades > 0 ? (double) sum / noOfGrades : 0;
}
}

...\src\hr\fer\oop\classes\example1\Student.java
Enkapsulacija (učahurivanje)
skrivanje atributa i metoda od ostalih klasa
Učahurivanje i skrivanje informacija
• učahurivanje (enkapsulacija)
• kako radi Hi-Fi audio sustav? Tako dugo dok uređaj radi, nas to zapravo ni ne zanima!
• učahurivanjem se postiže slaba povezanost objekata (engl. loose coupling)
• slabom povezanošću objekti postaju neovisniji i interne promjene jednog objekta ne
utječu na rad drugog
• audio sustav, iako djeluje kao cjelina, sastavljen je od međusobno neovisnih
i odvojivih komponenti. Ako se jedna komponenta pokvari, ostale i dalje nastavljaju s
radom
• u našem primjeru sa studentom, nebitno je kako je
realizirana pohrana ocjena
• potrebno je zaštititi implementacijske detalje od javnog
pristupa kako bi se izbjegle slučajne ili namjerne pogreške
i smanjila povezanost objekata
Modifikatori vidljivosti (1)

• Modifikatori vidljivosti ograničavaju pristup (vidljivost, dostupnost)


• može se postaviti ispred klase i taj modifikator smije biti samo public
• bez modifikatora, klasa je vidljiva samo unutar paketa
• Iznimka: unutarnje klase (o njima naknadno) mogu biti private
• može se postaviti ispred članske varijable i metode
• public, private ili protected
• određuju jesu li (i kome) varijable i metode vidljive/dostupne izvan klase

• Javno sučelje klase/objekta


• javno sučelje objekta predstavljaju javne metode
• javno se sučelje koristi za komunikaciju s ostalim objektima/metodama
• javnim sučeljem objekt izlaže samo one članske varijable/metode za koje
smatra da trebaju biti vidljive ostatku svijeta
• ostvaruje se modifikatorom vidljivosti public
Modifikatori vidljivosti (2)

• metode klase uvijek mogu pristupati članskim varijablama i metodama


svoje klase
• u pr. 1 nije postavljen modifikator vidljivosti ispred varijabli i metoda
• članske varijable i metode dostupne su svim klasama unutar istog paketa
• tzv. package-private vidljivost
• postavit ćemo modifikatore public i private u klasu Student
• public - druge klase mogu pristupiti
• protected - omogućava pristup izvedenim klasama u drugim paketima
• više o tome kod nasljeđivanja

Klijent Public Objekt


(metoda klase
main) Student
Private
Tablica prava pristupa

• Pripadnost paketu je određena prvom naredbom u klasi (package …)


• Potklasa je naslijeđena (izvedena) klasa
• klasa nastala proširivanjem, izvođenjem iz postojeće
• više u predavanju o nasljeđivanju

• Pravo pristupa varijabli ili metodi neke klase označenoj određenim


modifikatorom sažeto je prikazano sljedećom tablicom

Private (default) Protected Public


Ista klasa DA DA DA DA
Klasa u istom paketu NE DA DA DA
Klasa koja nasljeđuje ovu klasu NE NE DA DA
Klasa iz drugog paketa koja nije NE NE NE DA
potklasa ove klase
Neke razlike u odnosu na slične objektne
jezike

• Pristup članskim varijablama i metoda ovisno o modifikatoru


Modifikator Java C# C++
public javni pristup javni pristup javni pristup
private samo unutar klase samo unutar klase samo unutar klase
protected naslijeđene klase i naslijeđene klase naslijeđene klase
klase unutar istog
paketa
internal - klase unutar istog -
projekta (asemblija)
protected internal - naslijeđene klase i sve -
klase unutar istog
projekta
bez modifikatora klase unutar istog samo unutar klase samo unutar klase
paketa (=private) (=private)
Pr 2. Enkapsulacija Studenta (1)

• broj ocjena i polje ocjena su implementacijski detalj i njih treba


sakriti od javnosti postavljanjem modifikatora private
• ime, prezime i jmbag su podaci koji trebaju biti dostupni
vanjskom klijentu i za čitanje i za pisanje
• uobičajeno je varijable postaviti da su privatne, a za dohvat i
postavljanje njihovi vrijednosti napisati posebne metode
• tzv. getteri i setteri
• kombinaciju privatne varijable i gettera i settera nazivamo svojstvo (engl.
property)
• po potrebi moguće je napraviti dodatnu kontrolu ulazne
vrijednosti (npr. provjeru ispravnosti JMBAG-a)
Pr 2. Enkapsulacija studenta (2)
public class Student {
private String id;
private String name;
private String surname;
private int noOfGrades;
private CourseGrade[] grades;
public void init(){ ... }
public void addGrade(int code,
String title, int grade){ ... }
public double averageGrade(){ ... }
public String getId() { return id; }
public void setId(String newId) {
id = newId;
}
public String getName() { return name; }
public void setName(String newName) {
name = newName;
}
public String getSurname(){ return surname;}
public void setSurname(String newSurname) {
surname = newSurname;
}
...\src\hr\fer\oop\classes\example2\Student.java
Pr 2. Enkapsulacija studenta (3)

public class Main {


public static void main(String[] args) {
Student s = new Student();
s.init();
s.setName("Ivo");
s.setSurname("Ivić");
s.setId("1234567890");
s.addGrade(105, "OOP", 5);
...
System.out.println(s.averageGrade());
}
}

...\src\hr\fer\oop\classes\example2\Main.java

You might also like