Используйте типы из вашей предметной области
(В оригинале - Prefer Domain-Specific Types to Primitive Types)
23-го сентября 1999 года орбитальный комплекс ценой в 327.6 миллиона долларов был потерян при выходе на орбиту Марса. Виной всему стала ошибка в программном обеспечении, позже получившая классификацию «перепутанная метрика». Наземная часть системы управления использовала британскую систему (где сила измерялась в фунтах силы), а компьютер аппарата – метрическую (в ньютонах), в результате мощность маневровых двигателей была занижена в 4.45 раза. (Подробнее об этом можно прочитать тут или более подробно и на английском тут)
Этот и множество других примеров ошибок могли бы быть предотвращены, если бы использовался более строгий механизм типов предметной области. Это также объясняет множество свойств языка Ада, одной из основных целей разработки которого была реализация встраиваемых систем высокой надежности (safety-critical). Язык Ада использует строгую типизацию с проверкой на этапе компиляции как встроенных типов, так и типов, определенных пользователем.
type Velocity_In_Knots is new Float range 0.0 .. 500.00;
type Distance_In_Nautical_Miles is new Float range 0.0 .. 3000.00;
Velocity: Velocity_In_Knots;
Distance: Distance_In_Nautical_Miles;
Some_Number: Float;
Some_Number:= Distance + Velocity; -- В этом месте компилятор выдаст ошибку типизации.
Разработка приложений в менее критичных областях тоже может воспользоваться этим преимуществом определяемых типов вместо использования встроенных вроде string или float. В Java, C++, Python и других языках абстрактный тип – это класс. Использование классов вроде Velocity_In_Knots
и Distance_In_Nautical_Miles
значительно повышает качество кода:
- код становится более читаемым, поскольку явно указываются значения из предметной области в отличие от «общих» типов Float или String;
- код становится более тестируемым;
- код способствует повторному использованию.
Такой подход одинаково хорошо подходит как для языков со статической типизацией, так и для языков с динамической. Единственная разница лишь в том, что при статической типизации разработчик получит подсказку сразу от компилятора, а при динамической для обнаружения подобных ошибок потребуется использовать юнит-тестирование.
Мораль – используйте типы из предметной области с целью разработки качественного программного обеспечения.
Автор оригинала - Einar Landre