JavaRush /Java blogi /Random-UZ /Java tilidagi usullar

Java tilidagi usullar

Guruhda nashr etilgan
Ko'pchilik eshitgan bir qiziqarli tamoyil bor. U “Bo‘l va zabt et” deb nomlanadi. Bu tamoyil inson hayotining ko'p sohalarida, masalan, siyosatda qo'llaniladi. Bu shtatdagi ko'p sonli turli xil qismlarning bo'linishini bildiradi, bu qismlar o'rtasida dushmanlikni qo'zg'atadi va ishlatadi. Boshqacha qilib aytadigan bo'lsak: hokimiyatga xavf tug'dirishi mumkin bo'lganlar o'rtasida ziddiyat yaratish. Ammo biz dasturchilarmiz, shuning uchun biz faqat ushbu printsipning texnik talqini bilan qiziqamiz. Va bu shunday bo'ladi: ""Bo'lin va zabt et" tamoyili - katta muammoni boshlang'ich darajaga etgunga qadar kichikroqlarga bo'lish. Keyin ularni ketma-ket hal qilishingiz va hamma narsani bir butun tizimga birlashtirishingiz kerak. Bu dastur berilgan muammoni hal qilishi kerak” Ya'ni, siz shunchaki katta muammoni kichikroqlarga bo'lasiz, bu siz uchun muammo emas. Va keyin siz yechimni bitta katta hajmga yig'asiz. Ushbu oddiy va foydali tamoyilga amal qilish uchun Java dasturlash usullaridan foydalanadi. Java tilidagi usullar - 1Masalan, biz robot-bokschi yaratmoqdamiz. Biz uchun uning yaxshi harakat qilishi, aniq zarbalar berishi, shuningdek, dushmanni zaif tomonlarini izlashda kuzatishi muhim. Bularning barchasini bitta asosiy usulda yozish noqulay bo'lardi , shunday emasmi? Agar biz hamma narsani bitta usulda tasvirlasak, u shunday bo'ladi:
метод main() {
// Описание действий шага вперед
подача напряжения в отдельные модули;
поднятие ноги;
перевод в другую точку;
поставить ногу;
перенести вес на другую ногу;
если (противникАтакует()) {
        	// Описание действий уклонения робота.
        	...
} еслиНет {
        	// Описание действий обманного атакующего удара.
        	...
}
// Описание действий шага назад
...
}
Agar dasturning boshqa joyida oldinga qadam qo'yish yoki tepish kerak bo'lsa-chi? Barcha harakatlarni yana tasvirlab bering? Tog'ri kelmaydi. Adashib qolish oson bo'lgan takrorlanadigan qatorlar juda ko'p. Harakat tafsilotlari tavsifini robot qadamini bajaradigan alohida modulga joylashtirishimiz kerak. Va biz bir qatorda usulni chaqirishimiz mumkin. Shunga o'xshash narsa:
метод шагВперед() {
// Описание действий шага вперед
  	подача напряжения в отдельные модули;
  	поднятие ноги;
  	перевод в другую точку;
  	поставить ногу;
  	перенести вес на другую ногу;
}

метод уклонение() {
  	// Действия для уклонения
  	...
}

метод обманныйАтакующийУдар() {
  	// Действия для удара
  	...
}

метод шагНазад() {
  	// Действия для шага назад
  	...
}

метод противникАтакует() {
	// Робот проверяет атакует ли противник
}

метод main() {
	шагВперед();
	если (противникАтакует()) {
        	уклонение();
	} еслиНет {
  	  обманныйАтакующийУдар();
	}
	шагНазад();
}
Endi biz robotning funksionalligini, shuningdek, ixcham va aniq main() usulini ajratdik . Qolgan usullar ham har qanday funksionallikka bo'linishi mumkin, masalan, aldamchi Hujum Strike usullariga bo'linishi mumkin aldash Harakat , Oyoq harakati , hujum . Va ular, o'z navbatida, oxir-oqibat boshlang'ich vazifalar to'plamini olish uchun oddiyroq vazifalarga topshiriladi. Mayli, keling, hammasini Java qabul qiladigan shaklda chiroyli qilib yozaylik.
public static void stepForward() {
  	    // Многострочный code, описывающий
  	    // действия робота для выполнения шага
  	    System.out.println("The robot takes a step forward");
}

public static void evasion() {
  	    // Действия для уклонения
  	    System.out.println("Robot shy of impact");
}

public static void deceptiveAttackBlow() {
  	    // Действия для удара
  	    System.out.println("The robot performs a deceptive strike");
}

public static void stepBack() {
  	    // Действия для шага назад
  	    System.out.println("The robot takes a step backwards");
}

public static void main(String[] args) {
    	stepForward();
    	if (isEnemyAttacked()) {
        		evasion();
    	} else {
  	    	deceptiveAttackBlow();
    	}
    	stepBack();
}

