CodeGym /جاوا بلاگ /Random-SD /جاوا تعمير ڪندڙ
John Squirrels
سطح
San Francisco

جاوا تعمير ڪندڙ

گروپ ۾ شايع ٿيل
سلام اڄ اسان هڪ تمام اهم موضوع تي غور ڪنداسين جيڪو اسان جي شين سان تعلق رکي ٿو. بغير مبالغہ جي، اسان اهو چئي سگهون ٿا ته توهان هن موضوع کي حقيقي زندگي ۾ هر روز استعمال ڪندا! اسان جاوا تعمير ڪندڙ بابت ڳالهائي رهيا آهيون. اهو ٿي سگهي ٿو پهريون ڀيرو توهان هي اصطلاح ٻڌي رهيا آهيو، پر توهان اصل ۾ اڳ ۾ ئي تعمير ڪندڙ استعمال ڪيو آهي. توهان صرف ان کي محسوس نه ڪيو :) اسان پاڻ کي بعد ۾ هن جو قائل ڪيو.

دنيا ۾ ڇا تعمير ڪندڙ آهن ۽ انهن جي ضرورت ڇو آهي؟

اچو ته ٻن مثالن تي غور ڪريون.
public class Car {

   String model;
   int maxSpeed;

   public static void main(String[] args) {

       Car bugatti = new Car();
       bugatti.model = "Bugatti Veyron";
       bugatti.maxSpeed = 378;

   }
}
اسان اسان جي ڪار ٺاهي، ۽ ان جو ماڊل ۽ وڌ ۾ وڌ رفتار مقرر ڪيو. پر ڪار اعتراض واضح طور تي هڪ حقيقي منصوبي ۾ 2 فيلڊ نه هوندو. مثال طور، اهو ٿي سگهي ٿو 16 فيلڊ!
public class Car {

   String model;// model
   int maxSpeed;// maximum speed
   int wheels;// wheel width
   double engineVolume;// engine volume
   String color;// color
   int productionYear;// production year
   String ownerFirstName;// first name of owner
   String ownerLastName;// last name of owner
   long price;// price
   boolean isNew;// flag indicating whether car is new
   int seatsInTheCar;// number of seats in the car
   String cabinMaterial;// interior material
   boolean insurance;// flag indicating whether car is insured
   String manufacturerCountry;// manufacturer country
   int trunkVolume;// size of the trunk
   int accelerationTo100km;// how long it takes to accelerate to 100 km/h (in seconds)


   public static void main(String[] args) {
       Car bugatti = new Car();

       bugatti.color = "blue";
       bugatti.accelerationTo100km = 3;
       bugatti.engineVolume = 6.3;
       bugatti.manufacturerCountry = "Italy";
       bugatti.ownerFirstName = "Amigo";
       bugatti.productionYear = 2016;
       bugatti.insurance = true;
       bugatti.price = 2000000;
       bugatti.isNew = false;
       bugatti.seatsInTheCar = 2;
       bugatti.maxSpeed = 378;
       bugatti.model = "Bugatti Veyron";

   }

}
اسان ھڪڙو نئون ڪار اعتراض ٺاھيو آھي. اتي ھڪڙو مسئلو آھي: اسان وٽ 16 فيلڊ آھن، پر اسان صرف 12 جي شروعات ڪئي آھي ! ھاڻي ڪوڊ ڏسو ۽ انھن فيلڊن کي ڳولڻ جي ڪوشش ڪريو جيڪي اسان وساري ويٺا آھيون! ايترو آسان ناهي، ها؟ هن صورتحال ۾، هڪ پروگرامر آساني سان غلطي ڪري سگهي ٿو ۽ ڪجهه فيلڊ کي شروع ڪرڻ ۾ ناڪام ٿي سگهي ٿو. نتيجي طور، پروگرام غلط طريقي سان عمل ڪندو:
public class Car {

   String model;// model
   int maxSpeed;// maximum speed
   int wheels;// wheel width
   double engineVolume;// engine volume
   String color;// color
   int productionYear;// production year
   String ownerFirstName;// first name of owner
   String ownerLastName;// last name of owner
   long price;// price
   boolean isNew;// flag indicating whether car is new
   int seatsInTheCar;// number of seats in the car
   String cabinMaterial;// interior material
   boolean insurance;// flag indicating whether car is insured
   String manufacturerCountry;// manufacturer country
   int trunkVolume;// size of the trunk
   int accelerationTo100km;// how long it takes to accelerate to 100 km/h (in seconds)


   public static void main(String[] args) {
       Car bugatti = new Car();

       bugatti.color = "blue";
       bugatti.accelerationTo100km = 3;
       bugatti.engineVolume = 6.3;
       bugatti.manufacturerCountry = "Italy";
       bugatti.ownerFirstName = "Amigo";
       bugatti.productionYear = 2016;
       bugatti.insurance = true;
       bugatti.price = 2000000;
       bugatti.isNew = false;
       bugatti.seatsInTheCar = 2;
       bugatti.maxSpeed = 378;
       bugatti.model = "Bugatti Veyron";

       System.out.println("Model: Bugatti Veyron. Engine volume: " + bugatti.engineVolume + ". Trunk volume: " + bugatti.trunkVolume + ". Cabin material: " + bugatti.cabinMaterial +
       ". Wheel width: " + bugatti.wheels + ". Purchased in 2018 by Mr. " + bugatti.ownerLastName);

   }

}
ڪنسول آئوٽ: ماڊل: بگٽي ويرون. انجڻ جو مقدار: 6.3. ٽرڪن جو مقدار: 0. ڪيبن جو مواد: نال. ويل ويڊٿ: 0. 2018 ۾ خريد ڪيو ويو مسٽر نل يور خريدار، جنهن ڪار لاءِ 2 ملين ڊالر ڏنا، ظاهر آهي ” مسٽر نال “ سڏجڻ پسند نه ڪندو! پر سنجيدگيءَ سان، هيٺئين لڪير اها آهي ته اسان جي پروگرام غلط طريقي سان هڪ شئي ٺاهي آهي: هڪ ڪار جنهن جي ويل ويڪر 0 آهي (يعني ڪو به ڦيٿو ناهي)، هڪ گم ٿيل ٽرن، هڪ نامعلوم مواد مان ٺهيل ڪيبن، ۽ سڀ کان وڌيڪ، هڪ اڻڄاتل مالڪ . توهان صرف تصور ڪري سگهو ٿا ته اهڙي غلطي ڪيئن ٿي سگهي ٿي "بند ٿي" جڏهن پروگرام هلي رهيو آهي! اسان کي اهڙين حالتن کان بچڻ گهرجي. اسان کي اسان جي پروگرام کي محدود ڪرڻ جي ضرورت آهي: جڏهن نئين ڪار اعتراض ٺاهي رهيا آهيون، اسان چاهيون ٿا ته فيلڊ، جهڙوڪ ماڊل ۽ وڌ ۾ وڌ رفتار، هميشه بيان ڪيو وڃي. ٻي صورت ۾، اسان اعتراض جي تخليق کي روڪڻ چاهيون ٿا. تعمير ڪندڙ هن ڪم کي آسانيء سان سنڀاليندا آهن. انهن جو نالو هڪ سبب لاء حاصل ڪيو. ٺاھيندڙ ھڪڙو قسم جو ڪلاس "سڪيل" ٺاھي ٿو جيڪو ھر نئين شئي کي ملائڻ گھرجي. سهولت لاء، اچو ته واپس وڃو ڪار ڪلاس جي سادي ورزن سان ٻن شعبن سان. اسان جي ضرورتن تي غور ڪندي، ڪار ڪلاس جو تعمير ڪندڙ هن طرح نظر ايندو:
public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}

// And creating an object now looks like this:

public static void main(String[] args) {
   Car bugatti = new Car("Bugatti Veyron", 378);
}
نوٽ ڪريو ته ڪيئن ٺاھيندڙ قرار ڏنو ويو آھي. اهو هڪ باقاعده طريقو سان ملندڙ جلندڙ آهي، پر ان ۾ واپسي جو قسم ناهي. ان کان علاوه، تعمير ڪندڙ طبقي جو نالو بيان ڪري ٿو ( ڪار ) ھڪڙي وڏي اکر سان شروع ٿئي ٿو. اضافي طور تي، تعمير ڪندڙ هڪ لفظ سان استعمال ڪيو ويو آهي جيڪو توهان لاء نئون آهي: هي . هي لفظ هڪ خاص اعتراض جي نشاندهي ڪرڻ لاءِ آهي. ٺاھيندڙ ۾ ڪوڊ
public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
لفظي معنيٰ ۾ بيان ڪري سگهجي ٿو: " هن ڪار جو ماڊل (جيڪو اسان هاڻي ٺاهي رهيا آهيون) اهو ماڊل دليل آهي جيڪو تعمير ڪندڙ کي ڏنو ويو آهي. هن ڪار لاءِ maxSpeed ​​(جيڪي اسان ٺاهي رهيا آهيون) maxSpeed ​​دليل آهي تعمير ڪندڙ. ۽ ائين ئي ٿئي ٿو:
public class Car {

   String model;
   int maxSpeed;

   public Car(String model, int maxSpeed) {
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   public static void main(String[] args) {
       Car bugatti = new Car("Bugatti Veyron", 378);
       System.out.println(bugatti.model);
       System.out.println(bugatti.maxSpeed);
   }

}
ڪنسول آئوٽ: Bugatti Veyron 378 تعمير ڪندڙ صحيح طور تي گهربل قدر مقرر ڪيو. توهان شايد محسوس ڪيو آهي ته هڪ تعمير ڪندڙ هڪ عام طريقي سان تمام گهڻو ملندو آهي! تنهنڪري اهو آهي. هڪ تعمير ڪندڙ واقعي هڪ طريقو آهي، پر خاص خاصيتن سان :) جيئن طريقن سان، اسان اسان جي تعمير ڪندڙ ڏانهن دليلن کي منظور ڪيو. ۽ صرف هڪ طريقي کي سڏڻ وانگر، هڪ تعمير ڪندڙ کي سڏڻ ڪم نه ڪندو جيستائين توهان انهن جي وضاحت نه ڪريو:
public class Car {

   String model;
   int maxSpeed;

   public Car(String model, int maxSpeed) {
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   public static void main(String[] args) {
       Car bugatti = new Car(); // Error!
   }

}
توهان ڏسي سگهو ٿا ته تعمير ڪندڙ اهو آهي جيڪو اسان حاصل ڪرڻ جي ڪوشش ڪري رهيا هئاسين. هاڻي توهان بغير رفتار يا ماڊل جي ڪار ٺاهي نٿا سگهو! ٺاهيندڙن ۽ طريقن جي وچ ۾ هڪجهڙائي هتي ختم نه ٿيندي آهي. بس طريقن وانگر، تعمير ڪندڙن کي اوورلوڊ ڪري سگھجي ٿو. تصور ڪريو ته توھان وٽ گھر ۾ 2 پالتو ٻليون آھن. توهان انهن مان هڪ هڪ kitten طور مليو آهي. پر ٻيو جيڪو توهان گهٽيءَ مان کنيو هو، جڏهن اهو اڳي ئي وڏو ٿي چڪو هو، ۽ توهان کي خبر ناهي ته اها ڪيتري پراڻي آهي. انهي حالت ۾، اسان چاهيون ٿا ته اسان جو پروگرام ٻن قسمن جي ٻليون پيدا ڪرڻ جي قابل ٿي وڃي: اهي هڪ نالي ۽ عمر سان (پهرين ٻلي لاء)، ۽ اهي صرف هڪ نالي سان (ٻئي ٻلي لاء). هن لاء، اسان تعمير ڪندڙ کي اوور لوڊ ڪنداسين:
public class Cat {

   String name;
   int age;

