@Magistrmate

Как оформить все свойства книг не через константы?

Как сократить количество констант? Они отличаются по сути только вначале имени и получается, что можно легко запутаться. Нужно ли мне создавать для них отдельные классы или что-то ещё?

public static final String PZV_COVER = "AgACAgIAAxkBAAIBx2KTdP4CNbqTZfv7Hm7TqGAugkdSAAKIvjEbUaqZSPwL-Up482owAQADAgADeQADJAQ";
public static final String PZV_NAME = "Параллельно задавая вопрос";
public static final String PZV_DESC = """
        Сборник из пяти произведений\\. Подробные аннотации внутри\\.
        *Под покровом единства*
        Существует вуз, где запрещена дружба, и всех обучают рассчитывать только на себя\\.
        *Корректировка*
        В прошлом случайный спор друзей из компании повлиял на их судьбу в настоящем\\.
        *Лунные тени*
        Хождение во сне жителей общаги и кровавые истории под утро\\.
        *Звезда*
        Сказка о том, как на Землю упала Звезда\\.
        *Понимания ноль*
        Дружба между парнем и девушкой существует и поддерживается государством, давая им невероятные способности\\.""";
public static final String PZV_RIDERO = "https://ridero.ru/books/parallelno_zadavaya_vopros/";
public static final String PZV_LITRES = "https://www.litres.ru/daniil-apasov/parallelno-zadavaya-vopros-pod-pokrovom-edinstva-korrektirov/";
public static final String PZV_WILDBERRIES = "https://www.wildberries.ru/catalog/36734671/detail.aspx?targetUrl=SN";
public static final String PZV_OZON = "https://www.ozon.ru/product/parallelno-zadavaya-vopros-168137107/?sh=qwZ99MK_wQ";
public static final String PZV_ALIEXPRESS = "https://aliexpress.ru/item/1005002349414876.html?gatewayAdapt=glo2rus&sku_id=12000020229783418";
public static final String PZV_AMAZON = "https://www.amazon.com/dp/B084Q3G56J";
public static final String POD_COVER = "AgACAgIAAxkBAAICIWKV6rrWZCfAVHeZRb600fEdhUUtAALFuTEbgvKxSGOQfTzAxJOgAQADAgADeQADJAQ";
public static final String POD_NAME = "Под покровом единства";
public static final String POD_DESC = "Никогда не задумывались, что друзья — это ваша слабость? Иногда вы" +
        "рискуете всем ради них\\. Государство и учебные заведения об этом не расскажут, кроме одного вуза со" +
        "спецпрограммой, который сделает из каждого студента личность\\. Где все связи будут запрещены\\." +
        "Самостоятельность во главе всего\\. Все ли смогут пройти такую школу жизни?";
public static final String KORR_COVER = "AgACAgIAAxkBAAICHWKV6h4KSQAB0Cw-9YYzNmKqQYlBbAACwrkxG4LysUioRIR5O_3J4wEAAwIAA3kAAyQE";
public static final String KORR_NAME = "Корректировка";
public static final String KORR_DESC = "Каждый из нас задумывается о такой штуке, как судьба\\. Что привело нас к" +
        "сегодняшнему дню? Друзья, знакомые, парни и девушки\\. Все ли эти отношения образовались сами собой, или," +
        "быть может, кто\\-то из твоих близких друзей всего лишь хорошо разыграл все карты несколько лет назад?";
public static final String LUNN_COVER = "AgACAgIAAxkBAAICH2KV6lrfNbsYfnqVDQwV1uhexKUGAALDuTEbgvKxSBEP75XimlVwAQADAgADeQADJAQ";
public static final String LUNN_NAME = "Лунные тени";
private static final String LUNN_DESC = "Общежитие при университете — особый период в жизни каждого человека\\." +
        "Здесь происходит в основном много приятных событий, запоминающихся на всю жизнь\\. Однако судьбы трёх" +
        "друзей это место однажды навсегда изменит\\. Им предстоит череда ночей, когда редко все оставались к " +
        "утру живы\\. Что же делать в ситуации, когда врагом является твой спящий друг?";
