JavaRush /جاوا بلاگ /Random-UR /آئیے بوٹ کے ساتھ کام کرنے کے لیے کمانڈ پیٹرن کو نافذ کریں...

آئیے بوٹ کے ساتھ کام کرنے کے لیے کمانڈ پیٹرن کو نافذ کریں۔ (حصہ 1) - "A سے Z تک جاوا پروجیکٹ"

گروپ میں شائع ہوا۔
تمام دوستوں کو سلام۔ آج ہم اپنی ضروریات کے لیے کمانڈ ڈیزائن کا ایک ٹیمپلیٹ (ٹیمپلیٹ ایک پیٹرن ہے، ہمارے تناظر میں وہی چیز ہے) نافذ کریں گے۔ اس ٹیمپلیٹ کا استعمال کرتے ہوئے، ہم اپنے بوٹ کے حکموں کی پروسیسنگ کے ساتھ آسانی سے اور صحیح طریقے سے کام کریں گے۔ "A سے Z تک جاوا پروجیکٹ": بوٹ کے ساتھ کام کرنے کے لیے کمانڈ پیٹرن کو نافذ کرنا۔  حصہ 1 - 1
دوستو، کیا آپ کو Javarush Telegram Bot پروجیکٹ پسند ہے ؟ سست مت بنو: اسے ایک ستارہ دیں ۔ اس طرح یہ واضح ہو جائے گا کہ وہ دلچسپ ہے، اور اسے تیار کرنا زیادہ خوشگوار ہو گا!
شروع کرنے کے لئے، اس کے بارے میں بات کرنا اچھا ہوگا کہ یہ کس قسم کا پیٹرن ہے - کمانڈ۔ لیکن اگر میں ایسا کروں تو مضمون بہت بڑا اور بوجھل ہو جائے گا۔ لہذا، میں نے خود مطالعہ کے لیے مواد کا انتخاب کیا:
  1. یہ میرا 4 سال پہلے کا مضمون ہے۔ میں نے اسے اس وقت لکھا تھا جب میں ایک جونیئر تھا، لہذا اس پر زیادہ سختی سے فیصلہ نہ کریں۔
  2. یوٹیوب پر ایک بہت ہی جذباتی اور انٹرایکٹو سویڈن کی ویڈیو۔ میں اس کی بہت سفارش کرتا ہوں۔ وہ خوبصورت بولتا ہے، اس کی انگریزی صاف اور سمجھ میں آتی ہے۔ اور عام طور پر، اس کے پاس دوسرے ڈیزائن کے نمونوں کے بارے میں ایک ویڈیو ہے۔
  3. میرے مضمون کے تبصروں میں، کسی Nullptr35 نے اس ویڈیو کی سفارش کی ۔
یہ اپنے آپ کو موضوع میں غرق کرنے اور میرے جیسا صفحہ پر ہونے کے لیے کافی ہونا چاہیے۔ ٹھیک ہے، جو لوگ اس ڈیزائن پیٹرن سے واقف ہیں وہ محفوظ طریقے سے چھوڑ سکتے ہیں اور آگے بڑھ سکتے ہیں۔

ہم JRTB-3 لکھتے ہیں۔

سب کچھ پہلے جیسا ہے:
  1. ہم مرکزی شاخ کو اپ ڈیٹ کرتے ہیں۔
  2. اپ ڈیٹ شدہ مین برانچ کی بنیاد پر، ہم ایک نیا JRTB-3 بناتے ہیں ۔
  3. آئیے پیٹرن کو نافذ کریں۔
  4. ہم کئے گئے کام کو بیان کرتے ہوئے ایک نیا عہد بناتے ہیں۔
  5. ہم پل کی درخواست بناتے ہیں، اسے چیک کرتے ہیں، اور اگر سب کچھ ٹھیک ہے، تو ہم اپنے کام کو ملا دیتے ہیں۔
میں پوائنٹس 1-2 نہیں دکھاؤں گا: میں نے انہیں پچھلے مضامین میں بہت احتیاط سے بیان کیا تھا، لہذا آئیے براہ راست ٹیمپلیٹ کو لاگو کرنے کے لیے آگے بڑھیں۔ یہ سانچہ ہمارے لیے موزوں کیوں ہے؟ ہاں، کیونکہ جب بھی ہم کسی کمانڈ پر عمل کرتے ہیں، ہم onUpdateReceived(Update update) طریقہ پر جائیں گے ، اور کمانڈ پر منحصر ہے کہ ہم مختلف منطق پر عمل کریں گے۔ اس پیٹرن کے بغیر، ہمارے پاس if-else if بیانات کی ایک پوری میزبانی ہوگی۔ کچھ اس طرح:
if (message.startsWith("/start")) {
   doStartCommand();
} else if(message.startsWith("/stop")) {
   doStopCommand();
} else if(message.startsWith("/addUser")) {
   doAddUserCommand();
}
...
else if(message.startsWith("/makeMeHappy")) {
   doMakeMeHappyCommand();
}
مزید یہ کہ جہاں بیضوی ہے وہاں کئی درجن مزید ٹیمیں ہو سکتی ہیں۔ اور اسے عام طور پر کیسے ہینڈل کیا جائے؟ سپورٹ کیسے کریں؟ مشکل اور مشکل۔ اس کا مطلب ہے کہ یہ آپشن ہمارے لیے موزوں نہیں ہے۔ اسے کچھ اس طرح نظر آنا چاہئے:
if (message.startsWith(COMMAND_PREFIX)) {
   String commandIdentifier = message.split(" ")[0].toLowerCase();
   commandContainer.getCommand(commandIdentifier, userName).execute(update);
} else {
   commandContainer.getCommand(NO.getCommand(), userName).execute(update);
}
بس! اور اس سے کوئی فرق نہیں پڑتا ہے کہ ہم کتنی ہی کمانڈز شامل کریں، کوڈ کا یہ سیکشن غیر تبدیل شدہ رہے گا۔ وہ کیا کر رہا ہے؟ پہلا اگر یہ یقینی بناتا ہے کہ پیغام کا آغاز کمانڈ کے سابقہ ​​"/" سے ہوتا ہے۔ اگر ایسا ہے، تو ہم پہلی جگہ تک لائن کو منتخب کرتے ہیں اور CommandContainer میں متعلقہ کمانڈ تلاش کرتے ہیں؛ جیسے ہی ہمیں یہ مل جاتا ہے، ہم کمانڈ چلاتے ہیں۔ اور بس...) اگر آپ کی خواہش اور وقت ہے، تو آپ ٹیموں کے ساتھ کام کرنے کو نافذ کر سکتے ہیں، پہلے ایک ہی کلاس میں، حالات کے ایک گروپ کے ساتھ، اور پھر ایک ٹیمپلیٹ کا استعمال کر کے۔ آپ کو فرق نظر آئے گا۔ کیا خوبصورتی ہوگی! سب سے پہلے، آئیے بوٹ پیکج کے آگے ایک پیکج بناتے ہیں، جسے کمانڈ کہا جائے گا ۔ "A سے Z تک جاوا پروجیکٹ": بوٹ کے ساتھ کام کرنے کے لیے کمانڈ پیٹرن کو نافذ کرنا۔  حصہ 1 - 2اور پہلے سے ہی اس پیکیج میں وہ تمام کلاسز ہوں گی جن کا تعلق کمانڈ کے نفاذ سے ہے۔ ہمیں کمانڈز کے ساتھ کام کرنے کے لیے ایک انٹرفیس کی ضرورت ہے۔ اس معاملے کے لیے، آئیے اسے بنائیں:
package com.github.javarushcommunity.jrtb.command;

import org.telegram.telegrambots.meta.api.objects.Update;

/**
* Command interface for handling telegram-bot commands.
*/
public interface Command {

   /**
    * Main method, which is executing command logic.
    *
    * @param update provided {@link Update} object with all the needed data for command.
    */
   void execute(Update update);
}
اس وقت، ہمیں کمانڈ کے ریورس آپریشن کو نافذ کرنے کی ضرورت نہیں ہے، لہذا ہم اس طریقہ کو چھوڑ دیں گے (غیر عمل درآمد)۔ عمل کے طریقہ کار میں، اپ ڈیٹ آبجیکٹ ایک دلیل کے طور پر آتا ہے - بالکل وہی جو بوٹ میں ہمارے مرکزی طریقہ پر آتا ہے۔ اس آبجیکٹ میں کمانڈ پر کارروائی کرنے کے لیے درکار ہر چیز شامل ہوگی۔ اگلا، ہم ایک اینوم شامل کریں گے جو کمانڈ ویلیوز (شروع، روک، اور اسی طرح) کو محفوظ کرے گا۔ ہمیں اس کی ضرورت کیوں ہے؟ تاکہ ٹیم کے ناموں کے لیے ہمارے پاس سچائی کا ایک ہی ذریعہ ہو۔ ہم اسے اپنے کمانڈ پیکج میں بھی بناتے ہیں ۔ آئیے اسے CommandName کہتے ہیں :
package com.github.javarushcommunity.jrtb.command;

/**
* Enumeration for {@link Command}'s.
*/
public enum CommandName {

   START("/start"),
   STOP("/stop");

   private final String commandName;

   CommandName(String commandName) {
       this.commandName = commandName;
   }

   public String getCommandName() {
       return commandName;
   }

}
ہمیں ایک ایسی خدمت کی بھی ضرورت ہے جو بوٹ کے ذریعے پیغامات بھیجے۔ ایسا کرنے کے لیے، ہم کمانڈ پیکیج کے آگے ایک سروس پیکج بنائیں گے ، جس میں ہم تمام ضروری خدمات شامل کریں گے۔ یہاں اس بات پر توجہ مرکوز کرنے کے قابل ہے کہ اس معاملے میں خدمت کے لفظ سے میرا کیا مطلب ہے۔ اگر ہم کسی ایپلیکیشن پر غور کریں تو اسے اکثر کئی پرتوں میں تقسیم کیا جاتا ہے: اینڈ پوائنٹس کے ساتھ کام کرنے کے لیے ایک پرت - کنٹرولرز، کاروباری منطق کی ایک پرت - خدمات، اور ڈیٹا بیس کے ساتھ کام کرنے کے لیے ایک پرت - ایک ذخیرہ۔ لہذا، ہمارے معاملے میں، سروس ایک ایسی کلاس ہے جو کسی قسم کی کاروباری منطق کو نافذ کرتی ہے۔ سروس کو صحیح طریقے سے کیسے بنایا جائے؟ سب سے پہلے، اس کے لیے ایک انٹرفیس اور عمل درآمد بنائیں۔ ہماری SpringBoot ایپلیکیشن کے ایپلیکیشن سیاق و سباق میں `@Service` تشریح کا استعمال کرتے ہوئے نفاذ کو شامل کریں، اور اگر ضروری ہو تو، `@Autowired` تشریح کا استعمال کرتے ہوئے اسے سخت کریں۔ لہذا، ہم SendBotMessageService انٹرفیس بناتے ہیں (نام دینے کی خدمات میں وہ عام طور پر نام کے آخر میں سروس شامل کرتے ہیں):
package com.github.javarushcommunity.jrtb.service;

/**
* Service for sending messages via telegram-bot.
*/
public interface SendBotMessageService {

   /**
    * Send message via telegram bot.
    *
    * @param chatId provided chatId in which messages would be sent.
    * @param message provided message to be sent.
    */
   void sendMessage(String chatId, String message);
}
اگلا، ہم اس کا نفاذ بناتے ہیں:
package com.github.javarushcommunity.jrtb.service;

import com.github.javarushcommunity.jrtb.bot.JavarushTelegramBot;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;

/**
* Implementation of {@link SendBotMessageService} interface.
*/
@Service
public class SendBotMessageServiceImpl implements SendBotMessageService {

   private final JavarushTelegramBot javarushBot;

   @Autowired
   public SendBotMessageServiceImpl(JavarushTelegramBot javarushBot) {
       this.javarushBot = javarushBot;
   }

   @Override
   public void sendMessage(String chatId, String message) {
       SendMessage sendMessage = new SendMessage();
       sendMessage.setChatId(chatId);
       sendMessage.enableHtml(true);
       sendMessage.setText(message);

       try {
           javarushBot.execute(sendMessage);
       } catch (TelegramApiException e) {
           //todo add logging to the project.
           e.printStackTrace();
       }
   }
}
عمل درآمد ایسا ہی نظر آتا ہے۔ سب سے اہم جادو وہ ہے جہاں ڈیزائنر بنایا جاتا ہے۔ کنسٹرکٹر پر @Autowired تشریح کا استعمال کرتے ہوئے، SpringBoot اپنے ایپلیکیشن سیاق و سباق میں اس کلاس کی کسی چیز کو تلاش کرے گا۔ اور وہ پہلے ہی موجود ہے۔ یہ اس طرح کام کرتا ہے: ہماری درخواست میں، کہیں بھی ہم بوٹ تک رسائی حاصل کر سکتے ہیں اور کچھ کر سکتے ہیں۔ اور یہ سروس پیغامات بھیجنے کی ذمہ دار ہے۔ تاکہ ہم ہر بار ہر جگہ ایسا کچھ نہ لکھیں:
SendMessage sendMessage = new SendMessage();
sendMessage.setChatId(chatId);
sendMessage.setText(message);

