JavaRush /Java блогу /Random-KY /Java тилиндеги методдор
Professor Hans Noodles
Деңгээл

Java тилиндеги методдор

Группада жарыяланган
Көптөр уккан кызыктуу бир принцип бар. Ал «Бөлүн жана жеңип ал» деп аталат. Бул принцип адам жашоосунун көп тармактарында, мисалы, саясатта колдонулат. Бул мамлекетте көп сандагы гетерогендүү бөлүктөрдүн бөлүнүшүн билдирет, бул бөлүктөр ортосунда кастыкты тутандыруу жана пайдалануу. Башкача айтканда: бийликке коркунуч туудурган адамдардын ортосунда чыр-чатакты түзүү. Бирок биз программисттербиз, ошондуктан бул принципти техникалык чечмелөө гана кызыкдар. Ал эми мындай болот: “Бөл жана жеңип ал” принциби чоң көйгөйдү алар elementрдык болуп калганга чейин майда-чүйдөсүнө бөлүү. Андан кийин аларды ырааттуу чечип, баарын бир бүтүн системага бириктирүү керек. Бул программа берилген маселени чечиши керек” Башкача айтканда, сиз жөн гана чоң көйгөйдү кичинесине бөлөсүз, алар сиз үчүн көйгөй эмес. Анан чечимди бир чоңго чогултасыз. Бул жөнөкөй жана пайдалуу принципти кармануу үчүн Java программалоо ыкмаларын колдонот. Java тorндеги методдор - 1Мисалы, робот-боксчуну жасап жатабыз. Биз үчүн анын жакшы кыймылдап, так соккуларды жасаганы, ошондой эле алсыз жерлерди издеп, душманды карап турганы маанилүү. Мунун баарын бир негизги ыкма менен жазуу ыңгайсыз болот , туурабы? Эгерде биз бардыгын бир ыкма менен сүрөттөп берсек, анда ал төмөнкүдөй болот:
метод main() {
// Описание действий шага вперед
подача напряжения в отдельные модули;
поднятие ноги;
перевод в другую точку;
поставить ногу;
перенести вес на другую ногу;
если (противникАтакует()) {
        	// Описание действий уклонения робота.
        	...
} еслиНет {
        	// Описание действий обманного атакующего удара.
        	...
}
// Описание действий шага назад
...
}
Эгер биз алдыга бир кадамды колдонушубуз же программанын башка жеринде тепкилешибиз керек болсочы? Бардык аракеттерди кайра сүрөттөп бериңизчи? Туура келбейт. Адашып кетүү оңой болгон кайталанган саптар өтө көп. Биз робот кадамын аткара турган өзүнчө модулда иш-аракеттердин деталдарынын сүрөттөлүшүн жайгаштырышыбыз керек. Жана биз методду бир сапта чакыра алабыз. Бул сыяктуу бир нерсе:
метод шагВперед() {
// Описание действий шага вперед
  	подача напряжения в отдельные модули;
  	поднятие ноги;
  	перевод в другую точку;
  	поставить ногу;
  	перенести вес на другую ногу;
}

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

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

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

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

метод main() {
	шагВперед();
	если (противникАтакует()) {
        	уклонение();
	} еслиНет {
  	  обманныйАтакующийУдар();
	}
	шагНазад();
}
Эми биз роботтун функцияларын, ошондой эле компакттуу жана так main() ыкмасын бөлүп алдык . Калган ыкмаларды да каалаган функционалдуулукка бөлүүгө болот, мисалы, алдамчы Чабуул Strike ыкмаларына бөлүнөт алдоо Кыймыл , Бут кыймылы , чабуул . Ал эми алар, өз кезегинде, акыры, elementрдык топтомун алуу үчүн жөнөкөй тапшырмаларга дайындалат. Макул, эми мунун баарын Java кабыл ала турган формада сонун жазалы.
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;
}
Бул code азыр сизге бир аз түшүнүксүз болушу мүмкүн экенин түшүнөм, айрыкча void , return жана башкалар сыяктуу кээ бир сөздөр. Помидор ыргытканга шашпа, мен азыр баарын түшүндүрүп берем. "Бөл жана жеңип ал" парадигмасынын жалпы идеясы сизге түшүнүктүү болушу керек. Бул жагынан бизге методдор жардам берет. Метод декларацияларынын жалпы структурасы төмөнкүдөй:
модификатор_доступа возвращаемое_meaning Name_метода(принимаемые_параметры) {
   	//Тело метода
}

Кирүү өзгөрткүч

Кирүү модификатору бир нече ачкыч сөздөр: public , private , package . Бул сөздөр методдун көлөмүн көрсөтүп турат. Мен муну жөнөкөй эле түшүндүрүп берейин: бул сөз менен сиз башкалар менен даамдуу тамакты бөлүшүп жаткан окшойсуз. Даамдуу сиздин ыкмаңыз. Эгер ал купуя болсо, методду башка класстар менен бөлүшпөйсүз. Эгер пакет болсо , сиз топтомдун ичиндеги класстар менен гана бөлүшөсүз (класстар белгилүү пакеттерге чогултулган, муну кийинчерээк билесиз). Ооба, коомчулук сиздин боорукер экениңизди жана бүт программа менен даамдуу тамакты (ыкма) бөлүшөрүңүздү көрсөтөт. Ушул сыяктуу бир нерсе. Бир нече деңгээлден кийин сиз бул сөздөрдүн ролун жакшыраак түшүнөсүз.

Кайтаруу мааниси

Жогорудагы мисалды караңыз: бардык ыкмалар логикалык маанини кайтарган isEnemyAttacked дан башка, void ачкыч сөзү менен белгиленген . Эгерде ыкма void деп белгиленсе , ал эч нерсе кайтарбашы мүмкүн. Бул ыкма жөн гана иш-аракеттердин жыйындысын аткарат жана ушуну менен бүттү. Эми негизги ыкмага көңүл буруңуз . Void кайтарган методдор методдун денесинде ушундай деп аталат. Бирок isEnemyAttacked ыкмасы if операторунун кашаасынын ичинде чакырылат . Бул логикалык маанини кайтарып бергендиктен, биз аралык өзгөрмөнү колдонууга эмес, аны түз киргизүүгө мүмкүнчүлүк алабыз. Маани кайтаруу return ачкыч сөзү менен ишке ашат . Эгерде метод int түрүн кайтарса , биз методду каалаган туюнтмадан чакыра алабыз:
public static int getNumber() {
 	    return 5;
}

public static void main(String[] args) {
    	int result = 5 + 6 + getNumber();
    	System.out.println(result);
}
Жыйынтык:
16
getNumber ыкмасы int маанисин кайтарат , ошондуктан биз аны туюнтмадан чакыра алабыз. Ошондой эле, ыкма ар кандай түрдү, анын ичинде өзүңүз жараткандарды да кайтара алат. Эгерде сиз метод үчүн кайтаруу түрүн көрсөтсөңүз, анда сиз бир нерсени кайтарышыңыз керек. Сиз муну мындай жаза албайсыз:
public static int findMaxNumber(int a, int b) {
 	if(a>b) {
 	    return a;
 	}
}
Компилятор биринчи шарт аткарылганда бир нерсени кайтарасың, ал эми экинчи шарт аткарылганда кайтарбайсың деп урушат.

Өтүү параметрлери

Сиз анын иштөө учурунда колдонулган ыкмага параметрлерди өткөрө аласыз. Эң примитивдүү мисал - эки сандын суммасы. Бирок биз примитивдүү эмеспиз, туурабы? Дагы бир мисалды алалы, абдан стереотиптик. Бизде ашпозчу() ыкмасы бар дейли - ашпозчу. Шорпо ингредиенттерин параметр блогунда бул ыкмага өткөрүп алабыз жана натыйжада бул ыкма шорпону бизге кайтарат. Бул сыяктуу:
public static void main(String[] args) {
    	String[] ingredients;
    	// Инициализация массива ингредиентов
    	Soup soup = chef(ingredients);

}