   // For the first cat
   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   // For the second cat
   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5);
       Cat streetCatNamedBob = new Cat("Bob");
   }

}
"نالو" ۽ "عمر" جي ماپن سان گڏ اصل ٺاھيندڙ کان علاوه، اسان ھڪڙو وڌيڪ شامل ڪيو صرف ھڪڙي نالي جي پيٽرولر سان. بلڪل ساڳيءَ طرح جيئن اسان گذريل سبقن ۾ طريقن کي اوور لوڊ ڪيو. هاڻي اسان ٻنهي قسمن جي ٻليون ٺاهي سگهون ٿا :)
اسان کي تعمير ڪندڙن جي ضرورت ڇو آهي؟  - 2
ياد رکو ته سبق جي شروعات ۾ اسان چيو هو ته توهان اڳ ۾ ئي استعمال ڪيو آهي تعمير ڪندڙ ان کي سمجهڻ کان سواء؟ اسان جو مطلب هو جيڪو اسان چيو. حقيقت اها آهي ته جاوا ۾ هر ڪلاس آهي جنهن کي ڊفالٽ تعمير ڪندڙ سڏيو ويندو آهي. اهو ڪو به دليل نه وٺندو آهي، پر اهو هر وقت سڏيو ويندو آهي جڏهن توهان ڪنهن به طبقي جو ڪو اعتراض ٺاهيو.
public class Cat {

   public static void main(String[] args) {

       Cat smudge = new Cat(); // The default constructor is invoked here
   }
}
پهرين نظر ۾، اهو پوشيده آهي. اسان هڪ اعتراض پيدا ڪيو، پوء ڇا؟ ڪٿي آهي تعمير ڪندڙ هتي ڪجهه ڪري رهيو آهي؟ ان کي ڏسڻ لاءِ، اچو ته واضح طور تي ٻلي طبقي لاءِ خالي ڪنسٽرڪٽر لکون . اسان ان جي اندر ڪجهه جملا ڏيکارينداسين. جيڪڏهن جملي ڏيکاريل آهي، پوء تعمير ڪندڙ کي سڏيو ويو.
public class Cat {

   public Cat() {
       System.out.println("A cat has been created!");
   }

   public static void main(String[] args) {

       Cat smudge = new Cat(); // The default constructor is invoked here
   }
}
ڪنسول آئوٽ: هڪ ٻلي ٺاهي وئي آهي! اتي جي تصديق آهي! ڊفالٽ تعمير ڪندڙ هميشه توهان جي ڪلاس ۾ پوشيده طور تي موجود آهي. پر توھان کي ان بابت ھڪڙو وڌيڪ ڄاڻڻ گھرجي. ڊفالٽ ٺاھيندڙ ھڪڙي طبقي مان ختم ٿي ويندو آھي جڏھن توھان ٺاھيندڙ ٺاھيو دلائل سان. حقيقت ۾، اسان اڳ ۾ ئي هن جو ثبوت ڏٺو آهي. اهو هن ڪوڊ ۾ هو:
public class Cat {

   String name;
   int age;

   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   public static void main(String[] args) {

       Cat smudge = new Cat(); //Error!
   }
}
اسان نالي ۽ عمر کان سواءِ ٻلي نه ٺاهي سگهياسين ، ڇاڪاڻ ته اسان هڪ ٻلي ٺاهيندڙ کي اسٽرنگ ۽ انٽ پيراميٽر سان قرار ڏنو آهي. اهو ڊفالٽ تعمير ڪندڙ کي فوري طور تي ڪلاس مان غائب ٿي ويو. تنهن ڪري ياد رکڻ جي پڪ ڪريو ته جيڪڏهن توهان کي پنهنجي ڪلاس ۾ ڪيترن ئي تعمير ڪندڙن جي ضرورت آهي، جنهن ۾ هڪ غير دليل سازي شامل آهي، توهان کي اهو الڳ الڳ اعلان ڪرڻو پوندو. مثال طور، فرض ڪريو اسان هڪ پروگرام ٺاهي رهيا آهيون جانورن جي ڪلينڪ لاءِ. اسان جي ڪلينڪ چڱا ڪم ڪرڻ چاهي ٿي ۽ بي گهر ٻلين جي مدد ڪرڻ چاهي ٿي جن جا نالا ۽ عمر نامعلوم آهن. پوء اسان جو ڪوڊ هن طرح ڏسڻ گهرجي:
public class Cat {

   String name;
   int age;

   // For cats with owners
   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   // For street cats
   public Cat() {
   }

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5);
       Cat streetCat = new Cat();
   }
}
هاڻي ته اسان هڪ واضح ڊفالٽ ڪنسٽرڪٽر لکيو آهي، اسان ٻنهي قسمن جا ڪيٽ ٺاهي سگهون ٿا :) جيئن ڪنهن به طريقي سان، آرگيومينٽس جو آرڊر هڪ ڪنسٽرڪٽر ڏانهن منتقل ڪرڻ تمام ضروري آهي. اچو ته اسان جي تعمير ڪندڙ ۾ نالو ۽ عمر جي دليلن کي تبديل ڪريون.
public class Cat {

   String name;
   int age;

   public Cat(int age, String name) {
       this.name = name;
       this.age = age;
   }

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 10); // Error!
   }
}
هڪ غلطي! تعمير ڪندڙ واضح طور تي بيان ڪري ٿو ته جڏهن هڪ ٻلي شئي ٺاهي وئي آهي، ان کي لازمي طور تي هڪ نمبر ۽ اسٽرنگ پاس ڪيو وڃي، هن ترتيب ۾. تنهن ڪري، اسان جو ڪوڊ ڪم نٿو ڪري. هن کي ياد رکڻ جي پڪ ڪريو ۽ ان کي ذهن ۾ رکو جڏهن توهان جي پنهنجي طبقن جو اعلان ڪريو:
public Cat(String name, int age) {
   this.name = name;
   this.age = age;
}

public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
اهي ٻه مڪمل طور تي مختلف تعمير ڪندڙ آهن! جيڪڏهن اسان هڪ جملي ۾ ان سوال جو جواب ڏيڻ چاهيون ٿا ته "مون کي تعمير ڪندڙ جي ضرورت ڇو آهي؟"، اسان شايد چئي سگهون ٿا، "انهي کي يقيني بڻائڻ لاء ته شيون هميشه صحيح حالت ۾ آهن". جڏهن توهان تعمير ڪندڙ استعمال ڪندا آهيو، توهان جا سڀئي متغير صحيح طور تي شروع ڪيا ويندا. توهان جي پروگرامن ۾ 0 جي رفتار يا ڪنهن ٻئي "غلط" شين سان ڪا به ڪار نه هوندي. انهن جو بنيادي فائدو پروگرامر لاء آهي. جيڪڏهن توهان فيلڊز کي دستي طور تي شروع ڪيو (هڪ اعتراض ٺاهڻ کان پوء)، اتي هڪ وڏو خطرو آهي ته توهان ڪجهه وڃايو ۽ هڪ بگ متعارف ڪرايو. پر اهو هڪ تعمير ڪندڙ سان نه ٿيندو: جيڪڏهن توهان سڀني گهربل دليلن کي پاس ڪرڻ ۾ ناڪام ٿيو يا توهان غلط قسم جا دلائل پاس ڪندا، مرتب ڪندڙ فوري طور تي هڪ غلطي رجسٽر ڪندو. اسان کي الڳ الڳ چوڻ گهرجي ته توهان کي پنهنجي پروگرام جي منطق کي تعمير ڪندڙ جي اندر نه رکڻ گهرجي. هي ڪهڙا طريقا آهن جن لاءِ آهن. طريقا آهن جتي توهان سڀني گهربل ڪارڪردگي کي بيان ڪرڻ گهرجي. اچو ته ڏسون ڇو ته ٺهڪندڙ ۾ منطق شامل ڪرڻ خراب خيال آهي:
public class CarFactory {

   String name;
   int age;
   int carsCount;

   public CarFactory(String name, int age, int carsCount) {
   this.name = name;
   this.age = age;
   this.carsCount = carsCount;

   System.out.println("Our car factory is called " + this.name);
   System.out.println("It was founded " + this.age + " years ago" );
   System.out.println("Since that time, it has produced " + this.carsCount +  " cars");
   System.out.println("On average, it produces " + (this.carsCount/this.age) + " cars per year");
}

