Основы объектно-ориентированного проектирования


Законные побочные эффекты: пример - часть 3


Нам также нужны процедуры создания - make_cartesian и make_polar:

make_cartesian (a, b: REAL) is -- Инициализация: abscissa a, ordinate b do private_x := a; private_y := b cartesian_ready := True; polar_ready := False ensure cartesian_ready; not polar_ready end

и симметрично для make_polar.

Экспортируемые операции пишутся просто, начнем, например, с процедуры, имеющей варианты в зависимости от операции:

add (other: COMPLEX) is -- Добавляет значение other do prepare_cartesian; polar_ready := False private_x := x + other.x; private_y = y + other.y ensure x = old x + other.x; y = old y + other.y cartesian_ready; not polar_ready end

Заметьте, в постусловии важно использовать x и y, а не private_x и private_y, которые могут не быть текущими перед вызовом.

divide (z: COMPLEX) is -- Divide by z. require z.rho /= 0 -- Численное выражение дает более реалистичное предусловие do prepare_polar; cartesian_ready := False private_rho := rho / other.rho private_theta = (theta - other.theta) \\ Two_pi -- \\ - остаток от деления ensure rho = old rho / other.rho theta = (old theta - other.theta) \\ Two_pi polar_ready; not cartesian_ready end

Аналогично для вычитания и умножения - subtract и multiply. (Предусловие и постусловие могут быть слегка адаптированы для учета особенностей операций с плавающей точкой.) Варианты функций следуют тому же образцу:

infix "+" (other: COMPLEX): COMPLEX is -- Сумма текущего числа и other do create Result.make_cartesian (x + other.x, y + other.y) ensure Result.x = x + other.x; Result.y = y + other.y Result.cartesian_ready end infix "/" (z: COMPLEX): COMPLEX is -- Частное от деления текущего комплексного числа на z require z.rho /= 0 do create Result.make_polar (rho / other.rho, (theta - other.theta) \\ Two_pi) ensure Result.rho = rho / other.rho Result.theta = (old theta - other.theta) \\ Two_pi Result.polar_ready end

Аналогично для infix "-" и infix "**".

Обратите внимание на последние предложения в постусловиях этих функций - cartesian_ready и polar_ready должны экспортироваться самому классу, появляясь в предложениях в форме feature {COMPLEX}; они не экспортируются никакому другому классу.

<


Начало  Назад  Вперед



Книжный магазин