| | |
| |
|
Објектно оријентирани концепти во Јава - Втор дел |
прегледано: |
211615 |
вкупно гласови: |
2 |
средна оценка: |
5.0 |
коментари: |
3 |
испрати до пријател
испечати
|
Проследување на параметри и враќање на вредности.
Повеќето од методите кои ги прегледавме до сега беа од специјален тип. Еве една таква декларација, односно методата „skiniJabolko“ од класата „Jabolknica“ која ја развивме во првиот дел:
public void skiniJabolko() {
vkupnoJabolka = vkupnoJabolka – 1;
}
Она што ја прави оваа метода (и другите слични методи кои ги сретнавме) специјална е тоа што не бара никакви влезни параметри, ниту враќа некаков резултат. Но како што ќе видиш во наредните Јава примери повеќето методи (барем поголемиот процент од нив) или враќаат или примаат параметри или и двете наеднаш.
Параметрите се мали информации кои мора да бидат обезбедени при повик на методи за да операцијат која треба да се изврши биде комплетна. На пример за да ја направиме помоќна методата „skiniJabolko“ можеме да и додадеме влезен параметар со кој ќе и кажеме на методата колку јаболка треба да бидат скинати:
public void skiniJabolko(int brojNaJabolka) {
vkupnoJabolka = vkupnoJabolka – brojNaJabolka;
}
Во оваа нова верзија на методата специфициравме дека методата прима параметар од тип „int“, а вредноста се чива во променливата наречена „brojNaJabolka“. Потоа во блокот на методата истата променлива се користи за да се одземе од вредноста на променливата „vkupnoJabolka“. Сега можеме „да скинеме“ колку што сакаме јаболка од јаболкницата со едноставен повик на методата „skiniJabolko“. Еве неколку примери за повик на методата „skiniJabolko“:
Jabolknica j = new Jabolknica(); // Novo drvo
// Prerpostavka deka se izrasnati nekolku jabolka ;)
j.skiniJabolko(1); // Skinato edno jabolko od jabolknicata
j.skiniJabolko(5); // Skinati pet jabolko od jabolknicata
j.skiniJabolko(0); // Nissto ne pravi
int jabolka = 10;
j.skiniJabolko(jabolka); // Skinati 10 jabolka
j.skiniJabolko(-1); // Kine -1 jabolko??!???
Како што може да се види од последната линија, имаме проблем со методата. Таа како параметар ќе прими било кој број (integer) за да „скине“ толку јаболка и ништо не го запира програмот за да скине негативен број на јаболка. Кога ќе се погледне во методата, последнава линија всушност ќе додаде јаболка на јаболкницата, но тоа нетреба да се дозволи бидејќи такво нешто во реалниот живот непостои ... зајмисли, место да береш јаболка, да ги редиш на јаболкницата, хух. Исто така нема да има логика и да скинете повеќе јаболка одколку што има на јаболкницата! Со моменталниот код можат да се скинат повеќе јаболка одколку што истата „има на гранките“ ... неверувам дека јаболкницата може да даде јаболка кои ги нема.
Овие два проблема откриваат еден момент при дизајнирање на методи кои примаат параметри. Мораш да се осигураш дека параметрите кои се праќаат на методата имаат смисла пред истите да ги употребиш. Дури и кога планираш да ја користиш класата во твоите програми изненадувачки е лесно да се заборават некои вредности кои може, а можеби и нема да направат проблеми кога вредностите не се проверуваат автоматски.
Следнава модифицирана верзија на методата „skiniJabolko“ проверува дали параметарот има негативна вредност и дека вредноста не е поголема од бројот на јаболката на дрвото.
public void skiniJabolko(int brojNaJabolka) {
if (brojNaJabolka < 0) return; // nemoze da se skine negativen broj na jabolka
if (brojNaJabolka > vkupnoJabolka) return; // nema dovolno jabolka na drvoto
vkupnoJabolka = vkupnoJabolka – brojNaJabolka;
}
Наредбата „return“ веднаш го терминира методот, односно излегува од блокот на методот. Се забележува дека операцијата на берење јаболка (намалувањето на променливата „vkupnoJabolka“) ќе се извршиа само ако двата претходни услови (искази) имаат неточен резултат (false). Тоа ни дава сигурност дека ограничувањата ќе се случат пред да се изврши операцијата на берење на јаболката.
Еден проблем сеуште е тука. Како делот од кодот кој ја повикува методата „skiniJabolko“ ќе знае дали берењето на јаболка било успешно или не? Нели, доколку берењето не било успешно поради некое ограничување не би сакал програмата која се извршува да продолжи со извршување како да се набрани јаболката. За да го решиме тоа ќе ја модифицираме уште малку методата „skiniJabolko“, овој пат истата ќе може да враќа вредност.
public boolean skiniJabolko(int brojNaJabolka) {
if (brojNaJabolka < 0) return false;
if (brojNaJabolka > vkupnoJabolka) return false;
vkupnoJabolka = vkupnoJabolka – brojNaJabolka;
return true;
}
Методите не само што можат да примаат вредности проследени преку влезни параметри при повикот туку тие исто така можат и да пратат вредност назад со специфицирање на вредноста како дел од наредбата „return“. Во последнава верзија од методата зборот „void“ во декларацијата на методата го заменивме со зборот (податочен тип) „boolean“. Тоа кажува дека методата ќе врати Boolean (точно/неточно, односно true/false) вредност кога истата ќе биде терминирана. Во конкретниот случај методата ќе врати вредност „true“ само кога берењето на јаболката ќе биде успешно, а ќе врати „false“ ако неуспее поради некоја причина. Ова ни овозможува да го структуираме програмот кој го повикува методот на следниов начин:
if (!j.skiniJabolko(10)) {
System.out.println("Greska: Nemozam da naberam 10 jabolka");
System.exit();
}
jabolkaVoKosnica = jabolkaVoKosnica + 10;
Условот во исказот „if“ ја повикува методата „skiniJabolko“ со параметар чија вредност е 10, а потоа ја проверува вредноста која методата ја враќа за да провери дали е неточна (false, верувам дека веќе го примети операторот „!“). Доколку одговорот е „false“ се испечатува порака со грешка и со повик на методата „System.exit()“ програмот се терминира, што во конкретниов случај е логичен чекор поради некоја неочекувана грешка. Доколку одговорот беше точен (true) програмот ќе продолжеше да се извршува нормално.
Друга честа употреба на повратните вредности од методите е при креирање на методи кои извршуваат некои калкулации и го враќаат резултатот од калкулацијата. Ќе има уште примери од кои ќе можеш да научиш и други начини за употреба на споменатите можности на методите.
|
|
|
|
|
|
| |
|
|
---|
JavaTM и Java-базираните ознаки се трговски марки или регистрирани трговски марки на Sun Microsystems, Inc. во САД и други држави. Java.com.mk никако не соработува со Sun Microsystems, Inc. Сите други трговски марки се сопственост на нивните сопственици. |
|