Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Код на Java

Метки:
Теги Теги
codereview

Ваша оценка

  • Будет медленно работать

  • Сложно поддерживать

  • Слишком замудрённо

  • Слишком много кода будет

  • Я ничего не смыслю в Java

  • Что-то другое


Результаты видны после голосования.

NotCopter

Участник
Пользователь
Баллы
31
Дорогие форумчане, пожалуйста оцените мой уровень говнокода по шкале от 1 до 5, и если можно, предложите шаги для развития. Вот сама задача:

У меня в мини-игре есть некоторый набор уникальных предметов (их кол-во не будет менятся), сами по себе они представляют обычные предметы, с какими-то фишкам, которые им даёт плагин. Грубо говоря, для каждого предмета есть разное кол-во событий, и для этих событий разные варианты действий.
Например: Золотой сет, на ПКМ с предметом в руке одевается, и меняет штаны и нагрудник на золотые, при получении урона отбрасывает по направлению удара с силой в 20% от начальной. Я решил то, что для каждого предмета будет отдельный класс, который наследуется от некоторого абстрактного класса в котором определены методы по типу onRMB, onLMB и т.д. Все классы уник. предм. хранятся в отделном Enum, который уже перехватывает события и выполняет нужные действия в зависимости от предмета.

Вот код:
PHP:
public enum CustomItem implements Listener {
    GOLDEN_KIT(new GoldenKit()); // Далее будут прочие предметы

    private final AbstractItem obj;

    CustomItem(AbstractItem obj) {
        this.obj = obj;
        getServer().getPluginManager().registerEvents(this, NotBedwars.getInstance());
    }

    @EventHandler private void onInteract(PlayerInteractEvent ev) {
        if (!obj.isHoldingItem(ev.getPlayer())) return;
        switch (ev.getAction()) {
            case LEFT_CLICK_BLOCK:
            case LEFT_CLICK_AIR:
                obj.onLMB(ev.getPlayer());
                break;

            case RIGHT_CLICK_BLOCK:
            case RIGHT_CLICK_AIR:
                obj.onRMB(ev.getPlayer());
                break;
        }
    }
}
PHP:
abstract class AbstractItem {
    static final Plugin plugin = NotBedwars.getInstance();
    public final String tag;

    AbstractItem(String tag) {
        this.tag = tag;
    }
    static private void notImplemented(Player player) {
        player.sendActionBar(Component.text("Не реализованно!", TextColor.color(0xFF2C36), TextDecoration.BOLD));
    }
    public boolean isNotHoldingItem(Player player) {
        return getItemHand(player) == null;
    }
    public @Nullable MainHand getItemHand(Player player) {
        PlayerInventory inv = player.getInventory();

        if (isValidItem(inv.getItemInMainHand()))
            return player.getMainHand();

        if (isValidItem(inv.getItemInOffHand()))
            return player.getMainHand() == MainHand.RIGHT ? MainHand.LEFT : MainHand.RIGHT;

        return null;
    }
    public boolean isValidItem(ItemStack item) {
        // Проверка
    }

    public void onRMB(Player player) {}
    public void onLMB(Player player) {}
}
PHP:
public class GoldenKit extends AbstractItem {
    public GoldenKit() { super("golden_kit"); }

    @Override
    public void onRMB(Player player) {
        player.sendActionBar("Вы кликнули пкм");
    }
}
 
Последнее редактирование:
GOLDEN_KIT(new GoldenKit()); // Далее будут прочие предметы
2 слушателя на каждый тип енума. Лучше перенести все слушатели в один и в нем вычислять тип енума по держащему в руке предмету при событии.
Например в абстракции создать абстрактные методы onLeftClick, onRightClick, onJump, и вызывать их при событиях, а уже в реализациях определять для них поведение если нужно.


public class GoldenKit extends AbstractItem implements Listener {
Не зачем еще раз реализовывать Listener, когда он уже был реализован в абстракции AbstractItem
 
2 слушателя на каждый тип енума. Лучше перенести все слушатели в один и в нем вычислять тип енума по держащему в руке предмету при событии.
Например в абстракции создать абстрактные методы onLeftClick, onRightClick, onJump, и вызывать их при событиях, а уже в реализациях определять для них поведение если нужно.



Не зачем еще раз реализовывать Listener, когда он уже был реализован в абстракции AbstractItem
Спасибо за ответ, я обновил код
 

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

Назад
Верх