Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Command Handler

Тема в разделе "Разработка плагинов для новичков", создана пользователем Smaylik03, 26 фев 2015.

?

Быдло код?

  1. 100%

  2. 80%

  3. 60%

  4. 40%

  5. 20%

  6. Идеал = 0%

Результаты будут видны только после голосования.
  1. Автор темы
    Smaylik03

    Smaylik03 Активный участник Пользователь

    Баллы:
    88
    Skype:
    Bruse_Williams
    Имя в Minecraft:
    Alex_Wells
    Здравствуйте. Пишу басис под плагины, написал вот хандлер комманд.. быдлокодерский, знаю, по этому и пишу, может кто-то сможет это понять и указать ошибки.. вот проект:
    https://github.com/autaut03/BasePlugin
    Путь: net.alexwells.baseplugin.handlers.commmand

    Больше кроме как на хандлер не смотрите, ибо там полный пипец.
     
  2. Хостинг MineCraft
    <
  3. Plasticable

    Plasticable Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    plasticable
    Имя в Minecraft:
    Plasticable
    И зачем оно надо?
     
  4. Автор темы
    Smaylik03

    Smaylik03 Активный участник Пользователь

    Баллы:
    88
    Skype:
    Bruse_Williams
    Имя в Minecraft:
    Alex_Wells
    Задолбал быдло код типа if(args[0].equalsIgnoreCase"") { if(Bukkit.isPlayerOnline)) } blablabla
     
  5. kirill2011s

    kirill2011s Старожил Пользователь

    Баллы:
    103
    http://www.jdevel.ru/2009/11/jdk-7.html
    Использование строк в операторе switch
     
  6. Автор темы
    Smaylik03

    Smaylik03 Активный участник Пользователь

    Баллы:
    88
    Skype:
    Bruse_Williams
    Имя в Minecraft:
    Alex_Wells
    И? Вы думаете, что я про switch не знал? Смысла мне от него, если все равно получится не красивый, не читабельный код?
     
  7. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Сам недавно написал такого рода абстракцию...
    А потом выкинул ее.
     
  8. kirill2011s

    kirill2011s Старожил Пользователь

    Баллы:
    103
    Вот такое, тоже не очень выглядит:
    Код:
    @CommandHandler(
    cmd="test",
    args="arg1 [onplayer:Player] arg2 [string:Lol] [string:Lol2]",
    desc="Test command 1",
    perm="baseplugin.commands.test")
    public void func1(CommandSender sender, Command cmd, String label, String[] args) {
    sender.sendMessage("Hi 1: " + args[1] + " | " + args[3] + " | " + args[4]);
    }
    
    Обычно такие вещи невозможно улучшить, это надо принять "как есть".
     
  9. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Улучшить можно все. Не все стоит улучшать.
     
  10. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    В обозримое нынешнее время тоже интересуюсь более красивой обработкой команд.
    Пока костыли получаются наижесточайшие. Самый страшный код в плагине, остальное уже по-божески получилось.

    Может кто подскажет Good Practice?
     
  11. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Мое мнение - надо избавится от идиотской проверки через length, а там видно будет[DOUBLEPOST=1424960258,1424959931][/DOUBLEPOST]
    Вот хорошая мысль:
    Можно реализовать методы аля
    getPlayer(sender, args, index)
    {
    Проверка на размер и существование / онлайность игрока, и в случае не того размера / отсутствия игрока - вывод месседжа сендеру и прекращение выполнения через throw / return null
    }
     
  12. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Пойду попизжу идеи для этого в гитхабах @fromgate, @ptnk, @Shevchik.
    Наверняка не я один задавался этим вопросом.
     
  13. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Я бегло пробежался по твоим и уже понял, что мне они тоже не нравятся =)
    Аннотации тоже как-то муторно; хз. Надо сесть и подумать, что же тут можно придумать удобного.
     
  14. Автор темы
    Smaylik03

    Smaylik03 Активный участник Пользователь

    Баллы:
    88
    Skype:
    Bruse_Williams
    Имя в Minecraft:
    Alex_Wells
    Ага, а у меня это происходит автоматом.[DOUBLEPOST=1424972620][/DOUBLEPOST]
    Ввел анотацию - все, и пермиссия чекается, и аргументы хандлятся, проверяются, и ошибки подсказывает! Идеальная система =)
     
  15. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
     
  16. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Хендлинг комманд как и конфиги это вообще больная тема, как ни делаешь всё равно гавно одно выходит. В итоге в конце забиваеш и просто уже ебашиш как быстрее.
     
  17. Автор темы
    Smaylik03

    Smaylik03 Активный участник Пользователь

    Баллы:
    88
    Skype:
    Bruse_Williams
    Имя в Minecraft:
    Alex_Wells
    Не, я хочу все по феншую =)[DOUBLEPOST=1424973196,1424972940][/DOUBLEPOST]
    Ну вот, у тебя костыль статический - под каждую команду свой код. А у меня все автоматически, и никакого args.lenght == 4
     
  18. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Понятно, ситуация похоже у всех
    , у меня с утра появилось некоторое соображение, что можно сделать, я попробую реализовать идею и покажу вам. Без аннотаций, другой вариант немного, более табличный :)

    Пока я пишу код, частично опишу задумку для обсуждения:
    • Предлагается интерфейс с методом, реализация тела которого будет выполнять код нужной команды:
      Код:
      public abstract interface FairyCommand
      {
          public abstract void execute(CommandSender sender, FairyArgument[] args) throws CommandAnswerException;
      }
      . Почему так?: 1. Тип результата void — большая краткость кода. Возвращаемые текстовые строки должны быть выкинуты через исключение, а оно уже имеет несколько конструкторов для удобства. 2. Количество аргументов в массиве args всегда будет равно числу заявленных при регистрации аргументов — уходят проверки на null и .length.
    • Класс аргумента FairyArgument имеет методы isPresent (проверка на наличие, если он не обязательный), getType (вернёт один из типов аргумента, которые перечислены в отдельном enum), и методы get### для опередлённых типов, которые заранее распарсены. Например, для аргумента типа FairyArgumentType.PLAYER нужен вызов Player getPlayer(). Список аргументов передаётся при регистрации команды с помощью отдельного описания FairyArgumentDesc, в котором можно указать его название, необходимость (если необходимый аргумент не был введён, команда не будет выполнена, а sender получит корректное описание синтаксиса команды), и т.п.
     
    Последнее редактирование: 27 фев 2015
  19. aceJKE

    aceJKE Старожил Пользователь

    Баллы:
    123
    Проверяю вот так, а логика в другом классе
    Код:
            if (args.length == 1) {
                if (args[0].equals("cmdone")) {
                    return new OnCmdOne().onCommand(cd, args);
                } else if (args[0].equals("cmdtwo")) {
                    return new OnCmdTwo().onCommand(cd, args);
                } else {
                    data.sendMessage("bla bla bla");
                    return true;
                }
            }
    
    public abstract boolean onCommand(ConfigData cd, String[] args)
    
     
  20. CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    И при каждой команде создавать экземпляр класса команды?
     
  21. Автор темы
    Smaylik03

    Smaylik03 Активный участник Пользователь

    Баллы:
    88
    Skype:
    Bruse_Williams
    Имя в Minecraft:
    Alex_Wells
    ОЗУ не жалеешь.[DOUBLEPOST=1425033554,1425033038][/DOUBLEPOST]
    Второй пункт порадовал, а вот первая фигня не удобная. ИМХО.
     

Поделиться этой страницей