try {
   javarushBot.execute(sendMessage);
} catch (TelegramApiException e) {
   //todo add logging to the project.
   e.printStackTrace();
}
ہم نے اس منطق کو ایک الگ کلاس میں منتقل کر دیا ہے اور اگر ضروری ہوا تو اسے استعمال کریں گے۔ اب ہمیں تین کمانڈز کو لاگو کرنے کی ضرورت ہے: StartCommand، StopCommand اور UnknownCommand۔ ہمیں ان کی ضرورت ہے تاکہ ہمارے پاس کمانڈز کے لیے اپنے کنٹینر کو بھرنے کے لیے کچھ ہو۔ فی الحال، نصوص خشک اور غیر معلوماتی ہوں گے؛ اس کام کے مقاصد کے لیے، یہ بہت اہم نہیں ہے۔ تو، StartCommand:
package com.github.javarushcommunity.jrtb.command;

import com.github.javarushcommunity.jrtb.service.SendBotMessageService;
import org.telegram.telegrambots.meta.api.objects.Update;

/**
* Start {@link Command}.
*/
public class StartCommand implements Command {

   private final SendBotMessageService sendBotMessageService;

   public final static String START_MESSAGE = "Привет. Я Javarush Telegram Bot. Я помогу тебе быть в курсе последних " +
           "статей тех авторов, котрые тебе интересны. Я еще маленький и только учусь.";

   // Здесь не добавляем сервис через получение из Application Context.
   // Потому что если это сделать так, то будет циклическая зависимость, которая
   // ломает работу applications.
   public StartCommand(SendBotMessageService sendBotMessageService) {
       this.sendBotMessageService = sendBotMessageService;
   }

   @Override
   public void execute(Update update) {
       sendBotMessageService.sendMessage(update.getMessage().getChatId().toString(), START_MESSAGE);
   }
}
براہ کرم ڈیزائنر سے پہلے تبصرے کو غور سے پڑھیں۔ سرکلر انحصار ( سرکلر انحصار ) کسی ایسے فن تعمیر کی وجہ سے ہوسکتا ہے جو بالکل درست نہیں ہے۔ ہمارے معاملے میں، ہم اس بات کو یقینی بنائیں گے کہ سب کچھ کام کرتا ہے اور درست ہے۔ CommandContainer میں پہلے سے ہی کمانڈ بناتے وقت ایپلیکیشن سیاق و سباق سے اصل چیز شامل کی جائے گی۔ سٹاپ کمانڈ:
package com.github.javarushcommunity.jrtb.command;

import com.github.javarushcommunity.jrtb.service.SendBotMessageService;
import org.telegram.telegrambots.meta.api.objects.Update;

/**
* Stop {@link Command}.
*/
public class StopCommand implements Command {

   private final SendBotMessageService sendBotMessageService;

   public static final String STOP_MESSAGE = "Деактивировал все ваши подписки \uD83D\uDE1F.";

   public StopCommand(SendBotMessageService sendBotMessageService) {
       this.sendBotMessageService = sendBotMessageService;
   }

   @Override
   public void execute(Update update) {
       sendBotMessageService.sendMessage(update.getMessage().getChatId().toString(), STOP_MESSAGE);
   }
}
اور نامعلوم کمانڈ۔ ہمیں اس کی ضرورت کیوں ہے؟ ہمارے لیے یہ ایک اہم حکم ہے جو جواب دے گا اگر ہمیں وہ حکم نہیں مل سکا جو ہمیں دیا گیا تھا۔ ہمیں NoCommand اور HelpCommand کی بھی ضرورت ہوگی۔
  • NoCommand - اس صورت حال کے لیے ذمہ دار ہو گا جب پیغام بالکل بھی کمانڈ سے شروع نہیں ہوتا ہے۔
  • HelpCommand صارف کے لیے ایک رہنما، ایک قسم کی دستاویزات ہوگی۔
آئیے HelpCommand شامل کریں:
package com.github.javarushcommunity.jrtb.command;

import com.github.javarushcommunity.jrtb.service.SendBotMessageService;
import org.telegram.telegrambots.meta.api.objects.Update;

import static com.github.javarushcommunity.jrtb.command.CommandName.*;

/**
* Help {@link Command}.
*/
public class HelpCommand implements Command {

   private final SendBotMessageService sendBotMessageService;

   public static final String HELP_MESSAGE = String.format("✨<b>Дотупные команды</b>✨\n\n"

                   + "<b>Начать\\закончить работу с ботом</b>\n"
                   + "%s - начать работу со мной\n"
                   + "%s - приостановить работу со мной\n\n"
                   + "%s - получить помощь в работе со мной\n",
           START.getCommandName(), STOP.getCommandName(), HELP.getCommandName());

   public HelpCommand(SendBotMessageService sendBotMessageService) {
       this.sendBotMessageService = sendBotMessageService;
   }

   @Override
   public void execute(Update update) {
       sendBotMessageService.sendMessage(update.getMessage().getChatId().toString(), HELP_MESSAGE);
   }
}
NoCommand:
package com.github.javarushcommunity.jrtb.command;

import com.github.javarushcommunity.jrtb.service.SendBotMessageService;
import org.telegram.telegrambots.meta.api.objects.Update;

/**
* No {@link Command}.
*/
public class NoCommand implements Command {

   private final SendBotMessageService sendBotMessageService;

   public static final String NO_MESSAGE = "Я поддерживаю команды, начинающиеся со слеша(/).\n"
           + "Whatбы посмотреть список команд введите /help";

   public NoCommand(SendBotMessageService sendBotMessageService) {
       this.sendBotMessageService = sendBotMessageService;
   }

   @Override
   public void execute(Update update) {
       sendBotMessageService.sendMessage(update.getMessage().getChatId().toString(), NO_MESSAGE);
   }
}
اور اس کام کے لیے ابھی بھی UnknownCommand موجود ہے:
package com.github.javarushcommunity.jrtb.command;

import com.github.javarushcommunity.jrtb.service.SendBotMessageService;
import org.telegram.telegrambots.meta.api.objects.Update;

/**
* Unknown {@link Command}.
*/
public class UnknownCommand implements Command {

   public static final String UNKNOWN_MESSAGE = "Не понимаю вас \uD83D\uDE1F, напишите /help чтобы узнать что я понимаю.";

   private final SendBotMessageService sendBotMessageService;

   public UnknownCommand(SendBotMessageService sendBotMessageService) {
       this.sendBotMessageService = sendBotMessageService;
   }

   @Override
   public void execute(Update update) {
       sendBotMessageService.sendMessage(update.getMessage().getChatId().toString(), UNKNOWN_MESSAGE);
   }
}
اگلا، آئیے اپنے کمانڈز کے لیے ایک کنٹینر شامل کریں۔ یہ ہماری کمانڈ آبجیکٹ کو محفوظ کرے گا اور درخواست پر ہم مطلوبہ کمانڈ حاصل کرنے کی توقع رکھتے ہیں۔ آئیے اسے CommandContainer کہتے ہیں :
package com.github.javarushcommunity.jrtb.command;

import com.github.javarushcommunity.jrtb.service.SendBotMessageService;
import com.google.common.collect.ImmutableMap;

import static com.github.javarushcommunity.jrtb.command.CommandName.*;

/**
* Container of the {@link Command}s, which are using for handling telegram commands.
*/
public class CommandContainer {

   private final ImmutableMap<String, Command> commandMap;
   private final Command unknownCommand;

   public CommandContainer(SendBotMessageService sendBotMessageService) {

       commandMap = ImmutableMap.<string, command="">builder()
               .put(START.getCommandName(), new StartCommand(sendBotMessageService))
               .put(STOP.getCommandName(), new StopCommand(sendBotMessageService))
               .put(HELP.getCommandName(), new HelpCommand(sendBotMessageService))
               .put(NO.getCommandName(), new NoCommand(sendBotMessageService))
               .build();

       unknownCommand = new UnknownCommand(sendBotMessageService);
   }

