JavaRush /جاوا بلاگ /Random-UR /جاوا میں طریقے

جاوا میں طریقے

گروپ میں شائع ہوا۔
ایک دلچسپ اصول ہے جس کے بارے میں بہت سوں نے سنا ہے۔ اسے "تقسیم کرو اور فتح کرو" کہا جاتا ہے۔ یہ اصول انسانی زندگی کے بہت سے شعبوں میں استعمال ہوتا ہے، مثلاً سیاست میں۔ یہ ریاست میں متضاد حصوں کی ایک بڑی تعداد کی تقسیم کی نشاندہی کرتا ہے، ان حصوں کے درمیان دشمنی کو بھڑکانا اور استعمال کرنا۔ دوسرے الفاظ میں: ان لوگوں کے درمیان تنازعہ پیدا کریں جو ممکنہ طور پر اقتدار کے لیے خطرہ ہیں۔ لیکن ہم پروگرامر ہیں، اس لیے ہمیں صرف اس اصول کی تکنیکی تشریح میں دلچسپی ہے۔ اور یہ اس طرح جاتا ہے: "تقسیم کرو اور فتح کرو" کا اصول یہ ہے کہ کسی بڑے مسئلے کو اس وقت تک چھوٹے میں توڑ دیا جائے جب تک کہ وہ ابتدائی نہ ہو جائیں۔ پھر آپ کو انہیں ترتیب وار حل کرنے اور ہر چیز کو ایک پورے نظام میں جوڑنے کی ضرورت ہے۔ اس پروگرام کو دیے گئے مسئلے کو حل کرنا چاہیے" یعنی آپ ایک بڑے مسئلے کو صرف چھوٹے حصوں میں توڑ دیتے ہیں، جسے حل کرنا آپ کے لیے کوئی مسئلہ نہیں ہے۔ اور پھر آپ حل کو ایک بڑے میں جمع کرتے ہیں۔ اس سادہ اور مفید اصول پر عمل کرنے کے لیے، جاوا پروگرامنگ طریقے استعمال کرتی ہے۔ جاوا میں طریقے - 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 ، جو بولین ویلیو لوٹاتا ہے ۔ اگر کسی طریقہ کو باطل کے طور پر نشان زد کیا جاتا ہے ، تو یہ کچھ بھی واپس نہیں کر سکتا ہے۔ یہ طریقہ صرف اعمال کا ایک سیٹ انجام دیتا ہے اور بس۔ اب اہم طریقہ پر توجہ دینا . وہ طریقے جو باطل کو لوٹاتے ہیں بالکل اسی طرح کہلاتے ہیں، طریقہ کے جسم میں۔ لیکن 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;
 	}
}
مرتب کرنے والا آپ کو ڈانٹ دے گا کہ جب پہلی شرط پوری ہو جاتی ہے تو آپ کچھ واپس کر دیتے ہیں لیکن جب دوسری شرط پوری ہو جاتی ہے تو آپ واپس نہیں کرتے۔

پاسنگ پیرامیٹرز

آپ پیرامیٹرز کو اس طریقہ کار میں منتقل کر سکتے ہیں جو اس کے آپریشن کے دوران استعمال ہوتے ہیں۔ سب سے قدیم مثال دو نمبروں کا مجموعہ ہے۔ لیکن ہم قدیم نہیں ہیں، ٹھیک ہے؟ آئیے ایک اور مثال لیتے ہیں، کافی دقیانوسی۔ ہم کہتے ہیں کہ ہمارے پاس ایک طریقہ ہے شیف() - کک۔ ہم سوپ کے اجزاء کو پیرامیٹر بلاک میں اس طریقہ پر منتقل کر سکتے ہیں، اور اس کے نتیجے میں، یہ طریقہ ہمیں سوپ واپس کر دیتا ہے۔ اس طرح:
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 پر سیٹ کرتے ہیں۔ پھر مین میتھڈ میں ہم آبجیکٹ کو پرنٹ کرتے ہیں۔ آپ دیکھ سکتے ہیں کہ changeObject طریقہ میں ہم متغیر m میں ایک اور بابا کو جوڑ رہے ہیں ۔ تاہم، ہم اپنے اصل اعتراض میں ترمیم کر رہے ہیں۔ حقیقت یہ ہے کہ مین میتھڈ میں wiseMan آبجیکٹ اور changeObject میتھڈ میں m آبجیکٹ ایک ہی عقلمند آدمی ہیں، اور آبجیکٹ کا حوالہ پیرامیٹر کے طور پر طریقہ میں کاپی کیا جاتا ہے۔ جب آپ کسی چیز کو انفرادی طریقوں سے ایڈٹ کرتے ہیں تو اسے ذہن میں رکھیں۔

آخر میں، سٹیٹک موڈیفائر کے بارے میں چند الفاظ

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