JavaRush /مدونة جافا /Random-AR /طرق في جافا

طرق في جافا

نشرت في المجموعة
هناك مبدأ واحد مثير للاهتمام سمع عنه الكثيرون. يطلق عليه "فرق تسد". ويستخدم هذا المبدأ في العديد من مجالات الحياة البشرية، على سبيل المثال، في السياسة. ويدل على انقسام عدد كبير من الأجزاء غير المتجانسة في الدولة، وإثارة واستخدام العداء بين هذه الأجزاء. بمعنى آخر: خلق صراع بين أولئك الذين يحتمل أن يشكلوا تهديدًا للسلطة. لكننا مبرمجون، لذلك نحن مهتمون فقط بالتفسير الفني لهذا المبدأ. ويتم الأمر على النحو التالي: "إن مبدأ "فرق تسد" هو تقسيم المشكلة الكبيرة إلى مشكلات أصغر حتى تصبح أولية. ثم تحتاج إلى حلها بالتسلسل ودمج كل شيء في نظام واحد كامل. "يجب أن يحل هذا البرنامج المشكلة المعطاة" أي أنك تقوم ببساطة بتقسيم المشكلة الكبيرة إلى مشكلات أصغر، وهي مشكلة لا يمكنك حلها. ومن ثم تقوم بجمع الحل في حل واحد كبير. لاتباع هذا المبدأ البسيط والمفيد، تستخدم برمجة Java الأساليب. الأساليب في جافا - 1على سبيل المثال، نقوم بإنشاء ملاكم آلي. من المهم بالنسبة لنا أن يتحرك بشكل جيد، وينفذ ضربات دقيقة، ويراقب العدو أيضًا بحثًا عن نقاط الضعف. سيكون من الصعب كتابة كل هذا بطريقة رئيسية واحدة ، أليس كذلك؟ وإذا وصفنا كل شيء بطريقة واحدة، فسيكون الأمر كما يلي:
метод main() {
// Описание действий шага вперед
подача напряжения в отдельные модули;
поднятие ноги;
перевод в другую точку;
поставить ногу;
перенести вес на другую ногу;
если (противникАтакует()) {
        	// Описание действий уклонения робота.
        	...
} еслиНет {
        	// Описание действий обманного атакующего удара.
        	...
}
// Описание действий шага назад
...
}
ماذا لو كنا بحاجة إلى استخدام خطوة للأمام أو الركلة في مكان آخر من البرنامج؟ وصف جميع الإجراءات مرة أخرى؟ لا يصلح. هناك الكثير من الخطوط المتكررة التي من السهل أن تضيع فيها. نحتاج إلى وضع وصف تفاصيل الإجراء في وحدة منفصلة، ​​والتي ستقوم بتنفيذ خطوة الروبوت. ويمكننا استدعاء الطريقة في سطر واحد. شيء من هذا القبيل:
метод шагВперед() {
// Описание действий шага вперед
  	подача напряжения в отдельные модули;
  	поднятие ноги;
  	перевод в другую точку;
  	поставить ногу;
  	перенести вес на другую ногу;
}

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

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

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

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

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

الوصول الى المعدل

معدّل الوصول عبارة عن عدة كلمات رئيسية: public , Private , package . تشير هذه الكلمات إلى نطاق الطريقة. سأشرح ذلك ببساطة: بهذه الكلمة يبدو أنك تشارك طعامًا لذيذًا مع الآخرين. لذيذ هو طريقتك. إذا كانت خاصة ، فلا تشارك الطريقة مع فئات أخرى. إذا كانت الحزمة ، فأنت تشارك فقط مع الفئات الموجودة داخل الحزمة (يتم تجميع الفئات في حزم محددة، ستتعلم ذلك لاحقًا). حسنًا، يظهر للعامة أنك لطيف في حد ذاته وتشارك حلوى (طريقة) لذيذة مع البرنامج بأكمله. شيء من هذا القبيل. بعد بضعة مستويات سوف تفهم دور هذه الكلمات بشكل أفضل.

قيمة الإرجاع

انظر إلى المثال أعلاه: تم تمييز كافة الأساليب بالكلمة الأساسية void ، باستثناء واحد - isEnemyAttacked ، الذي يُرجع قيمة منطقية . إذا تم وضع علامة باطلة على الطريقة ، فقد لا تقوم بإرجاع أي شيء. تقوم هذه الطريقة ببساطة بتنفيذ مجموعة من الإجراءات وهذا كل شيء. الآن انتبه إلى الطريقة الرئيسية . تُسمى تلك الأساليب التي تُرجع الفراغ بهذه الطريقة في نص الطريقة. لكن يتم استدعاء الأسلوب 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;
 	}
}
سوف يوبخك المترجم أنه عند استيفاء الشرط الأول، تقوم بإرجاع شيء ما، ولكن عندما يتم استيفاء الشرط الثاني، لا تقوم بذلك.

تمرير المعلمات

يمكنك تمرير المعلمات إلى الطريقة المستخدمة أثناء عملها. المثال الأكثر بدائية هو جمع رقمين. لكننا لسنا بدائيين، أليس كذلك؟ لنأخذ مثالا آخر، نمطيا تماما. لنفترض أن لدينا طريقة 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;
}
(لنفترض أن لدينا فئة حساء تم إنشاؤها مسبقًا ) في الطريقة الرئيسية، نقوم بإنشاء مجموعة من المكونات، ثم "نعطيها للشيف" (نمررها إلى طريقة الشيف ). "الطباخ يصنع الحساء" ثم يعيده إلينا ككائن من فئة الحساء . كل شيء بسيط جدا. يمكنك تمرير أي معلمات وأنواع بدائية وكائنات ومصفوفات وما إلى ذلك إلى الطريقة.

تمرير المعلمات حسب المرجع والقيمة

في لغة برمجة Java، يتم تمرير أي معلمات إلى الطريقة حسب قيمتها. ومع ذلك، تختلف هذه الآلية بالنسبة للأنواع البدائية وللكائنات. إذا قمت بتمرير أي نوع بدائي إلى طريقة ما وقمت بتغييره، فلن يتغير في الطريقة الرئيسية. لقد قمت ببساطة بتمرير نسخة من القيمة، وتم الاحتفاظ بالمتغير الأصلي. أبسط مثال:
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 التي تتمتع بخاصية الذكاء . وهناك طريقتان للتحكم في قيمة هذا المجال. في الطريقة الرئيسية نقوم بإنشاء كائن WiseMan ، ونضبط قيمة الذكاء على 300 . ثم نمرر حكيمنا ذو الذكاء 300 إلى طريقة ChangeObject ، لكنه في هذه الطريقة يصبح غبيًا. قمنا بتعيين قيمة الذكاء على 100. ثم في الطريقة الرئيسية نقوم بطباعة الكائن. يمكنك أن ترى أننا في طريقة ChangeObject نتعامل مع حكيم آخر في المتغير m . ومع ذلك، فإننا نقوم بتعديل كائننا الأصلي. الحقيقة هي أن كائن WiseMan في الطريقة الرئيسية وكائن m في طريقة ChangeObject هما نفس الرجل الحكيم، ويتم نسخ مرجع الكائن إلى الطريقة كمعلمة. ضع ذلك في الاعتبار عند تحرير كائن بطرق فردية.

وأخيرا، بضع كلمات حول المعدل الثابت

بشكل عام، بضع كلمات لن تفعل هنا، ولكن سأحاول. تنتمي الطرق العادية التي لم يتم وضع علامة عليها بهذا المعدل إلى كائن الفئة. والأساليب الثابتة تنتمي إلى الفصل نفسه. يمكن استخدام الطرق العادية على الكائنات الفردية. انظر إلى فئة WiseMan من المثال أعلاه. سيكون لكل حكيم أساليب getIq و setIq الخاصة به، لأن مستوى الذكاء لدى كل شخص مختلف. إذا أضفنا طريقة ثابتة generatorAWisePhrase إلى هذه الفئة ، فيمكننا استدعاء مثل هذه الطريقة بدون كائن:
WiseMan.generateAWisePhrase();
بشكل عام، هذه المعلومات كافية في الوقت الحالي، لأنه يمكن كتابة عدة محاضرات حول الثبات . اتبع بعض القواعد عند كتابة طريقة للحفاظ على النظام في التعليمات البرمجية الخاصة بك:
  • قم بتسمية أساليبك بأسماء ذات معنى حتى يكون واضحًا ما تفعله.
  • حاول ألا تكتب طرقًا طويلة جدًا. الطول الأمثل هو 8-15 سطرًا.
  • يجب ألا يتجاوز عدد معلمات الطريقة 4-5.
  • إذا كانت لديك وظيفة مماثلة مرتين في التعليمات البرمجية الخاصة بك، ففكر: ربما يكون من المفيد تعميمها ووضعها في طريقة منفصلة؟
ستساعدك هذه التقنيات على تحسين أداء برنامجك، والأهم من ذلك، جعل التعليمات البرمجية الخاصة بك أكثر قابلية للقراءة.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION