Оптимизация кода JAVA

147
30 сентября 2019, 13:00

Есть несколько классов в каждом из maven-модулей. Все классы делают одно и то же, - хранят два списка -- список команд и список их опций. В каждом модуле команды и их опции разные, но сами классы очень похожи. Хотелось бы как-то это оптимизировать, чтобы не было таких похожих классов. Возможно через интерфейс, или дополнительный класс-builder. Посоветуйте, как правильно это сделать. Вот примеры этих классов:

public class PersonListCommandsAndOptions {
private OptionDescription fileOption = new OptionDescription
        ("file", "f", "file name", true);
private OptionDescription nameTrueOption = new OptionDescription
        ("name", "n", "name of person", true);
private OptionDescription nameFalseOption = new OptionDescription
        ("name", "n", "name of person", false);
private OptionDescription surnameTrueOption = new OptionDescription
        ("surname", "s", "surname of person", true);
private OptionDescription surnameFalseOption = new OptionDescription
        ("surname", "s", "surname of person", false);
private OptionDescription ageTrueOption = new OptionDescription
        ("age", "a", "age of person", true);
private OptionDescription ageFalseOption = new OptionDescription
        ("age", "a", "age of person", false);
private OptionDescription emailTrueOption = new OptionDescription
        ("email", "e", "person email address", true);
private OptionDescription emailFalseOption = new OptionDescription
        ("email", "e", "person email address", false);
private OptionDescription idTrueOption = new OptionDescription
        ("id", "i", "ID of person", true);
private OptionDescription idFalseOption = new OptionDescription
        ("id", "i", "ID of person", false);
private OptionDescription outOption = new OptionDescription
        ("out", "o", "what needs to be replaced", true);
private OptionDescription toOption = new OptionDescription
        ("to", "t", "what will be replaced", true);

private CommandDescription addPersonCmd = new CommandDescription("add", "a", "added to file",
        new AddCommand(), fileOption, nameTrueOption, surnameTrueOption, ageTrueOption, emailTrueOption);
private CommandDescription clearPersonCmd = new CommandDescription("clear", "c",
        "full clear of file", new ClearCommand(), fileOption);
private CommandDescription findPersonCmd = new CommandDescription("find", "f", "record search",
        new FindCommand(), fileOption, nameFalseOption, surnameFalseOption, ageFalseOption, emailFalseOption,
        idFalseOption);
private CommandDescription helpPersonCmd = new CommandDescription("help", "h", "help",
        new HelpCommand());
private CommandDescription replacePersonCmd = new CommandDescription("replace", "r",
        "replace content", new ReplaceCommand(), fileOption, outOption, toOption);
private CommandDescription viewPersonCmd = new CommandDescription("view", "v",
        "view all file content", new ViewAllCommand(), fileOption);

private List<OptionDescription> personOptions = Arrays.asList(fileOption, nameTrueOption, nameFalseOption,
        surnameTrueOption, surnameFalseOption, ageTrueOption, ageFalseOption, emailTrueOption, emailFalseOption,
        idTrueOption, idFalseOption, outOption, toOption);
private List<CommandDescription> personCommands = Arrays.asList(addPersonCmd, clearPersonCmd, findPersonCmd,
        helpPersonCmd, replacePersonCmd, viewPersonCmd);

public List<OptionDescription> getPersonOptions() {
    return personOptions;
}
public List<CommandDescription> getPersonCommands(){
    return personCommands;
}}
public class ClientListCommandsAndOptions {
private OptionDescription fileOption = new OptionDescription
        ("file", "f", "file name", true);
private OptionDescription jsonOption = new OptionDescription
        ("json", "j", "name of JSON-object", true);
private OptionDescription nameTrueOption = new OptionDescription
        ("name", "n", "name of client", true);
private OptionDescription nameFalseOption = new OptionDescription
        ("name", "n", "name of client", false);
private OptionDescription surnameTrueOption = new OptionDescription
        ("surname", "s", "surname of client", true);
private OptionDescription surnameFalseOption = new OptionDescription
        ("surname", "s", "surname of client", false);
private OptionDescription passportTrueOption = new OptionDescription
        ("passport", "x", "passport number of client", true);
private OptionDescription passportFalseOption = new OptionDescription
        ("passport", "x", "passport number of client", false);
private OptionDescription phoneTrueOption = new OptionDescription
        ("phone", "y", "client's phone number", true);
private OptionDescription phoneFalseOption = new OptionDescription
        ("phone", "y", "client's phone number", false);
private OptionDescription accountTrueOption = new OptionDescription
        ("account", "z", "account of client in the bank", true);
private OptionDescription accountFalseOption = new OptionDescription
        ("account", "z", "account of client in the bank", false);
private OptionDescription idTrueOption = new OptionDescription
        ("id", "i", "ID of client", true);
private OptionDescription idFalseOption = new OptionDescription
        ("id", "i", "ID of client", false);
private OptionDescription outOption = new OptionDescription
        ("out", "o", "what needs to be replaced", true);
private OptionDescription toOption = new OptionDescription
        ("to", "t", "what will be replaced", true);

private CommandDescription addClientCmd = new CommandDescription("add", "a", "added to file",
        new AddCmd(), fileOption, jsonOption, nameTrueOption, surnameTrueOption, passportTrueOption,
        phoneTrueOption, accountTrueOption);
private CommandDescription clearClientCmd = new CommandDescription("clear", "c",
        "full clear of file", new ClearCmd(), fileOption, jsonOption);
private CommandDescription findClientCmd = new CommandDescription("find", "f", "record search",
        new FindCmd(), fileOption, nameFalseOption, surnameFalseOption, passportFalseOption, phoneFalseOption,
        accountFalseOption, idFalseOption);
private CommandDescription helpClientCmd = new CommandDescription("help", "h", "help",
        new HelpCmd());
private CommandDescription replaceClientCmd = new CommandDescription("replace", "r",
        "replace content", new ReplaceCmd(), fileOption, jsonOption, outOption, toOption);
private CommandDescription viewClientCmd = new CommandDescription("view", "v",
        "view all file content", new ViewCmd(), fileOption);

private List<OptionDescription> clientOptions = Arrays.asList(fileOption, jsonOption, nameTrueOption,
        nameFalseOption, surnameTrueOption, surnameFalseOption, passportTrueOption, passportFalseOption,
        phoneTrueOption, phoneFalseOption, accountTrueOption, accountFalseOption, idTrueOption, idFalseOption,
        outOption, toOption);
private List<CommandDescription> clientCommands = Arrays.asList(addClientCmd, clearClientCmd, findClientCmd,
        helpClientCmd, replaceClientCmd, viewClientCmd);

public List<OptionDescription> getClientsOptions() {
    return clientOptions;
}
public List<CommandDescription> getClientCommands(){
    return clientCommands;
}}
Answer 1

Конечно, описывать как разные классы сущности, которые одинаковы по смыслу и отличаются лишь состоянием (т.е. значением переменных объекта) -- это профанация объектно-ориентированного программирования. Слегка упрощая, можно сказать, что весь смысл "объектности" состоит в том, что разные экземпляры одного класса хранят сходные сущности, отличающиеся лишь значением переменных объекта. Глупо было бы заводить отдельный класс на каждую корову, желая описать членов стада.

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

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

Если вам оптимальность не так важна, можете воспользоваться той идеей, которая первой пришла мне в голову, навскидку, без тщательного обдумывания:

    package stackoverflow;
    import java.util.ArrayList;
    public class Ru_so_943505 {
        static class ListItem {
            private String s1, s2, s3;
            private boolean b;
            ListItem(String s1, String s2, String s3, boolean b) {
                this.s1 = s1; this.s2 = s2; this.s3 = s3; this.b = b;
            }
            void print() {
                System.out.format("  s1 = %s, \ts2 = %s, \ts3 = %s, \tb = %s\n", 
                                    s1, s2, s3, b);
            }
        }
        static class ListHolder {
            private ArrayList<ListItem> list = new ArrayList<>();
            ListHolder add(String s1, String s2, String s3, boolean b) {
                list.add(new ListItem(s1, s2, s3, b));
                return this;
            } 
            void print() {
                list.forEach(i -> i.print());
            }
        }
        public static void main(String... args) {
            ListHolder list1 = new ListHolder().
                    add("Один", "в поле", "не воин", true).
                    add("Два сапога", "от яблони", "не далеко падают", false).
                    add("My mind", "is clear", "now", false);
            ListHolder list2 = new ListHolder().
                    add("At last", "all too well", "I can see", true).
                    add("Where we all", "soon", "will be", false).
                    add("If you strip away", "the myth", "from the man", false).
                    add("You will see", "where we all", "soon will be", false);
            System.out.println("List 1:");
            list1.print();
            System.out.println("\nList 2:");
            list2.print();
        }
    }
READ ALSO
Как задать id для тега mark?

Как задать id для тега mark?

Просьба подсказать, как задать id для тега mark?

159
Можно ли сделать выборку родительского элемента по дочернему в css?

Можно ли сделать выборку родительского элемента по дочернему в css?

Добрый день, подскажите, можно ли выбрать родителя при ховере или фокусе дочернего элемента без jsНапример, выборки могут быть по nth-of-type :not ~ + и т

125
Не работает анимация клика по карточке, сделанной на figure

Не работает анимация клика по карточке, сделанной на figure

Есть карточка сделана на figure, и если на нее нажать на android, анимация работает, а если на ios, то не работает в чем может быть проблема?

135