public static Soup chef(String[] ingredients) {
    	Soup soup = new Soup();
    	// Процесс варки супа
    	return soup;
}
(Бизде алдын ала түзүлгөн Шорпо классы бар дейли ) Негизги ыкмада биз ингредиенттердин массивин түзүп, анан “ашпозчуга беребиз” (аны ашпозчу ыкмасына өткөрүп беребиз ) . "Ашпозчу шорпо жасайт" анан аны шорпо классынын an objectиси катары бизге кайтарып берет . Баары абдан жөнөкөй. Методго каалаган параметрлерди, примитивдүү типтерди, an objectтерди, массивдерди ж.б. өткөрө аласыз.

Параметрлерди шилтеме жана маани боюнча өткөрүү

Java программалоо тorнде ар кандай параметрлер өз мааниси боюнча методго өткөрүлүп берилет. Бирок, бул механизм примитивдүү типтер жана an objectтер үчүн ар түрдүү. Эгер кандайдыр бир примитивдүү типти методго өткөрүп, аны өзгөртсөңүз, ал негизги методдо өзгөрбөйт. Сиз жөн гана маанинин көчүрмөсүн өткөрдүңүз жана баштапкы өзгөрмө сакталды. Эң жөнөкөй мисал:
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;
	}
Жыйынтык:
он бир
Бирок, an objectилерде өзгөртүүлөр баштапкы an objectке таасирин тийгизет:
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;
	}
}
Жыйынтык:
Биздин акылманыбызда IR 300 бар Биздин акылманыбызда IR 100 бар
Бизде iq касиети бар WiseMan классы бар . Жана бул талаанын маанисин көзөмөлдөгөн эки ыкма. Негизги ыкмада биз wiseMan an objectисин түзөбүз, iq маанисин 300гө орнотобуз . Анан биз iq 300 менен акылманыбызды changeObject ыкмасына өткөрөбүз.Бирок бул ыкмада ал келесоо болуп калат. Биз iq маанисин 100 деп койдук. Андан кийин негизги ыкмада an objectти басып чыгарабыз. Сиз changeObject методунда биз m өзгөрмөсүндө дагы бир акылманды манипуляциялап жатканыбызды көрө аласыз . Бирок, биз баштапкы an objectибизди өзгөртүп жатабыз. Чындыгында, негизги методдогу wiseMan an objectи менен changeObject методундагы m an objectи бир эле акылдуу адам жана an objectке шилтеме параметр катары методго көчүрүлөт. Объектти айрым ыкмалар менен түзөтүүдө муну эстен чыгарбаңыз.

Акыр-аягы, статикалык өзгөрткүч жөнүндө бир нече сөз

Жалпысынан алганда, бул жерде бир нече сөз болбойт, бирок мен аракет кылам. Бул өзгөрткүч менен белгиленбеген кадимки методдор класс an objectисине таандык. Ал эми статикалык методдор класстын өзүнө таандык. Регулярдуу ыкмалар айрым an objectилерде колдонулушу мүмкүн. Жогорудагы мисалдан WiseMan классын караңыз . Ар бир даанышмандын өзүнүн getIq жана setIq ыкмалары болот, анткени ар бир адамдын IQ деңгээли ар башка. Эгерде бул класска generAWisePhrase статикалык методун кошсок , анда биз мындай ыкманы an objectсиз чакыра алабыз:
WiseMan.generateAWisePhrase();
Жалпысынан алганда, бул маалымат азыр жетиштүү, анткени статикалык жөнүндө бир нече лекцияларды жазууга болот . Кодуңузда тартипти сактоо үчүн ыкманы жазууда бир нече эрежелерди аткарыңыз:
  • Методдоруңуздун эмне кылганы түшүнүктүү болушу үчүн мааниге ээ аттарды бериңиз.
  • Өтө узун ыкмаларды жазбаганга аракет кылыңыз. Оптималдуу узундугу 8-15 линия болуп саналат.
  • Методдун параметрлеринин саны 4-5тен ашпашы керек.
  • Эгер codeуңузда эки жолу окшош функция бар болсо, ойлонуп көрүңүз: балким, аны жалпылап, өзүнчө ыкмага коюу керекпи?
Бул ыкмалар программаңыздын иштешин жакшыртууга жана эң негизгиси codeуңузду окууга ыңгайлуу кылууга жардам берет.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION