Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Текстовые значения в коде  [new]
Molasar
Member

Откуда:
Сообщений: 749
Всем привет!

Есть код, в котором много текстовых значений:

- kUrl = "activeMQ.url" - используется как ключ в Map структуре messageServiceConfig, которая содержит в себе данные из файла properties key=value
- exConnectionStarted = "Connection has already started" - описание для Exception
Причем некоторые текстовые значения используются в других классах.

Куда эти тексты лучше запихнуть красиво, чтобы избавиться от текста в коде вообще?

public class SingleMessageService {
    
    ...
    private final String kUrl = "activeMQ.url";
    private final String kUsername = "activeMQ.username";
    private final String kPassword = "activeMQ.password";
    private final String kQueue = "activeMQ.queue";
    private final String kMode = "activeMQ.mode";

    ...
    private final String exConnectionStarted = "Connection has already started";
    private final String exConnect = "Failed connect Message Service provider";
    private final String exProducer = "Failed create Producer";
    private final String exNoMode = "Mode is absent";
    private final String exNoQueue = "Queue name is absent";
    private final String exStarted = "Message Service is not connected";
    private final String exClose = "Failed disconnect Message Service provider";
    private final String exSend = "Failed send message";
    private final String exProducerIsNull = "Producer is null";

    ...
    public void connect(MessageServiceConfig messageServiceConfig) {
        if (connection == null) {
            if (messageServiceConfig.getProperties()
                    .containsKey(kUrl)) {
                connectionFactory = new ActiveMQConnectionFactory(
                        (String) messageServiceConfig.getProperties()
                                .get(kUsername),
                        (String) messageServiceConfig.getProperties()
                                .get(kPassword),
                        (String) messageServiceConfig.getProperties()
                                .get(kUrl));
            } else {
                throw new MessageServiceException(exUrlAbsent);
            }
        ...
11 июл 19, 10:40    [21924620]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1518
Molasar
Куда эти тексты лучше запихнуть
в проекте папку Globals. Туда пакет Globals и статик класс.
11 июл 19, 11:22    [21924673]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
mayton
Member

Откуда: loopback
Сообщений: 41921
Красивость - это не совсем инженерный термин. Обычно преследуются следующие цели.
Выделить все настройки связанные с локализацией в отдельные конфиги (*properties,*yaml, *xml, *json)
Сделать приложение конфигурируемым. Тоесть для того чтобы поменять url или логин не надо
было привлекать разработчика и пересобирать проект.

И прочее.

Какая цель у вас - непонятно.
11 июл 19, 11:39    [21924713]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1518
Molasar
exConnectionStarted = "Connection has already started" - описание для Exception
почему нет класса ExceptonMy?
11 июл 19, 11:49    [21924727]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
vas0
Member

Откуда: Таможенный союз (Россия, Казахстан)
Сообщений: 1238
Для ошибок можно что то такое сделать:
public enum Errors {
    NO_MODE,
    NO_QUEUE,

    INVALID_PRODUCER,

    START_FAILED,
    SEND_FAILED;

    public String getLocalizedMessage() {
        MessageSource messageSource = MessageSourceHolder.getMessageSource();
        return messageSource.getMessage("your.package.Errors." + name());
    }

}
далее создаешь файл с описанием ошибок errors.properties:
your.package.Errors.NO_MODE=Queue name is absent
your.package.Errors.NO_QUEUE=Mode is absent
...
из плюсов, сообщения всех твоих ошибки будут локализованы, и у каждой ошибки будет описание, особенно если ты API предоставляешь кому то еще. Из минусов (MessageSource/ApplicationContext) нужно где то сохранить, чтобы он был доступен через static метод.

автор
kUrl = "activeMQ.url" - используется как ключ в Map структуре messageServiceConfig, которая содержит в себе данные из файла properties key=value

как по мне так это лишняя Map (если это не SpringBoot), сделал бы просто:
SingleMessageService {
    @Value("${activeMQ.url}")
    private String url;
}
11 июл 19, 12:15    [21924753]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
andreykaT
Member

Откуда:
Сообщений: 2377
подобные вещи обычно вытаскивают в конфиги. и вместо фактического значения вставляют ссылочное на этот конфиг откуда оно и подгребается. если речь о бэке. и если по-нормальному. по фронту как там у них принятно хз. наверное так же.
11 июл 19, 12:31    [21924782]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
andreykaT
Member

Откуда:
Сообщений: 2377
а ну вот чел написал проперти файлы. собссно да. это оно и есть. нас двое ))
11 июл 19, 12:32    [21924784]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1518
andreykaT
подобные вещи обычно вытаскивают в конфиги.
в файлы конфиги вытаскивают для админов.
Часть можно и в коде. Или константы отменили?
11 июл 19, 12:43    [21924799]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
andreykaT
Member

Откуда:
Сообщений: 2377
зачем размазывать по коду ровным шпателем?
11 июл 19, 12:59    [21924819]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1518
andreykaT
зачем размазывать по коду ровным шпателем?

У логирования есть уровни.
У ошибок есть уровни
У переменных ес уровни
У констант есть уровни для размещения.
(не надо константы для кода выносить в конфиги)
11 июл 19, 13:05    [21924827]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
Garrick
Member

Откуда: Москва
Сообщений: 2939
andreykaT
а ну вот чел написал проперти файлы. собссно да. это оно и есть. нас двое ))

Я тоже "за"!
Уже трое.
11 июл 19, 14:25    [21924936]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
забыл ник
Member

Откуда:
Сообщений: 2945
Соглашусь с петром.

Есть три типа информации:
1) Конфигурационные параметры - их кладем в properties, они меняются девопсами по необходимости на нужном энвайрнменте
2) Локализационные данные - сообщения об ошибках, UI-лейблы и т.д - кладутся в папку messages - каждому языку по файлу
3) Константы имплементации val regex = "\\w" - их либо держать в классе, где используются, либо заводить Constants.java, на этот счет я иду немного в разрез с общепринятым мнением - и храню в файлах где используются
11 июл 19, 14:57    [21924971]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
andreykaT
Member

Откуда:
Сообщений: 2377
там явно пункт два из твоего списка
11 июл 19, 15:19    [21924996]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
chpasha
Member

Откуда:
Сообщений: 8235
andreykaT
там явно пункт два из твоего списка

имхо там частично 1) и частично вообще муть - по сути сообщения об ошибках в логе, которые не факт что нужно локализовать и не факт, что нужно выделять в отдельные константы, ибо если в одном месте логгер напишет "Failed create Producer", а в другом "Failed to create Producer" то небо на землю не упадет. Конечно отдельный вопрос с какого одинаковые ошибки в разных местах генерятся и не нужно ли такие места в отдельный код выделить, но допустим.
11 июл 19, 15:25    [21925002]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1518
andreykaT
там явно пункт два из твоего списка

Это?
private final String kUrl = "activeMQ.url";

Не смеши.
11 июл 19, 15:41    [21925026]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
andreykaT
Member

Откуда:
Сообщений: 2377
PetroNotC Sharp
andreykaT
там явно пункт два из твоего списка

Это?
private final String kUrl = "activeMQ.url";

Не смеши.

это вообще чистый конфиг и ему место в пропертях. то что он так оформил вместо анноташки. ну хз может так задумано. может ему нельзя.
11 июл 19, 15:44    [21925029]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1518
andreykaT
чистый конфиг
кто и когда конфигурирует?
11 июл 19, 15:53    [21925041]     Ответить | Цитировать Сообщить модератору
 Re: Текстовые значения в коде  [new]
mayton
Member

Откуда: loopback
Сообщений: 41921
Тут - какое-то переусложнение? Что это? Конфигурация конфигураций?
    private final String kUrl = "activeMQ.url";
    private final String kUsername = "activeMQ.username";
    private final String kPassword = "activeMQ.password";
    private final String kQueue = "activeMQ.queue";
    private final String kMode = "activeMQ.mode";
11 июл 19, 15:57    [21925046]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить