假设我有世界上最愚蠢的环形缓冲区。
size: constant := 16;
subtype T is integer;
package RingBuffer is
procedure Push(value: T);
function Pop return T;
end;
package body RingBuffer is
buffer: array(0..size) of T;
readptr: integer := 0;
writeptr: integer := 1;
procedure Push(value: T) begin
buffer(writeptr) := value;
writeptr := (writeptr + 1) mod size;
end;
function Pop return T
begin
readptr := (readptr + 1) mod size;
return buffer(readptr);
end;
end;
因为我的代码很烂,所以我想添加前置条件和后置条件,以确保我不会滥用它。所以我改变Push的实现如下:
procedure Push(value: T) with
pre => readptr /= writeptr
is begin
buffer(writeptr) := value;
writeptr := (writeptr + 1) mod size;
end;
但是,我得到一个编译错误,因为我需要将方面定义放在过程的声明中,而不是在实现中。
问题是,这是一个包裹。我的声明是公开的。前提条件所依赖的值属于包体,它对声明不可见。为了将方面定义放在声明中,我将不得不重构我的代码以将实现细节公开到包的公共部分(在本例中为readptr
和writeptr
)。我不想那样做。
我可以想出几种方法来解决这个问题,例如让我的Push()
调用实现PushImpl()
仅在实际上具有前提条件的主体中定义的私有过程......但这太可怕了。这样做的正确方法是什么?