public static final String ZVEZDA_COVER = "AgACAgIAAxkBAAICG2KV6b_hGJ0jk_yHtzUWmfXrs0K-AALBuTEbgvKxSE55vwxxNxcxAQADAgADeQADJAQ";
public static final String ZVEZDA_NAME = "Звезда";
private static final String ZVEZDA_DESC = "Детские мечты не всегда сбываются так, как вы того хотели\\. " +
        "Кирили, обычный парень, которому предстоит испытать невероятные впечатления, когда он всё же сможет " +
        "прикоснуться к своей мечте\\. Сможет ли он совладать с человеческими пороками и спасти Землю от уничтожения?";
public static final String PON_COVER = "AgACAgIAAxkBAAICI2KV6u5ALDMcSPP4WPsvdr5iBJ1hAALGuTEbgvKxSGlGhmGbA1qtAQADAgADeQADJAQ";
public static final String PON_NAME = "Понимания ноль";
private static final String PON_DESC = "Привет\\. Я тут рассказал неординарную историю нашего путешествия и " +
        "немного о нашем мире\\. Представляете, у нас дружба между парнем и девушкой возможна\\. Причем на " +
        "законодательном уровне\\. Мы начинаем обладать особыми силами, но это уже подробнее внутри\\. Возможно, " +
        "ваша жизненная ситуация похожа на нашу, и вы являетесь таким другом противоположному себе полу, а?";
String BOOK_COVER;
String BOOK_NAME;
String BOOK_DESC;

@Override
public String getBotUsername() {
    return "Magistrmate_bot";
}

@Override
public String getBotToken() {
    return BotConfig.BOT_TOKEN;
}

@Override
public void onUpdateReceived(Update update) {
    Message message = update.getMessage();
    if (update.hasMessage()) {
        if (message.getText().equals("/start")) {
            createMessage(message, "Добро пожаловать " + message.getFrom().getFirstName() + "\\!\n" +
                    "Мы можем перейти сразу к книгам или пообщаться\\. Я пока в процессе познания вашего мира," +
                    " поэтому пишите и если не пойму, то выдам вам подсказки\\.");
        } else if (update.getMessage().getText().toLowerCase(Locale.ROOT).contains("привет")) {
            createMessage(message, "Дороу");
        } else if (update.getMessage().getText().toLowerCase(Locale.ROOT).contains("книг") ||
                update.getMessage().getText().toLowerCase(Locale.ROOT).contains("книж")) {
            createMediaGroup(message);
            createPhoto(update, message);
        } else
            createMessage(message, "Давайте вместе разберемся, чем я могу помочь");
    } else if (update.hasCallbackQuery()) {
        Message backMessage = update.getCallbackQuery().getMessage();
        if (update.getCallbackQuery().getData().equals("NextBook") ||
                update.getCallbackQuery().getData().equals("PreviousBook")) {
            if (update.getCallbackQuery().getData().equals("NextBook")) {
                if (backMessage.getCaption().contains(PZV_NAME)) {
                    whichBook(POD_COVER, POD_NAME, POD_DESC);
                } else if (backMessage.getCaption().contains(POD_NAME)) {
                    whichBook(KORR_COVER, KORR_NAME, KORR_DESC);
                } else if (backMessage.getCaption().contains(KORR_NAME)) {
                    whichBook(LUNN_COVER, LUNN_NAME, LUNN_DESC);
                } else if (backMessage.getCaption().contains(LUNN_NAME)) {
                    whichBook(ZVEZDA_COVER, ZVEZDA_NAME, ZVEZDA_DESC);
                } else if (backMessage.getCaption().contains(ZVEZDA_NAME)) {
                    whichBook(PON_COVER, PON_NAME, PON_DESC);
                } else if (backMessage.getCaption().contains(PON_NAME)) {
                    whichBook(PZV_COVER, PZV_NAME, PZV_DESC);
                }
            } else if (update.getCallbackQuery().getData().equals("PreviousBook")) {
                if (backMessage.getCaption().contains(PZV_NAME)) {
                    whichBook(PON_COVER, PON_NAME, PON_DESC);
                } else if (backMessage.getCaption().contains(POD_NAME)) {
                    whichBook(PZV_COVER, PZV_NAME, PZV_DESC);
                } else if (backMessage.getCaption().contains(KORR_NAME)) {
                    whichBook(POD_COVER, POD_NAME, POD_DESC);
                } else if (backMessage.getCaption().contains(LUNN_NAME)) {
                    whichBook(KORR_COVER, KORR_NAME, KORR_DESC);
                } else if (backMessage.getCaption().contains(ZVEZDA_NAME)) {
                    whichBook(LUNN_COVER, LUNN_NAME, LUNN_DESC);
                } else if (backMessage.getCaption().contains(PON_NAME)) {
                    whichBook(ZVEZDA_COVER, ZVEZDA_NAME, ZVEZDA_DESC);
                }
            }
            InputMedia cover = new InputMediaPhoto();
            cover.setMedia(BOOK_COVER);
            cover.setCaption("*" + BOOK_NAME + "*\n" + BOOK_DESC);
            cover.setParseMode(ParseMode.MARKDOWNV2);
            EditMessageMedia replacePhoto = new EditMessageMedia();
            replacePhoto.setMedia(cover);
            replacePhoto.setChatId(backMessage.getChatId().toString());
            replacePhoto.setMessageId(Integer.valueOf(backMessage.getMessageId().toString()));
            InlineKeyboardMarkup inlineKeyboard = new InlineKeyboardMarkup();
            createFirstKeyboard(update, inlineKeyboard);
            replacePhoto.setReplyMarkup(inlineKeyboard);
            try {
                execute(replacePhoto);
            } catch (TelegramApiException e) {
                e.printStackTrace();
            }
        } else if (update.getCallbackQuery().getData().equals("ExcerptBook")) {
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Mootfrost
C#, C++, JS, Python
Используйте базу данных, ведь книг будет больше одной, возможно тысячи
Ответ написан
xez
@xez Куратор тега Java
TL Junior Roo
Надо разобраться что такое объекты.
У вас, видимо, объект Книга с полями обложка, имя, описание, ссылки...
Вот так это будет в коде:
class Book {
  String cover;
  String name;
  String desc;
  // и т.д...
}

Такими объектами будет легко пользоваться и всегда будет понятно, к какой книге принадлежит то или иное описание или урл.
Почитайте про ООП - там об этом обо всем.
Затем уже про сериализацию/десериализацию объектов, а там уже и до БД дойдете...
Ответ написан
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
Рефакторинг introduce constant не является обязательным. Тоесть ты можешь просто в коде писать хардкодом строки если они используются только 1 раз. С точки зрения компиллятора все подобные строки будут константами в блоке констант класса поэтому декларация их отдельно имеет чисто эстетический характер.

По поводу лесенки из if-else. Здесь можно два рефакторинга. Во первых убрать цепочку методов.
Вот это
if (backMessage.getCaption().contains(PZV_NAME)) {
                    whichBook(POD_COVER, POD_NAME, POD_DESC);
} else if (backMessage.getCaption().contains(POD_NAME)) {

заменить на
val caption = backMessage.getCaption()
if (caption.contains(PZV_NAME)) {
                    whichBook(POD_COVER, POD_NAME, POD_DESC);
} else if (caption.contains(POD_NAME)) {

И второе. Вот эта логика может быть сведена к вызову одной функции которая на вход получает атом и на выходе возвращает тройку атомов (tuple или triple). В этом случае логика if-else сводится к конфигурации таблички замен
и к функции которая просто делает декодирование одного значения в другое.

static final Map<String,Triple<String,String,String>> = new HashMap() {{
   put(PZV_NAME, ImmutableTriple.of(POD_COVER, POD_NAME, POD_DESC);
   put(POD_NAME, ImmutableTriple.of(KORR_COVER, KORR_NAME, KORR_DESC);
   .......
}};

Map<String,Triple<String,String,String>> transform(String arg) {
  return map.entrySet()
                .stream()
                .filter(x -> x.getKey().contains(arg))
                .findFirst().get().getValue();
}
Ответ написан
@Miron11
Пишу sql 20 лет. Срок :)
Try Delta Lake Connectors:
This is a path to use dataframe ( with data stored in something like parquet ).
This allows to store / maintain data in a simple and portable data store.
You can keep it on local machine, or push to cloud.
Access using above or any other technology, capable of understanding parquet.
In its simplest direct application DSR/DSW provides for
.filter
and other expressive methods, good for business and pleasure to code.
And you won't have to struggle with nested maps and such, which will be dead - end regardless, once number of books is larger than, say, 500, or you need to produce monthly report from bot activities, whichever comes first :)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы