avl (avl) wrote,
avl
avl

Categories:

65. Используйте типы из вашей предметной области

(В оригинале - 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

Перевод мой, при использовании ссылка на мой живой журнал обязательна!
Tags: 97_things_programmer_should_know
Subscribe

  • Тест на способность доводить до конца пройден!

    Сегодня закончил переводить серию "97 вещей для программиста"! Вот здесь - три последних перевода: 95. Пишите тесты для людей - еще одна статья о…

  • Еще три перевода

    92. Когда программисты и тестеры объединяются - о том, что объединяться для общей цели всегда выгодно. 93. Пишите код так, как будто вы будете…

  • Еще четыре перевода

    88. Юникс-утилиты - это ваши друзья - название говорит само за себя :) 89. Используйте правильные алгоритмы и структуры данных - интересная и…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments