Проектирование класса с изменением типа - PullRequest
0 голосов
/ 02 ноября 2019

Мой класс логики высказываний выглядит следующим образом:

public class ConnectiveNode extends BinaryNode {

    ...
    private Connective.Type type;
    ...

    public Connective.Type getType() {
        return type;
    }

    private void changeTypeTo(Connective.Type newType) {
        type = newType;
    }

    @Override
    public void eliminateArrows() {
        ...
        if (...) changeTypeTo(...);
        ...
    }

    @Override
    public void toCNF() {
        switch (type) {
            case ...
            case ...
            ...
        }
    }
}

Проблема заключается в том, что метод toCNF() слишком велик, поскольку я помещаю все реализации для разных Connective.Type s, я пытался создать подклассы, но еслиЯ делаю это, тогда метод changeTypeTo не работает, потому что я должен изменить экземпляр подкласса на экземпляр другого подкласса.

Например, если у меня разные подклассы для разных типов, тоМне нужно изменить class A extends ConnectiveNode на class B extends ConnectiveNode, потому что переменная private Connective.Type type больше его не идентифицирует, даже если я изменю type на B и getType() вернет B, кто-то еще можетиспользуйте someVar instanceof A, чтобы проверить, является ли type A, что небезопасно.

Могу ли я узнать, как я должен спроектировать его так, чтобы я мог легко изменить его тип и не переполнять метод toCNF()?

Обновление
Я пишу служебную логическую формулу служебный инструмент, который может выполнять такие вещи, как преобразование формулы в конъюнктивную нормальную форму , я сохраняю свою формулу в деревеструктураТипы соединений в основном implies: ->, and: /\, iff: <-> и т. Д., Поэтому при преобразовании в CNF я сначала удаляю все соединительные элементы в виде стрелок, например подразумевает, что формула преобразования равна p -> q == ~p \/ q, поэтому мне нужноизмените Connective.Type с implies: -> на or: \/. В методе toCNF() я сначала вызывал eliminateArrows() для левого и правого узла, затем выполнял такие операции, как if my type is \/ and left node is literal then ..., что значительно больше if else if else, и затруднял поддержку и чтение. Поэтому мне нужен способ легко изменить его Connective.Type, не затопляя метод.

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