public static boolean isEnemyAttacked() {
    	// Метод проверяет, атакует ли враг. returns логическое meaning.
    	return true;
}
Men tushunaman, bu kod hozir siz uchun biroz tushunarsiz bo'lishi mumkin, ayniqsa void , return va hokazo kabi ba'zi so'zlar. Pomidorlarni tashlashga shoshilmang, men hozir hamma narsani tushuntiraman. "Bo'l va zabt et" paradigmasining umumiy g'oyasi siz uchun tushunarli bo'lishi kerak. Bunda bizga usullar yordam beradi. Usul deklaratsiyasining umumiy tuzilishi quyidagicha:
модификатор_доступа возвращаемое_meaning Name_метода(принимаемые_параметры) {
   	//Тело метода
}

Kirish modifikatori

Kirish modifikatori bir nechta kalit so'zlardir: public , private , package . Bu so'zlar usulning qamrovini bildiradi. Men buni oddiygina tushuntiraman: bu so'z bilan siz boshqalar bilan mazali taomni baham ko'rayotganga o'xshaysiz. Sizning usulingiz mazali. Agar u xususiy bo'lsa, siz usulni boshqa sinflar bilan baham ko'rmaysiz. Agar paket bo'lsa , siz faqat paket ichidagi sinflar bilan baham ko'rasiz (sinflar maxsus paketlarga yig'iladi, buni keyinroq bilib olasiz). Xo'sh, jamoatchilik sizning mehribonligingizni va butun dastur bilan mazali taom (usul) bilan bo'lishishingizni ko'rsatadi. Shunga o'xshash narsa. Bir necha darajalardan so'ng siz ushbu so'zlarning rolini ancha yaxshi tushunasiz.

Qaytish qiymati

Yuqoridagi misolga qarang: barcha usullar void kalit so'zi bilan belgilanadi, faqat bitta - isEnemyAttacked dan tashqari , mantiqiy qiymatni qaytaradi . Agar usul void deb belgilangan bo'lsa , u hech narsani qaytarmasligi mumkin. Bu usul oddiygina bir qator harakatlarni amalga oshiradi va bu ham shunday. Endi asosiy usulga e'tibor bering . Voidni qaytaradigan usullar usul tanasida xuddi shunday deb ataladi. Lekin isEnemyAttacked usuli if iborasining qavslar ichida chaqiriladi . U mantiqiy qiymatni qaytarganligi sababli, biz oraliq o'zgaruvchidan foydalanish emas, balki uni to'g'ridan-to'g'ri kiritish imkoniyatiga ega bo'lamiz. Qiymatni qaytarish return kalit so'zi yordamida amalga oshiriladi . Agar usul int turini qaytarsa , biz har qanday ifodadan usulni chaqirishimiz mumkin:
public static int getNumber() {
 	    return 5;
}

public static void main(String[] args) {
    	int result = 5 + 6 + getNumber();
    	System.out.println(result);
}
Xulosa:
16
getNumber usuli int qiymatini qaytaradi , shuning uchun biz uni ifodadan chaqirishimiz mumkin. Bundan tashqari, usul har qanday turni, shu jumladan o'zingiz yaratganlarni ham qaytarishi mumkin. Agar siz usul uchun qaytarish turini belgilagan bo'lsangiz, biror narsani qaytarishingiz kerak. Siz buni shunday yoza olmaysiz:
public static int findMaxNumber(int a, int b) {
 	if(a>b) {
 	    return a;
 	}
}
Kompilyator sizni birinchi shart bajarilganda, siz biror narsani qaytarasiz, lekin ikkinchi shart bajarilganda, siz qaytarmaysiz deb tanbeh beradi.

O'tish parametrlari

Parametrlarni uning ishlashi davomida ishlatiladigan usulga o'tkazishingiz mumkin. Eng ibtidoiy misol - ikkita raqamning yig'indisi. Lekin biz ibtidoiy emasmiz, to'g'rimi? Yana bir misolni olaylik, juda stereotipik. Aytaylik, bizda chef() usuli bor - oshpaz. Biz sho'rva ingredientlarini parametr blokida ushbu usulga o'tkazishimiz mumkin va natijada bu usul sho'rvani bizga qaytaradi. Mana bunday:
public static void main(String[] args) {
    	String[] ingredients;
    	// Инициализация массива ингредиентов
    	Soup soup = chef(ingredients);

}

public static Soup chef(String[] ingredients) {
    	Soup soup = new Soup();
    	// Процесс варки супа
    	return soup;
}
(Aytaylik, bizda oldindan yaratilgan Sho'rva sinfi bor ) Asosiy usulda biz ingredientlar qatorini yaratamiz, so'ngra uni “oshpazga beramiz” (oshpaz usuliga o'tkazamiz ) . "Oshpaz sho'rva tayyorlaydi" va keyin uni Sho'rva sinfining ob'ekti sifatida bizga qaytaradi . Hammasi juda oddiy. Usulga istalgan parametrlarni, ibtidoiy tiplarni, ob'ektlarni, massivlarni va hokazolarni o'tkazishingiz mumkin.

Parametrlarni mos yozuvlar va qiymat bo'yicha o'tkazish

Java dasturlash tilida har qanday parametr qiymatlari bo'yicha metodga uzatiladi. Biroq, bu mexanizm ibtidoiy turlar va ob'ektlar uchun farq qiladi. Agar biron-bir ibtidoiy tipni metodga o'tkazsangiz va uni o'zgartirsangiz, u asosiy usulda o'zgarmaydi. Siz shunchaki qiymatning nusxasini o'tkazdingiz va asl o'zgaruvchi saqlanib qoldi. Eng oddiy misol:
public static void main(String[] args) {
    	int x = 1;
    	System.out.println(x);
    	getNumber(x);
    	System.out.println(x);

	}

	public static void getNumber(int i) {
    	i = i + 100;
	}
Xulosa:
o'n bir
Biroq, ob'ektlar holatida, o'zgarishlar asl ob'ektga ta'sir qiladi:
public class Program
{
	public static void main(String[] args) {
    	WiseMan wiseMan = new WiseMan();
    	wiseMan.setIq(300);
    	System.out.println(wiseMan);
    	changeObject(wiseMan);
    	System.out.println(wiseMan);

	}

	public static void changeObject(WiseMan m) {
    	m.setIq(100);
	}
}

public class WiseMan {
	int iq;

	public void setIq(int iq) {
    	this.iq = iq;
	}

	public int getIq() {
    	return iq;
	}

	public String toString() {
    	return "Our wise man has an IQ "+iq;
	}
}
Xulosa:
Bizning donishmandimizda IR 300 bor. Bizning dono odamimizda IR 100 bor
Bizda iq xususiyatiga ega WiseMan sinf mavjud . Va bu maydonning qiymatini boshqaradigan ikkita usul. Asosiy usulda biz wiseMan ob'ektini yaratamiz , iq qiymatini 300 ga qo'ying . Keyin biz iq 300 bilan bilamizni changeObject usuliga o'tkazamiz.Lekin bu usulda u ahmoq bo'lib qoladi. Biz iq qiymatini 100 ga o'rnatamiz. Keyin asosiy usulda biz ob'ektni chop qilamiz. ChangeObject usulida biz m o'zgaruvchisida boshqa adaçayı manipulyatsiya qilayotganimizni ko'rishingiz mumkin . Biroq, biz asl ob'ektimizni o'zgartirmoqdamiz. Gap shundaki, asosiy metoddagi wiseMan obyekti va changeObject usulidagi m obyekti bir xil donishmand bo‘lib, ob’ektga havola parametr sifatida metodga ko‘chiriladi. Ob'ektni individual usullarda tahrirlashda buni yodda tuting.

Nihoyat, statik modifikator haqida bir necha so'z

Umuman olganda, bu erda bir necha so'z ishlamaydi, lekin men harakat qilaman. Ushbu modifikator bilan belgilanmagan oddiy usullar sinf ob'ektiga tegishli. Va statik usullar sinfning o'ziga tegishli. Alohida ob'ektlarda muntazam usullardan foydalanish mumkin. Yuqoridagi misoldan WiseMan sinfiga qarang . Har bir donishmandning o'ziga xos getIq va setIq usullari bo'ladi , chunki har kimning IQ darajasi har xil. Agar biz bu sinfga statik generator AWisePhrase usulini qo'shsak , bunday usulni ob'ektsiz chaqirishimiz mumkin:
WiseMan.generateAWisePhrase();
Umuman olganda, bu ma'lumot hozircha etarli, chunki statik haqida bir nechta ma'ruzalar yozilishi mumkin . Kodingizda tartibni saqlash usulini yozishda bir nechta qoidalarga amal qiling:
  • Usullaringiz nima qilayotgani aniq bo'lishi uchun mazmunli nomlar bering.
  • Juda uzoq usullarni yozmaslikka harakat qiling. Optimal uzunlik - 8-15 qator.
  • Usul parametrlarining soni 4-5 dan oshmasligi kerak.
  • Agar kodingizda ikki marta o'xshash funksiya mavjud bo'lsa, o'ylab ko'ring: ehtimol uni umumlashtirib, uni alohida usulga qo'yishga arziydimi?
Ushbu texnikalar dasturingiz ish faoliyatini yaxshilashga yordam beradi va eng muhimi, kodingizni o'qilishi mumkin bo'ladi.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION