Эффективный дизайн для объединения Enum в различные условия с отношением многие ко многим - PullRequest
2 голосов
/ 01 ноября 2019

В Java я использую Enum, а затем EnumSet, чтобы сгруппировать различные перечисления, представляющие похожее поведение.

Что-то вроде:

enum MyConditions {
    condition_A;
    condition_B;
    condition_1;
    condition_100;
    condition_xyz;
    ... more ...

}

EnumSet<MyConditions> group1 = EnumSet.of(condition_A, condition_xyz);
EnumSet<MyConditions> group2 = EnumSet.of(condition_B, condition_xyz);
EnumSet<MyConditions> group3 = EnumSet.of(condition_xyz);
... and many more...

Причина различных EnumSet я хочу проверить, принадлежит ли конкретное условие группе 1 или группе 2 или группе 3 и т. Д.

Мне кажется, что дизайн немного сложен, так как я должен продолжать делать все больше и больше EnumSetдля разных условий, а дизайн не поддерживает подгруппы. Например, объединение group1 & 2 для проверки родительского условия.

Другое предложение, которое я предлагаю, - предоставить группу в самой конструкции enum.

Что-то вроде:

enum MyConditions {
    condition_A(group1);
    condition_B(group2);
    condition_1;
    condition_100;
    condition_xyz(group1, group2);
    ... more ...

}

Это также не очень хорошо, так как это делает читаемость Enum проблемой при наличии нескольких групп.

Enums - это статические данные, которые соответствуют некоторому целому числу из стороннего API. Да, я хочу динамически создавать отношения группы условий или, если я определяю вручную, то, по крайней мере, несколько чище, чем в настоящее время. Помимо простого нахождения определенного условия в определенной группе, существует несколько групп, которые могут представлять аналогичное условие. Например, если вызывающая сторона запрашивает условие, и если это не часть группы 1, а группа 2. Мы хотели бы сказать «нет, это не часть группы 1, а часть группы 2». Это предполагает, что group1 и group2 были помечены как похожие. Но давайте предположим, что существует отдельная группа 3, и если пользователь спрашивает, является ли она условной частью группы 3, мы просто хотим сказать «нет, она не является частью группы 3»

Есть идеи о том, что такое хороший дизайн здесь?

1 Ответ

0 голосов
/ 02 ноября 2019

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

public class Mapping {
    private final EnumMap<Group, EnumSet<MyConditions>> mappings = 
        new EnumMap<>(Group.class);

    // or

    private EnumMap<MyConditions, EnumSet<Group>> mappingsV2 = 
        new EnumMap<>(MyConditions.class);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...