Как правильно определить константы, когда существует огромное количество констант? - PullRequest
7 голосов
/ 18 июня 2019

Я работаю над кодом, который имеет большое количество констант, которые должны быть определены.В первую очередь это касается Marketplace констант (это могут быть США, Великобритания, ИНДИЯ, ЯПОНИЯ) и связанных MarketplaceMerchantMapping, которые в основном отображают MerchantID с MarketplaceID.

Например:

public enum Marketplace {

    US("US"),
    JP("JP"),
    UK("UK"),
    IN("IN"),
    NZ("NZ"),
    CA("CA"),
    FR("FR"),
    ... 
    ...

  // This could go up to some 400 marketplaces

    private final String stringValue;

    public boolean isWest() {
        return this == US || this == CA || this == UK;
    }

    public boolean isEast() {
        return this == IN || this == NZ || this == JP;
    }

}
public enum MarketplaceMerchantMapping {

    USMAP(MarketplaceID.US, MerchantID.US, Marketplace.US),
    JPMAP(MarketplaceID.JP, MerchantID.JP, Marketplace.JP),
    UKMAP(MarketplaceID.UK, MerchantID.UK, Marketplace.UK),
    NZMAP(MarketplaceID.NZ, MerchantID.NZ, Marketplace.NZ),
    INMAP(MarketplaceID.IN, MerchantID.IN, Marketplace.IN),
    CAMAP(MarketplaceID.CA, MerchantID.CA, Marketplace.CA),
    FRMAP(MarketplaceID.FR, MerchantID.FR, Marketplace.FR),
    ...
    ... 

   // THis can go up to 400 Marketplaces * Number of merchantIds in each marketplace.


}

Существуют и другие похожие константы, определяемые так же, как перечисления или статические константы.

Это на самом деле не масштабируется, потому что каждый раз, когда мы добавляем поддержку нового Marketplace и Merchants, нам нужно идти иобновите кучу файлов и протестируйте их, и эти изменения конфигурации сами по себе отнимают много времени у разработчика.

В идеале, я хотел бы знать, есть ли какой-нибудь способ определить эти константы в каком-либо файле конфигурации и прочитать эти файлысоздать константы.Есть ли способ создать такие константы перечисления, читая и анализируя некоторый файл конфигурации?

Так что, если у меня есть файл конфигурации со следующими записями:

ConfigFile.cfg:

WestMarketplaces = ("US", "AG", "MX", "CA", ...) // Expand this later as required
EastMarketplaces = ("IN", "AU", "SG", "JP", ...) // Expand this later as required
EUMarketplaces = ("UK", "FR", "SP", ...) // Expand this later as required

WestMerchantIds = ("WA", "WB", "WC", "WD", ...) // Expand this later as required
WestMerchantIds = ("EA", "EB", "EC", "WD", ...) // Expand this later as required
EUMerchantIds = ("EUA", "EUB", "EUC", "WDD", ...) // Expand this later as required

marketplaceMerchantMapping = {
  "US" = "WA";
  "CA" = "WB";
  "MX" = "WC";
  "AU" = "EA";
  "IN" = "EB";
  "JP" = "EC";
  "UK" = "EUA";
  "FR" = "EUB";
...
} // Expand this later as required

Тогда, может ли он прочитать эти константы из файла конфигурации и построить соответствующие перечисления или статические константы?

Возможно ли это сделать?

Ответы [ 3 ]

5 голосов
/ 18 июня 2019

Если использование базы данных невозможно, тогда хорошо поддерживаемый лист XLS может быть следующим лучшим вариантом. Вместе с хорошо протестированным процессом извлечения данных листа, либо для генерирования из него кода, либо для использования в качестве входных данных для конфигурации свойств.

Как полагал ОП: исходный код Java не идеален, когда необходимо поддерживать такое большое количество «ключевых» свойств, но, что более важно, регулярно обновлять.

Конечно, аспект key здесь: в хорошем состоянии . Должен быть четко определенный процесс, которому должен следовать каждый, и вся «цепочка», от внесения изменений в XLS (в идеале с контролем версий) до создания артефактов, необходимых во время сборки, должна быть простой и хорошо протестированной.

4 голосов
/ 18 июня 2019

Перечисления должны быть «известны» во время компиляции.Поэтому, пока вы работаете с Enums (и я понимаю, что вы хотели бы работать с ними из-за безопасности типов, поддержки IDE и т. Д.), Вы должны писать их, и это действительно утомительно, если их много с-connections.

Теперь вы просите (если я вас правильно понимаю):

  • Я бы хотел определить файл конфигурации (json / yaml) независимо от того,
  • На основе этого файла мне нужно создать «что-то» для работы во время выполнения.

Я предлагаю здесь довольно распространенный подход (по крайней мере, по моему опыту), но это то, что определенно поможет выполнить работу:

Идея 1: если это утомительно, почему бы не автоматизировать его?

Идея 2 , если вам нравится работать с перечислениями, почему бы не создавать перечисления?

Так что в основномЯ предлагаю генерировать код (а генерировать перечисления просто, потому что у них нет никакой реальной логики, которую нужно выполнять) во время сборки.

Так что вам нужно будет сделать пару вещей, если вы решите следоватьэтот путь:

  • Убедитесь, что генерация кода выполнена до компиляции реальных классов, иначе вы не сможете использовать автоматически сгенерированный код из ваших классов.

  • Убедитесь, что код сгенерирован правильно.В прошлом это был довольно болезненный процесс, но теперь есть небольшая библиотека под названием Java Poet , которая делает процесс генерации кода довольно простым процессом.

  • Makeуверен, что этот подход интегрируется с вашими инструментами сборки.Например, если вы используете maven, рассмотрите возможность создания плагина maven, который запустит процесс генерации кода и сохранит его в target/generated-sources.Затем присоедините его к фазе generated-sources (которая, очевидно, запускается до фазы compile), и сгенерированные источники будут неразличимы с точки зрения компилятора java, когда он начнет компилировать ваши классы.

Чтобы дать вам пример, я могу отослать вас к тому, что я недавно сделал как проект для домашних животных для довольно похожей проблемы (извиняюсь, если это звучит как самореклама, я никогда не "рекламирую себя" вИтак, я делаю это, потому что я действительно верю, что технически это может помочь, если вы решите пойти по этому пути, потому что технически он содержит все соединенные вместе кусочки):

Поэтому моей целью было автоматизировать создание исключений (что, возможно, немного сложнее, чем генерация перечислений), так же как и вы, я подумал, что было бы неплохо создать некоторый конфигурационный файл yaml, добавить в него информацию об исключениях (traceIds, сообщения, параметры и т. д.) и позволить сборкеПроцесс создания фактического Java-кода исключений.

Исходный код доступен на Github в проекте под названием Simplex (библиотека простой обработки исключений).Он имеет плагин maven для справки, генератор, который использует Java Poet и т. Д.

0 голосов
/ 18 июня 2019

Если вы просто хотите написать перечисления более читабельным способом, вы можете добавить к ним атрибут:

public enum Marketplace {
     US("US", false, true),
     JP("JP", true, false),
     UK("UK", false, true),
     IN("IN", true, false),
     NZ("NZ", true, false),
     CA("CA", false, true),
     FR("FR", false, false);

     // This could go uptp some 400 marketplaces

     private final String stringValue;

     /** Markers for the getters */
     private final boolean isWest, isEast;

     Marketplace(String stringValue, boolean isEast, boolean isWest) {
         this.stringValue = stringValue;
         this.isEast = isEast;
         this.isWest = isWest;
     }

     public boolean isWest() {
         return isWest;
     }

     public boolean isEast() {
         return isEast;
     }
}

Технически вы можете легко сохранить их в базе данных, если сделаете это свойством перечисления. Если у вас нет доступного хранилища данных, вам придется поддерживать их в исходном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...