JavaRush /وبلاگ جاوا /Random-FA /متدها در جاوا

متدها در جاوا

در گروه منتشر شد
یک اصل جالب وجود دارد که بسیاری در مورد آن شنیده اند. اسمش «تفرقه و غلبه» است. این اصل در بسیاری از عرصه های زندگی بشری به عنوان مثال در سیاست به کار می رود. نشان دهنده تقسیم تعداد زیادی از بخش های ناهمگون در ایالت است که باعث تحریک و استفاده از خصومت بین این بخش ها می شود. به عبارت دیگر: ایجاد تضاد بین کسانی که به طور بالقوه تهدیدی برای قدرت هستند. اما ما برنامه نویس هستیم، بنابراین فقط به تفسیر فنی این اصل علاقه مندیم. و این چنین است: "اصل "تفرقه و تسلط" این است که یک مشکل بزرگ را به مسائل کوچکتر تقسیم کنیم تا زمانی که ابتدایی شوند. سپس باید آنها را به صورت متوالی حل کنید و همه چیز را در یک سیستم کامل ترکیب کنید. این برنامه باید مشکل داده شده را حل کند.» یعنی شما به سادگی یک مشکل بزرگ را به مسائل کوچکتر تقسیم می کنید که برای شما مشکلی نیست. و سپس محلول را در یک راه حل بزرگ جمع آوری می کنید. برای پیروی از این اصل ساده و مفید، برنامه نویسی جاوا از روش هایی استفاده می کند. متدها در جاوا - 1به عنوان مثال، ما در حال ایجاد یک ربات بوکسور هستیم. برای ما مهم است که او خوب حرکت کند، ضربات دقیق انجام دهد و همچنین دشمن را در جستجوی نقاط ضعف تماشا کند. نوشتن همه اینها در یک روش اصلی ناخوشایند است ، اینطور نیست؟ اگر همه چیز را در یک روش توصیف کنیم، چیزی شبیه به این خواهد بود:
метод main() {
// Описание действий шага вперед
подача напряжения в отдельные модули;
поднятие ноги;
перевод в другую точку;
поставить ногу;
перенести вес на другую ногу;
если (противникАтакует()) {
        	// Описание действий уклонения робота.
        	...
} еслиНет {
        	// Описание действий обманного атакующего удара.
        	...
}
// Описание действий шага назад
...
}
اگر نیاز به استفاده از یک گام رو به جلو یا ضربه زدن در جای دیگری از برنامه داشته باشیم، چه؟ همه اقدامات را دوباره شرح دهید؟ مناسب نیست خطوط تکراری زیادی وجود دارد که به راحتی می توان در آنها گم شد. باید شرح جزئیات عمل را در یک ماژول جداگانه قرار دهیم که مرحله ربات را انجام می دهد. و می توانیم متد را در یک خط فراخوانی کنیم. چیزی شبیه به این:
метод шагВперед() {
// Описание действий шага вперед
  	подача напряжения в отдельные модули;
  	поднятие ноги;
  	перевод в другую точку;
  	поставить ногу;
  	перенести вес на другую ногу;
}

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

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

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

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

метод main() {
	шагВперед();
	если (противникАтакует()) {
        	уклонение();
	} еслиНет {
  	  обманныйАтакующийУдар();
	}
	шагНазад();
}
اکنون عملکرد ربات و همچنین یک متد main() فشرده و واضح را از هم جدا کرده ایم . روش های باقی مانده را نیز می توان به هر عملکردی تقسیم کرد، به عنوان مثال، حمله فریبنده حمله را می توان به روش های حرکت فریب ، حرکت پا ، حمله تقسیم کرد . و آنها نیز به نوبه خود به وظایف ساده تری اختصاص داده می شوند تا در نهایت مجموعه ای از کارهای ابتدایی را بدست آورند. خوب، حالا بیایید همه چیز را به شکلی زیبا بنویسیم که جاوا بپذیرد.
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;
}
می‌دانم که ممکن است اکنون این کد برای شما کمی مبهم باشد، مخصوصاً برخی از کلمات مانند void ، return و غیره. برای پرتاب گوجه فرنگی عجله نکنید، اکنون همه چیز را توضیح می دهم. ایده کلی پارادایم "تفرقه بینداز و حکومت کن" باید برای شما روشن باشد. روش ها در این امر به ما کمک خواهند کرد. ساختار کلی اعلان های روش به شرح زیر است:
модификатор_доступа возвращаемое_meaning Name_метода(принимаемые_параметры) {
   	//Тело метода
}

اصلاح کننده دسترسی

اصلاح کننده دسترسی چند کلمه کلیدی است: عمومی ، خصوصی ، بسته . این کلمات دامنه روش را نشان می دهد. من آن را به سادگی توضیح می دهم: با این کلمه به نظر می رسد که شما یک غذای خوشمزه را با دیگران به اشتراک می گذارید. خوشمزه روش شماست اگر خصوصی است ، روش را با کلاس‌های دیگر به اشتراک نمی‌گذارید. اگر بسته ، فقط با کلاس‌های درون بسته اشتراک‌گذاری می‌کنید (کلاس‌ها در بسته‌های خاصی جمع‌آوری می‌شوند، بعداً این را یاد خواهید گرفت). خوب، عمومی نشان می دهد که شما خود مهربان هستید و یک غذای خوشمزه (روش) را با کل برنامه به اشتراک می گذارید. چیزی شبیه به این. بعد از چند سطح، نقش این کلمات را خیلی بهتر درک خواهید کرد.

ارزش برگشتی

به مثال بالا نگاه کنید: همه متدها با کلمه کلیدی void علامت گذاری شده اند ، به جز یکی - isEnemyAttacked که یک مقدار بولی را برمی گرداند . اگر روشی void علامت گذاری شده باشد ، ممکن است چیزی برنگرداند. این روش به سادگی مجموعه ای از اقدامات را انجام می دهد و تمام. حالا به روش اصلی توجه کنید . متدهایی که void برمی‌گردانند دقیقاً به همین شکل، در بدنه متد نامیده می‌شوند. اما متد isEnemyAttacked در داخل پرانتز دستور if فراخوانی می شود . با توجه به این واقعیت که یک مقدار بولی برمی گرداند، ما این فرصت را داریم که از یک متغیر میانی استفاده نکنیم، بلکه مستقیماً آن را درج کنیم. برگرداندن یک مقدار با استفاده از کلمه کلیدی بازگشت انجام می شود . اگر متدی نوع 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;
 	}
}
کامپایلر به شما سرزنش می کند که وقتی شرط اول برآورده شد، چیزی را برمی گردانید، اما وقتی شرط دوم برآورده شد، این کار را نمی کنید.

عبور پارامترها

شما می توانید پارامترهایی را به روشی که در طول عملیات آن استفاده می شود، ارسال کنید. ابتدایی ترین مثال جمع دو عدد است. اما ما بدوی نیستیم، درست است؟ بیایید مثال دیگری بزنیم، کاملا کلیشه ای. فرض کنید یک متد chef() داریم - cook. می توانیم در بلوک پارامتر مواد سوپ را به این روش پاس دهیم و در نتیجه این روش سوپ را به ما برمی گرداند. مثل این:
public static void main(String[] args) {
    	String[] ingredients;
    	// Инициализация массива ингредиентов
    	Soup soup = chef(ingredients);

}

public static Soup chef(String[] ingredients) {
    	Soup soup = new Soup();
    	// Процесс варки супа
    	return soup;
}
(فرض کنید یک کلاس سوپ از قبل ساخته شده داریم ) در روش اصلی، آرایه ای از مواد تشکیل می دهیم و سپس آن را به سرآشپز می دهیم (آن را به روش سرآشپز منتقل می کنیم ). "آشپز سوپ را درست می کند" و سپس آن را به عنوان یک شی از کلاس سوپ به ما برمی گرداند . همه چیز بسیار ساده است. شما می توانید هر پارامتر، انواع اولیه، اشیا، آرایه ها و غیره را به متد ارسال کنید.

انتقال پارامترها توسط مرجع و مقدار

در زبان برنامه نویسی جاوا، هر پارامتری با مقدار خود به یک متد ارسال می شود. با این حال، این مکانیسم برای انواع اولیه و برای اشیاء متفاوت است. اگر هر نوع اولیه ای را به یک متد پاس کنید و آن را تغییر دهید، در متد اصلی تغییری نمی کند. شما به سادگی یک کپی از مقدار را ارسال کردید و متغیر اصلی حفظ شد. ساده ترین مثال:
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;
	}
نتیجه:
یازده
با این حال، در مورد اشیا، تغییرات بر شی اصلی تأثیر می گذارد:
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 دارد
ما یک کلاس WiseMan داریم که دارای ویژگی iq است . و دو روش که مقدار این فیلد را کنترل می کند. در روش اصلی یک شی wiseMan ایجاد می کنیم و مقدار iq را روی 300 قرار می دهیم . سپس حکیم خود را با iq 300 به متد changeObject پاس می کنیم.اما در این روش او احمق می شود. مقدار iq را 100 قرار می دهیم سپس در متد main شی را چاپ می کنیم. می بینید که در متد changeObject ما در حال دستکاری یک Sage دیگر در متغیر m هستیم . با این حال، ما در حال اصلاح شی اصلی خود هستیم. واقعیت این است که شی wiseMan در متد main و شی m در متد changeObject همان انسان خردمند هستند و ارجاع به شی به عنوان پارامتر در متد کپی می شود. هنگامی که یک شی را در روش های فردی ویرایش می کنید، این را در نظر داشته باشید.

در نهایت، چند کلمه در مورد اصلاح کننده استاتیک

به طور کلی، چند کلمه در اینجا انجام نمی شود، اما من سعی خواهم کرد. متدهای معمولی که با این اصلاح کننده مشخص نشده اند متعلق به شی کلاس هستند. و متدهای استاتیک متعلق به خود کلاس هستند. روش های منظم را می توان بر روی اشیاء فردی استفاده کرد. از مثال بالا به کلاس WiseMan نگاه کنید. هر حکیمی روش‌های getIq و setIq خود را خواهد داشت ، زیرا سطح IQ هر فرد متفاوت است. اگر یک متد استاتیک generateAWisePhrase را به این کلاس اضافه کنیم ، می توانیم چنین متدی را بدون شی فراخوانی کنیم:
WiseMan.generateAWisePhrase();
به طور کلی، این اطلاعات در حال حاضر کافی است، زیرا می توان چندین سخنرانی در مورد استاتیک نوشت . هنگام نوشتن روشی برای حفظ نظم در کد خود از چند قانون پیروی کنید:
  • روش‌های خود را نام‌های معنی‌دار بگذارید تا مشخص شود که چه می‌کنند.
  • سعی کنید روش های خیلی طولانی ننویسید. طول بهینه 8-15 خط است.
  • تعداد پارامترهای روش نباید از 4-5 تجاوز کند.
  • اگر دو بار عملکرد مشابهی در کد خود دارید، فکر کنید: شاید ارزش آن را داشته باشد که آن را تعمیم داده و در یک روش جداگانه قرار دهید؟
این تکنیک ها به شما کمک می کند تا عملکرد برنامه خود را بهبود ببخشید و مهمتر از همه، کدهای خود را خواناتر کنید.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION