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

  • Фиг переведешь :)

    Пересматривая с детками Ледниковый период, включаю английские субтитры. Иногда удается заметить в оригинале игру слов, безвозвратно потерявшуюся при…

  • О сопровождении...

    Вот! Я давно это чувствовал интуитивно, а тут вот эксперт популярно объяснил, почему писать легко сопровождаемый код настолько важно.

  • Гуглокнопка и Фейсбукнопка

    Добавил к себе на сайт - надо же следовать тенденциям :) Теперь, если статья понравилась, есть куда нажимать :) Посмотрим на результат. А вообще…

  • 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