   public static void main(String[] args) {

       CarFactory ford = new CarFactory("Ford", 115 , 50000000);
   }
}
اسان وٽ ڪار فيڪٽري ڪلاس آهي جيڪو ڪار ڪارخاني کي بيان ڪري ٿو. تعمير ڪندڙ جي اندر، اسان سڀني شعبن کي شروع ڪريون ٿا ۽ ڪجهه منطق شامل ڪريون ٿا: اسان فيڪٽري بابت ڪجهه معلومات ڏيکاريون ٿا. اهو لڳي ٿو ته هن بابت ڪجهه به خراب ناهي. پروگرام ٺيڪ ڪم ڪري ٿو. ڪنسول آئوٽ پُٽ: اسان جي ڪار ڪارخاني جو نالو آهي فورڊ اهو 115 سال اڳ قائم ڪيو ويو هو ان وقت کان وٺي هن وقت تائين 50000000 ڪارون پيدا ڪيون آهن سراسري طور تي هر سال 434782 ڪارون پيدا ڪري ٿي پر اسان اصل ۾ وقت جي دير واري مائن رکي آهي. ۽ هن قسم جو ڪوڊ تمام آساني سان غلطين جي ڪري سگھي ٿو. فرض ڪريو ته هاڻي اسان فورڊ بابت نه، پر هڪ نئين ڪارخاني جي باري ۾ ڳالهائي رهيا آهيون "اميگو موٽرز"، جيڪا هڪ سال کان به گهٽ عرصي کان موجود آهي ۽ 1000 ڪارون پيدا ڪيون آهن:
public class CarFactory {

   String name;
   int age;
   int carsCount;

   public CarFactory(String name, int age, int carsCount) {
   this.name = name;
   this.age = age;
   this.carsCount = carsCount;

   System.out.println("Our car factor is called " + this.name);
   System.out.println("It was founded " + this.age + " years ago" );
   System.out.println("Since that time, it has produced " + this.carsCount +  " cars");
   System.out.println("On average, it produces " + (this.carsCount/this.age) + " cars per year");
}


   public static void main(String[] args) {

       CarFactory ford = new CarFactory("Amigo Motors", 0 , 1000);
   }
}
ڪنسول آئوٽ پُٽ: اسان جي ڪار ڪارخاني کي اميگو موٽرس ايڪسيپشن سڏيو ويندو آهي ٿريڊ ۾ "main" java.lang.ArithmeticException: / by zero اهو 0 سال اڳ ٺهرايو ويو هو ان وقت کان وٺي، هن CarFactory ۾ 1000 ڪارون پيدا ڪيون آهن. (CarFactory.java:15) تي CarFactory.main(CarFactory.java:23) عمل ختم ٿيو ايگزٽ ڪوڊ 1 سان بوم! پروگرام ڪجهه قسم جي ناقابل فهم غلطي سان ختم ٿئي ٿو. ڇا توهان سبب اندازو ڪرڻ جي ڪوشش ڪري سگهو ٿا؟ مسئلو منطق ۾ آھي جيڪو اسان ٺاھيندڙ ۾ رکون ٿا. وڌيڪ خاص طور تي، هي لائن:
System.out.println("On average, it produces " + (this.carsCount/this.age) + " cars per year");
هتي توهان هڪ ڳڻپيوڪر انجام ڏئي رهيا آهيو ۽ ڪارخاني جي عمر طرفان پيدا ڪيل ڪارن جي تعداد کي ورهائي رهيا آهيو. ۽ جيئن ته اسان جو ڪارخانو نئون آهي (يعني اهو 0 سال پراڻو آهي)، اسان 0 سان ورهايون ٿا، جيڪو اسان رياضي ۾ نٿا ڪري سگهون. نتيجي طور، پروگرام هڪ غلطي سان ختم ٿئي ٿو.

اسان کي ڇا ڪرڻ گهرجي ها؟

سڀني منطق کي الڳ طريقي سان رکو. اچو ته ان کي سڏين printFactoryInfo() . توهان ان کي هڪ دليل جي طور تي هڪ CarFactory اعتراض پاس ڪري سگهو ٿا. توهان اتي سڀ منطق رکي سگهو ٿا، ۽ هڪ ئي وقت ۾ امڪاني غلطين کي سنڀالي سگهو ٿا (جهڙوڪ اسان جو صفر سال شامل آهي). هر هڪ کي پنهنجي. صحيح اعتراض جي حالت قائم ڪرڻ لاء تعمير ڪندڙن جي ضرورت آهي. اسان وٽ ڪاروباري منطق جا طريقا آهن. هڪ کي ٻئي سان نه ملايو. جيڪو توهان سکيو ان کي مضبوط ڪرڻ لاءِ، اسان توهان کي اسان جي جاوا ڪورس مان هڪ وڊيو سبق ڏسڻ جي صلاح ڏيون ٿا
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION