Принятие решений на основе вида ввода - PullRequest
0 голосов
/ 02 мая 2020
public class Main {
    public static void main(String[] args) {
        DataStructure s = new DataStructure();
        Input in = new Input();
        Data x = null;
        while ((x = in.readNext()) != null) {
            if (x instanceof InsertData) {
                s.insert((InsertData)x);
            } else if (x instanceof QueryData) {
                System.out.println(s.query((QueryData)x));
            }
        }
    }
}

Input читает вводимые пользователем данные и возвращает их в виде Data, используя метод Data readNext().

Data может быть InsertData или QueryData (они также имеют различные поля, т. е. форма данных для вставки отличается от запроса).

Я хотел бы прочитать Data и выполнить вставку / запрос для DataStructure s, в зависимости от типа Data был возвращен readNext().

Код выше - мое простое решение этой проблемы, но он использует преобразование и instanceof, который не является отличным стилем кодирования. Можете ли вы предложить какое-нибудь лучшее решение?

Другое решение, о котором я подумал, было бы иметь метод void performAction(DataStructure s) в Data, который был бы переопределен на InsertData / QueryData, и выполнить соответствующее действие на * 1024. *, но я думаю, что излишне связывать DataStructure с Data, что тоже не будет хорошим стилем. Это значит, что я хотел бы разделить ввод и выполнение действий, потому что чтение данных и выполнение каких-либо действий с ними - это разные вещи.

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Что вы можете сделать, это добавить обобщенный метод c process(Data data) в класс DataStructure, который вставляет или запрашивает данные в зависимости от типа экземпляра. Таким образом, класс DataStructure отвечает за принятие решений, вместо класса Data.

Если вы используете Java 14, вы также можете избавиться от явного приведения ( см https://www.baeldung.com/java-pattern-matching-instanceof).

0 голосов
/ 02 мая 2020

Добавить метод performAction(Data) в класс DataStructure.
Затем добавить абстрактный метод performOperation() в класс Data.
Переопределить метод performOperation() в классе InsertData и классе QueryData.
Метод performAction(Data) в классе DataStructure будет выглядеть следующим образом:

public void performAction(Data x) {
    x.performOperation();
}

, а ваш while l oop (в вашем методе main()) будет:

while ((x = in.readNext()) != null) {
   s.performAction(x);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...