Вернуть нужную ошибку во время валидации данных

Рейтинг: 0Ответов: 1Опубликовано: 12.05.2023
class DataChecker{
    public:
        int check(data){
            return checkData(data);
        }
    private:
        int checkData(data){
            int res = 0;
            res = checkDataForFulFillment(data);
            if(res){return res;}
            res = validateData(data);
            if(res){return res;}
            res = checkDataForSize(data);
            if(res){return res;}

        }
        checkDataForFulFillment(data){
            if(bad){
                return 1;
            }
            return 0;
        }
        validateData(data){
            if(bad1){
                return 2;
            }
            if(bad2){
                return 3;
            }
            return 0;
        }
        checkDataForSize(data){
            if(bad){
                return 4;
            }
            return 0;
        }
};

Пусть имеем датаЧекер, который должен проверять данные и выплюнуть ошибку наверх в случае чего. Меня смущает метод checkData, который после каждой проверки должен проверить результат и выплюнуть самую актуальную ошибку. Кажется, тут было бы верно полиморфизмом каждую проверку затащить и хранить внутри каждой сущности результат, а потом первый найденный результат отдать наверх. Так и в цикле можно будет вызывать все проверки, а не руками, и как - будто лучше архитектурно. Что-то вот затрудняюсь в приянтии решения. Помогите разобраться

PS: код примерный, в жизни checkDataForFulFillment, validateData и все подобные это отдельные классы и проверяют они на какие-то особые свойства из предметной области. Все return возвращают enum. Ну и реализация методов не лежит в объяявлении класса :D

Ответы

▲ 0

По сути ты прав. Обычно делают интерфейс а-ля IValidator, который условно имеет метод validate. В самом классе DataChecker у тебя просто массив валидаторов, причем ты можешь даже где-нибудь в конфиге по умному настраивать порядок валидации, например, у тебя данные должны быть подписаны, если они не подписаны нет смысла их дальше проверять. Крч добавляешь интерфейс IValidator, у него метод validate, а какие-то хитрые параметры передаешь через конструктор.