Хороший способ убедиться, что результирующее значение любого вычисления (конечного или промежуточного) удовлетворяет определенным ограничениям, - это использовать объектно-ориентированный язык программирования, такой как C ++, и определять типы данных, которые внутренне реализуют проверяемые вами условия за. Затем вы можете использовать эти типы данных в качестве возвращаемого значения любого вычисления, чтобы обеспечить выполнение указанных условий для возвращаемого значения.
Давайте посмотрим на простой пример. Предположим, что у вас есть функция-член внутри класса «Самолет» как часть системы управления полетом, которая оценивает массу экземпляра самолета как функцию количества пассажиров и количества топлива, которое самолет имеет в тот момент. Один из способов объявления класса Airplane и функции-члена flightMass () заключается в следующем:
class Airplane {
public:
...
int airplaneMass() const; // note the plain int return type
...
private:
...
};
Однако, лучший способ реализовать вышеизложенное - это определить тип AirplaneMass , который можно использовать в качестве типа возврата функции вместо int . AirplaneMass может внутренне гарантировать (в своем конструкторе и любых перегруженных операторах), что значение, которое он инкапсулирует, удовлетворяет определенным ограничениям. Примером реализации типа данных AirplaneMass может быть следующий:
class AirplaneMass {
public:
// AirplaneMass constructor
AirplaneMass(int m) {
if (m < MIN || m > MAX) {
// throw exception or log constraint violation
}
// if the value of m meets the constraints,
// assign it to the internal value.
mass_ = m;
}
...
/* range checking should also be done in the implementation
of overloaded operators. For instance, you may want to
make sure that the resultant of the ++ operation for
any instance of AirplaneMass also lies within the
specified constraints. */
private:
int mass_;
};
После этого вы можете переопределить класс Airplane и его функцию-член flightMass () следующим образом:
class Airplane {
public:
...
AirplaneMass airplaneMass() const;
// note the more specific AirplaneMass return type
...
private:
...
};
Вышеуказанное будет гарантировать, что значение, возвращаемое аэропланом (), находится между МИН и МАКС. В противном случае будет сгенерировано исключение или зарегистрировано состояние ошибки.