@etozhesano

Как сделать правильно ООП в телеграм боте?

Добрый день всем. Сейчас ковыряю телеграм бот на Java. В начале для того чтобы это всё запустилось делал лапшу из if-else в одном классе. Потом потихоньку начал рефакторить свой код и дошёл до той точки что не знаю уже что и делать.

Проблема в том, что у меня не получается оперировать объектами, ну т.е. не хватает умений. Покажу код и объясню попутно как я пришёл к такой жизни.

Bot.java
public class Bot extends TelegramLongPollingBot {

    protected long chat_id;
    protected static String lastMessage;
    protected static ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();

    @Override
    public void onUpdateReceived(Update update) {
    chat_id = update.getMessage().getChatId();
    SendMessage sendMessage = new SendMessage()
            .setChatId(chat_id)
            .setText(Menu.getMessage(update.getMessage().getText()));
    }

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

    @Override
    public String getBotToken() {
        return token;
    }


}


Изначально проблема в строчке:
SendMessage sendMessage = new SendMessage()
            .setChatId(chat_id)
            .setText(Menu.getMessage(update.getMessage().getText()));


Из-за того что я так и не разобрался как там нормально передавать инфу между классами и объектами, решил делать всё через static (ведь тогда можно без объекта напрямую обращаться к методам и переменным). В итоге класс Menu (куда я планировал положить всю логику по обработке сообщения) имеет такой вид:
Menu.java
public class Menu extends Bot implements EditKeyboardRow {

    static ArrayList<KeyboardRow> keyboard = new ArrayList<>();
    static KeyboardRow keyboard1Row = new KeyboardRow();
    static KeyboardRow keyboard2Row = new KeyboardRow();



    public static String getMessage(String msg) {


        replyKeyboardMarkup.setResizeKeyboard(true);


        if (msg.equals("Привет") || msg.equals("Меню") || msg.equals("Выйти в главное меню")
                || msg.equals("/start")) {
            keyboard.clear();
            keyboard1Row.clear();
            keyboard2Row.clear();
            keyboard1Row.add("Начало");
            keyboard1Row.add("Настройки");
            keyboard2Row.add("О боте");
            keyboard.add(keyboard1Row);
            keyboard.add(keyboard2Row);
            replyKeyboardMarkup.setKeyboard(keyboard);
            return "Выберите пункт меню";
}
/* ну и так далее... */



Потом я захотел еще улучшить свой код и попробовать основные методы прокинуть через интерфейс (объявляем что будет реализовано, а не как. А в классе потом уже переопределяем) и тут я попал в ловушку. Так как обычные интерфейсы не подходят из-за статика, а статик интерфейс нельзя переопределять. И теперь я в ступоре и не знаю как выйти правильно из ситуации. Однозначно надо рефакторить код в другую сторону, но у меня нет понимания куда именно и как это сделать. Я прям вижу что у меня не объектами идет работа, а функциональщина какая-то, но в силу своих не высоких знаний не могу сам найти правильное решение.

PS Хотел посмотреть код на github у кого-то, но в основном лапшу из if-else находил.

Поэтому прошу совета куда мне двигаться и что стоит изменить. Видел примеры на Spring, но сейчас для меня кор - это максимум.
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Приветствую, коллега!
Думаю, что тут не имеет значение тот факт, что вы пишете телеграм бота.
Как мне кажется, вам нужно изучить ООП и паттерны проектирования.
Я бы например, подключил бы либу для DI и создал бы сервисный слой, который уже внедрял бы в нужные места.

Видел примеры на Spring, но сейчас для меня кор - это максимум.

Как вариант, вы можете обойтись и без спринга пока что... Для DI можете использовать Guice или Dagger
https://www.baeldung.com/guice


Потом я захотел еще улучшить свой код и попробовать основные методы прокинуть через интерфейс (объявляем что будет реализовано, а не как. А в классе потом уже переопределяем) и тут я попал в ловушку. Так как обычные интерфейсы не подходят из-за статика, а статик интерфейс нельзя переопределять. И теперь я в ступоре и не знаю как выйти правильно из ситуации. Однозначно надо рефакторить код в другую сторону, но у меня нет понимания куда именно и как это сделать. Я прям вижу что у меня не объектами идет работа, а функциональщина какая-то, но в силу своих не высоких знаний не могу сам найти правильное решение.


Ну тут можно создать интерфейс Service, а далее создать имплементацию этого сервисного слоя.
Далее например, if statement можно упростить путем использования switch. А так кейсы свича можно группировать, то это очень удобно и наверное, более читабельно.

Было бы неплохо изучить Spring Boot
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Emphasoft Санкт-Петербург
от 200 000 до 400 000 ₽
The AnyLogic Company Санкт-Петербург
от 180 000 ₽
от 150 000 до 400 000 ₽
07 мар. 2021, в 23:34
5000 руб./за проект
07 мар. 2021, в 23:14
10000 руб./за проект