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

حڪمت عملي ڊيزائن جو نمونو

گروپ ۾ شايع ٿيل
سلام اڄ جي سبق ۾، اسان حڪمت عملي جي نموني بابت ڳالهائينداسين. پوئين سبق ۾، اسان اڳ ۾ ئي مختصر طور تي وراثت جي تصور سان واقف ٿي چڪا آهيون. جيڪڏهن توهان وساري ڇڏيو، مان توهان کي ياد ڏياريندس ته هي اصطلاح هڪ عام پروگرامنگ ڪم جي معياري حل ڏانهن اشارو ڪري ٿو. CodeGym تي، اسان اڪثر چوندا آهيون ته توهان گوگل ڪري سگهو ٿا تقريبا ڪنهن به سوال جو جواب. اهو ئي سبب آهي ته توهان جو ڪم، جيڪو ڪجهه به آهي، شايد اڳ ۾ ئي ڪاميابي سان ڪنهن ٻئي طرفان حل ڪيو ويو آهي. نمونن جي ڪوشش-۽-سچائي حل ته سڀ کان عام ڪم, يا طريقن مسئلن کي حل ڪرڻ لاء. ھي آھن ”لھيل“ جھڙا آھن جن کي توھان کي پاڻ تي ٻيهر ايجاد ڪرڻ جي ضرورت ناھي، پر توھان کي اھو ڄاڻڻ گھرجي ته انھن کي ڪيئن ۽ ڪڏھن استعمال ڪجي :) نمونن جو ٻيو مقصد يونيفارم آرڪيٽيڪچر کي فروغ ڏيڻ آھي. ڪنهن ٻئي جو ڪوڊ پڙهڻ ڪو آسان ڪم ناهي! هرڪو مختلف ڪوڊ لکي ٿو، ڇاڪاڻ ته ساڳيو ڪم ڪيترن ئي طريقن سان حل ڪري سگهجي ٿو. پر نمونن جو استعمال مختلف پروگرامرز کي پروگرامنگ منطق کي سمجھڻ ۾ مدد ڪري ٿو بغير ڪوڊ جي ھر ھڪڙي لائن کي سمجھڻ کان سواء (جيتوڻيڪ اھو پھريون ڀيرو ڏسڻ ۾ اچي ٿو!) اڄ اسان ھڪڙي عام ڊيزائن جي نمونن مان ھڪڙي کي ڏسون ٿا "حڪومتي". ڊيزائن جو نمونو: حڪمت عملي - 2تصور ڪريو ته اسان ھڪڙو پروگرام لکي رھيا آھيون جيڪو فعال طور تي Conveyance شين سان ڪم ڪندو. اهو اصل ۾ فرق نٿو پوي ته اسان جو پروگرام ڇا ڪندو آهي. اسان ھڪڙي ڪلاس جو درجو ٺاھيو آھي ھڪڙي Conveyance والدين ڪلاس ۽ ٽن ٻارن جي طبقن سان: Sedan , Truck ۽ F1Car .
public class Conveyance {

   public void go() {
       System.out.println("Moving forward");
   }

   public void stop() {

       System.out.println("Braking!");
   }
}

public class Sedan extends Conveyance {
}

public class Truck extends Conveyance {
}

public class F1Car extends Conveyance {
}
سڀئي ٽي ٻار ڪلاس والدين کان ٻه معياري طريقا ورثي ۾ ملن ٿا: go() ۽ stop() . اسان جو پروگرام تمام سادو آهي: اسان جون ڪارون صرف اڳتي وڌي سگهن ٿيون ۽ برڪس لاڳو ڪري سگهن ٿيون. اسان جي ڪم کي جاري رکندي، اسان فيصلو ڪيو ته ڪارن کي هڪ نئون طريقو ڏيو: fill() (مطلب، "گيس ٽانڪ ڀريو"). اسان ان کي شامل ڪيو Conveyance والدين طبقي ۾:
public class Conveyance {

   public void go() {
       System.out.println("Moving forward");
   }

   public void stop() {

       System.out.println("Braking!");
   }

   public void fill() {
       System.out.println("Refueling!");
   }
}
ڇا واقعي اهڙي سادي صورتحال ۾ مسئلا پيدا ٿي سگهن ٿا؟ حقيقت ۾، اهي اڳ ۾ ئي آهن ... ڊيزائن جو نمونو: حڪمت عملي - 3
public class Stroller extends Conveyance {

   public void fill() {

       // Hmm... This is a stroller for children. It doesn't need to be refueled :/
   }
}
اسان جي پروگرام ۾ ھاڻي ھڪڙو پھچڻ وارو آھي (ھڪ ٻار گھمڻ وارو) جيڪو عام تصور ۾ چڱيءَ طرح نه ٿو ٺھي. ان ۾ پيادل هوندا يا ريڊيو تي ڪنٽرول ٿيل هوندا، پر هڪ شيءِ پڪ سان پڪ آهي - ان ۾ گئس ڀرڻ جي ڪا به جاءِ نه هوندي. اسان جي طبقاتي ورهاڱي سبب عام طريقا ورثي ۾ ورثي ۾ مليا آهن انهن طبقن کي جن جي ضرورت ناهي. هن صورتحال ۾ اسان کي ڇا ڪرڻ گهرجي؟ چ ،و ، اسان اسٽرولر ڪلاس ۾ fill() طريقي کي اوور رائيڊ ڪري سگھون ٿا ته جيئن ڪجھ به نه ٿئي جڏھن توھان گھمڻ واري کي ريفيول ڪرڻ جي ڪوشش ڪندا:
public class Stroller extends Conveyance {

   @Override
   public void fill() {
       System.out.println("A stroller cannot be refueled!");
   }
}
پر اهو مشڪل سان ڪامياب حل چئي سگهجي ٿو جيڪڏهن نقل ڪوڊ کان سواءِ ٻيو ڪو سبب ناهي. مثال طور، گھڻا طبقا والدين طبقي جو طريقو استعمال ڪندا، پر باقي ان کي ختم ڪرڻ تي مجبور ڪيو ويندو. جيڪڏهن اسان وٽ 15 طبقا آهن ۽ اسان کي انهن مان 5-6 ۾ رويي کي ختم ڪرڻ گهرجي، ڪوڊ جي نقل ڪافي وسيع ٿي ويندي. ٿي سگهي ٿو انٽرفيس اسان جي مدد ڪري سگهي ٿو؟ مثال طور، هن طرح:
public interface Fillable {

   public void fill();
}
اسان ھڪڙي ڀرڻ واري انٽرفيس ھڪڙي ڀرڻ () طريقي سان ٺاھينداسين . پوءِ، اهي رستا جن کي ريفيول ڪرڻ جي ضرورت آهي هن انٽرفيس تي عمل ڪيو ويندو، جڏهن ته ٻيا رستا (مثال طور، اسان جو ٻار گھمڻ وارو) نه ٿيندو. پر هي اختيار اسان لاء مناسب ناهي. مستقبل ۾، اسان جو طبقاتي درجو تمام وڏو ٿي سگھي ٿو (صرف تصور ڪريو ته دنيا ۾ ڪيتريون ئي مختلف قسم جا رستا آھن). اسان وراثت ۾ شامل پوئين ورزن کي ڇڏي ڏنو، ڇاڪاڻ ته اسان نه ٿا چاهيون ته ڀريو () طريقو ڪيترائي، ڪيترائي ڀيرا. هاڻي اسان کي ان کي هر طبقي ۾ لاڳو ڪرڻو پوندو! ۽ جيڪڏهن اسان وٽ 50 آهن؟ ۽ جيڪڏهن اسان جي پروگرام ۾ بار بار تبديليون ڪيون وينديون (۽ اهو تقريباً هميشه حقيقي پروگرامن لاءِ صحيح آهي!)، اسان کي سڀني 50 طبقن ۾ جلدي ڪرڻي پوندي ۽ دستي طور تي انهن مان هر هڪ جي رويي کي تبديل ڪرڻو پوندو. پوء، آخر ۾، اسان کي هن صورتحال ۾ ڇا ڪرڻ گهرجي؟ اسان جي مسئلي کي حل ڪرڻ لاء، اسان هڪ مختلف طريقو چونڊيندا سين. يعني، اسان پنهنجي طبقي جي رويي کي ڪلاس کان الڳ ڪنداسين. هن جو مطلب ڇا آهي؟ جئين توهان ڄاڻو ٿا، هر شئي رياست (ڊيٽا جو هڪ سيٽ) ۽ رويي (طريقن جو هڪ سيٽ) آهي. اسان جي پهچائڻ واري طبقي جو رويو ٽن طريقن تي مشتمل آهي: go() ، stop() ۽ fill() . پهرين ٻه طريقا ٺيڪ آهن جيئن اهي آهن. پر اسان ٽيون طريقو منتقل ڪنداسين Conveyance طبقي مان. هي رويي کي طبقي کان الڳ ڪندو (وڌيڪ صحيح طور تي، اهو صرف رويي جو حصو الڳ ڪندو، ڇو ته پهريان ٻه طريقا اتي رهندا جتي اهي آهن). پوء اسان کي اسان جي fill() طريقو ڪٿي رکڻ گهرجي ؟ ڪجھ به ذهن ۾ نه ٿو اچي:/ اهو لڳي ٿو ته اهو بلڪل آهي جتي اهو هجڻ گهرجي. اسان ان کي الڳ انٽرفيس ڏانھن منتقل ڪنداسين: FillStrategy !
public interface FillStrategy {

   public void fill();
}
ڇو اسان کي اهڙي انٽرفيس جي ضرورت آهي ڇا؟ اهو سڀ ڪجهه سڌو آهي. ھاڻي اسان ڪيترائي طبقا ٺاھي سگھون ٿا جيڪي ھن انٽرفيس کي لاڳو ڪن ٿا:
public class HybridFillStrategy implements FillStrategy {

   @Override
   public void fill() {
       System.out.println("Refuel with gas or electricity — your choice!");
   }
}

public class F1PitstopStrategy implements FillStrategy {

   @Override
   public void fill() {
       System.out.println("Refuel with gas only after all other pit stop procedures are complete!");
   }
}

public class StandardFillStrategy implements FillStrategy {
   @Override
   public void fill() {
       System.out.println("Just refuel with gas!");
   }
}
اسان ٽي رويي واريون حڪمت عمليون ٺاهيون آهن: هڪ عام ڪارن لاءِ، هڪ هائبرڊز لاءِ، ۽ هڪ فارمولا 1 ريس ڪارن لاءِ. هر حڪمت عملي هڪ مختلف ريفيولنگ ​​الگورتھم لاڳو ڪري ٿي. اسان جي حالت ۾، اسان صرف ڪنسول تي هڪ اسٽرنگ ڏيکاري ٿو، پر هر طريقو ڪجهه پيچيده منطق تي مشتمل ٿي سگهي ٿو. اسان اڳتي ڇا ڪريون؟
public class Conveyance {

   FillStrategy fillStrategy;

   public void fill() {
       fillStrategy.fill();
   }

   public void go() {
       System.out.println("Moving forward");
   }

   public void stop() {
       System.out.println("Braking!");
   }

}
اسان پنھنجي FillStrategy انٽرفيس کي Conveyance پيرن ڪلاس ۾ فيلڊ طور استعمال ڪريون ٿا . نوٽ ڪريو ته اسان ڪنهن خاص عمل جي نشاندهي نه ڪري رهيا آهيون - اسان هڪ انٽرفيس استعمال ڪري رهيا آهيون. ڪار ڪلاسن کي FillStrategy انٽرفيس جي مخصوص لاڳو ڪرڻ جي ضرورت پوندي:
public class F1Car extends Conveyance {

   public F1Car() {
       this.fillStrategy = new F1PitstopStrategy();
   }
}

public class HybridCar extends Conveyance {

   public HybridCar() {
       this.fillStrategy = new HybridFillStrategy();
   }
}

public class Sedan extends Conveyance {

   public Sedan() {
       this.fillStrategy = new StandardFillStrategy();
   }
}
اچو ته ڏسو ته اسان کي ڇا مليو!
public class Main {

   public static void main(String[] args) {

       Conveyance sedan = new Sedan();
       Conveyance hybrid = new HybridCar();
       Conveyance f1car = new F1Car();

       sedan.fill();
       hybrid.fill();
       f1car.fill();
   }
}
ڪنسول آئوٽ:

Just refuel with gas! 
Refuel with gas or electricity — your choice! 
Refuel with gas only after all other pit stop procedures are complete!
زبردست! ريفيولنگ ​​جو عمل ڪم ڪري ٿو جيئن ان کي گهرجي! رستي جي ذريعي، ڪجھ به اسان کي حڪمت عملي کي استعمال ڪرڻ کان روڪيو جيئن تعمير ڪندڙ ۾ پيٽرول! مثال طور، هن طرح:
public class Conveyance {

   private FillStrategy fillStrategy;

   public Conveyance(FillStrategy fillStrategy) {
       this.fillStrategy = fillStrategy;
   }

   public void fill() {
       this.fillStrategy.fill();
   }

   public void go() {
       System.out.println("Moving forward");
   }

   public void stop() {
       System.out.println("Braking!");
   }
}

public class Sedan extends Conveyance {

   public Sedan() {
       super(new StandardFillStrategy());
   }
}



public class HybridCar extends Conveyance {

   public HybridCar() {
       super(new HybridFillStrategy());
   }
}

public class F1Car extends Conveyance {

   public F1Car() {
       super(new F1PitstopStrategy());
   }
}
اچو ته اسان جو مکيه () طريقو (جيڪو اڻڄاتل رهي ٿو) هلون. اسان کي ساڳيو نتيجو حاصل آهي! ڪنسول آئوٽ:

Just refuel with gas! 
Refuel with gas or electricity — your choice! 
Refuel with gas only after all other pit stop procedures are complete!
حڪمت عملي جي جوڙجڪ جو نمونو الگورتھم جي ھڪڙي خاندان کي بيان ڪري ٿو، انھن مان ھر ھڪ کي گڏ ڪري ٿو، ۽ يقيني بڻائي ٿو ته اھي مٽائي سگھندا آھن. اهو توهان کي الگورتھم کي تبديل ڪرڻ جي اجازت ڏئي ٿو، قطع نظر ته اهي ڪلائنٽ طرفان ڪيئن استعمال ڪيا ويا آهن (هي تعريف، ڪتاب "هيڊ فرسٽ ڊيزائن پيٽرن" مان ورتو ويو آهي، مون لاء بهترين لڳي ٿو). ڊيزائن جو نمونو: حڪمت عملي - 4اسان اڳ ۾ ئي الگورتھم جو خاندان بيان ڪيو آھي جنھن ۾ اسان دلچسپي رکون ٿا (ڪارن کي ريفيول ڪرڻ جا طريقا) الڳ الڳ انٽرفيس ۾ مختلف عملن سان. اسان کين ڪار کان ئي الڳ ڪري ڇڏيو. هاڻي جيڪڏهن اسان کي ڪنهن خاص ريفيولنگ ​​الگورٿم ۾ ڪا به تبديلي ڪرڻ جي ضرورت آهي، ته اهو اسان جي ڪار جي طبقن کي ڪنهن به طرح متاثر نه ڪندو. ۽ مٽاسٽا حاصل ڪرڻ لاء، اسان کي صرف هڪ واحد سيٽر طريقو شامل ڪرڻ جي ضرورت آهي اسان جي Conveyance ڪلاس ۾:
public class Conveyance {

   FillStrategy fillStrategy;

   public void fill() {
       fillStrategy.fill();
   }

   public void go() {
       System.out.println("Moving forward");
   }

   public void stop() {
       System.out.println("Braking!");
   }

   public void setFillStrategy(FillStrategy fillStrategy) {
       this.fillStrategy = fillStrategy;
   }
}
هاڻي اسان اڏامي تي حڪمت عمليون تبديل ڪري سگهون ٿا:
public class Main {

   public static void main(String[] args) {

       Stroller stroller= new Stroller();
       stroller.setFillStrategy(new StandardFillStrategy());

       stroller.fill();
   }
}
جيڪڏهن ٻار گھمڻ وارا اوچتو گيسولين تي هلڻ شروع ڪن ٿا، اسان جو پروگرام هن منظر کي سنڀالڻ لاء تيار ٿي ويندو :) ۽ اهو ان بابت آهي! توهان هڪ وڌيڪ ڊزائن جو نمونو سکيو آهي جيڪو بلاشبہ ضروري ۽ مددگار ثابت ٿيندو جڏهن حقيقي منصوبن تي ڪم ڪندي :) ايندڙ وقت تائين!
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION