Der Zweck von Assertions liegt in der Zusicherung von Zuständen. Also zB so triviale Dinge wie
Delphi-Quellcode:
function Uppercase(const AString: string): string;
begin
//do some logic here
Assert(Length(Result)=Length(AString), 'Length of Result differs from input');
Assert(IsEveryCharACapital(Result), 'Not every char of Result is a capital');
end;
(Postconditions) bzw beim Testen von PreConditions
Delphi-Quellcode:
procedure FillRect(const ACanvas: TCanvas; const APoint: TPoint;
const AnotherPoint: TPoint);
begin
Assert(Assigned(ACanvas), 'Canvas cannot be nil');
Assert((APoint.X<AnotherPoint.X) and (APoint.Y<=AnotherPoint.Y),
'First Point must be "smaller" than second');
//do some logic here
end;
Interessant ist dieses Konstrukt zur "Dokumentation" und Zusicherung von Zwischenständen, damit Dritte schneller erkennen und sicherstellen können, dass die Fehlerquelle nicht in fremdem Code zu suchen ist, weil sonst die Assertions "angeschlagen" hätten:
Delphi-Quellcode:
// doing foo now
SomeComplicatedLogig(WithAComplexFormular,
AndSomeMoreParams);
Assert(EnsureFooWasDone, 'Foo was not done');
// doing bar now
AndAgainSome;
VeryObfuscatedCode;
AndEvenMoreCodeThatIsNotObvious;
Assert(EnsureBarWasDone, 'Bar was not done');
Dinge, die die Programmlogik beeinflussen sollten nicht als Assertions formuliert werden und auch im zweiten skizzierten Fall ist es fragwürdig, ob
ACanvas nicht lieber mit einer
Exception "gesichert" werden sollte... Aber hier gibt es unterschiedliche Meinungen...