   public Command retrieveCommand(String commandIdentifier) {
       return commandMap.getOrDefault(commandIdentifier, unknownCommand);
   }

}
جیسا کہ آپ دیکھ سکتے ہیں، سب کچھ آسانی سے کیا گیا تھا. ہمارے پاس ایک غیر تبدیل شدہ نقشہ ہے جس میں کمانڈ ویلیو کی شکل میں ایک کلید ہے اور کمانڈ قسم کی کمانڈ آبجیکٹ کی شکل میں ایک قدر ہے۔ کنسٹرکٹر میں، ہم ایک بار ناقابل تغیر نقشہ پُر کرتے ہیں اور ایپلیکیشن کے پورے آپریشن کے دوران اس تک رسائی حاصل کرتے ہیں۔ کنٹینر کے ساتھ کام کرنے کا بنیادی اور واحد طریقہ retrieveCommand(String commandIdentifier) ​​ہے ۔ UnknownCommand نامی ایک کمانڈ ہے، جو ان صورتوں کے لیے ذمہ دار ہے جب ہم متعلقہ کمانڈ کو تلاش نہیں کر سکتے۔ اب ہم کنٹینر کو اپنی بوٹ کلاس میں لاگو کرنے کے لیے تیار ہیں - JavaRushTelegramBot میں: ہماری بوٹ کلاس اب اس طرح نظر آتی ہے:
package com.github.javarushcommunity.jrtb.bot;

import com.github.javarushcommunity.jrtb.command.CommandContainer;
import com.github.javarushcommunity.jrtb.service.SendBotMessageServiceImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;

import static com.github.javarushcommunity.jrtb.command.CommandName.NO;

/**
* Telegram bot for Javarush Community from Javarush community.
*/
@Component
public class JavarushTelegramBot extends TelegramLongPollingBot {

   public static String COMMAND_PREFIX = "/";

   @Value("${bot.username}")
   private String username;

   @Value("${bot.token}")
   private String token;

   private final CommandContainer commandContainer;

   public JavarushTelegramBot() {
       this.commandContainer = new CommandContainer(new SendBotMessageServiceImpl(this));
   }

   @Override
   public void onUpdateReceived(Update update) {
       if (update.hasMessage() && update.getMessage().hasText()) {
           String message = update.getMessage().getText().trim();
           if (message.startsWith(COMMAND_PREFIX)) {
               String commandIdentifier = message.split(" ")[0].toLowerCase();

               commandContainer.retrieveCommand(commandIdentifier).execute(update);
           } else {
               commandContainer.retrieveCommand(NO.getCommandName()).execute(update);
           }
       }
   }

   @Override
   public String getBotUsername() {
       return username;
   }

   @Override
   public String getBotToken() {
       return token;
   }
}
اور بس، کوڈ میں تبدیلیاں مکمل ہو گئیں۔ میں اسے کیسے چیک کر سکتا ہوں؟ آپ کو بوٹ لانچ کرنے اور چیک کرنے کی ضرورت ہے کہ سب کچھ کام کرتا ہے۔ ایسا کرنے کے لیے، میں application.properties میں ٹوکن اپ ڈیٹ کرتا ہوں، صحیح سیٹ کرتا ہوں، اور JavarushTelegramBotApplication کلاس میں ایپلیکیشن لانچ کرتا ہوں: "A سے Z تک جاوا پروجیکٹ": بوٹ کے ساتھ کام کرنے کے لیے کمانڈ پیٹرن کو نافذ کرنا۔  حصہ 1 - 3اب ہمیں یہ چیک کرنے کی ضرورت ہے کہ کمانڈز توقع کے مطابق کام کرتی ہیں۔ میں اسے مرحلہ وار چیک کرتا ہوں:
  • سٹاپ کمانڈ؛
  • اسٹارٹ کمانڈ؛
  • ہیلپ کمانڈ؛
  • NoCommand؛
  • انجانا حکم.
یہاں کیا ہوا: "A سے Z تک جاوا پروجیکٹ": بوٹ کے ساتھ کام کرنے کے لیے کمانڈ پیٹرن کو نافذ کرنا۔  حصہ 1 - 4بوٹ نے بالکل ٹھیک کام کیا جیسا کہ ہم نے توقع کی تھی۔ لنک کے ذریعے جاری ہے ۔

سیریز کے تمام مواد کی فہرست اس مضمون کے شروع میں ہے۔

تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION