Здравствуйте, Mamut, Вы писали:
M>Так. Мой код будет перерастать во что-то сложное, а твой не будет? Можно это продемонстрировать? Да, я лично не вижу, как это экстраполируется
Ты не понял мою мысль. Вот смотри, у меня сейчас есть пример для простейшей бизнес-логики. Дальше, берём относительно сложный случай (твой шаг3 скажем) и берём твой сложный код "в лоб" для этого случая. Так вот нам понадобится просто вставить этот твой сложный код прямо в определённую точку моего простого примера. Понятная идея? ) Т.е. грубо говоря при усложнение задачи объём дополнительного кода (возникающего ради статического отлова ошибок) не будет возрастать (относительного моего примера).
M>Ну, я имею в виду, что в твоем примере все равно все упирается в то, расставил ли кто-нибудь static_assert'ы по коду. Если по коду есть хотя бы минимальное тестирование (а логику проверять надо), то их полезность по сравнению с динамической типизацией падает экспоненциально. И как показывает твой пример, нам все равно надо отлавливать рантайм-ошибки в зависимости от того, как эти ассерты расставлены. В итоге ответсвенность за логику размыта и стало сложнее проследить, а не забыли ли мы что-либо и правильно ли мы реализовали логику.
Ты похоже тут уже пытаешься решить совсем другую задачу. Не перенос проверок ошибок из времени исполнения во время компиляции, а некую попытку статической проверки полноты проверок времени исполнения. О таком в принципе тоже можно подумать... Но я не уверен, что даже теоретически возможно какое-то полноценное решение, т.к. при любой типизации и вообще архитектуре всё равно будет некая точка для задания набора "правил" нашей логики. И если забыть задать их там, то по идее никто не способен отловить этот факт. Максимум, что могут наши современные средства, это свести введение правил до действительно одной точки, с автоматическим расползанием их по всему коду. И как раз в таком статическая типизация очень помогает.
_>>Что касается количества проверок... Ты про что, про размер исходника или про нагрузку процессора в рантайме? )
M>Нет. Я имел в виду, что вижу по два if'а (грубо говоря) на каждую функцию
Ну в исполняемый файл в итоге попадает или один или ноль if'ов. А в исходнике да, разрастаемся... )))
_>>Вообще то как раз существует и даже прямо в твоём случае. Например при создание нового ордера мы можем точно указать его тип и т.д.
M>Теоретики такие теоретики. Новый заказ создается из 100% рантайм-данных. И, соотвественно, наделяется всеми свойствами исключительно в рантайме.
Ничего подобного. В коде ты легко можешь создать пустой экземпляр ордера (и у него уже не будет тип Unknown, а будет скажем IncreaseDecrease), а потом заполнить его своими рантайм данными с помощью тех же самых функций перевода состояния. И при этом будут автоматически производиться все проверки.