m.fuchs hat geschrieben:Klingt nach schlechter Architektur, fehlender Kapselung und ungenügenden Unittests.
Ich hatte mich damals um das design der Datenstruktur sowie das laden und speichern zu kümmern. Der Pascal Anfänger war dann mit den Auswertungsalgorithmen für diese Datenstruktur zu tun. Wir hatten also eine strikte kapselung zwischen IO und Verarbeitung, sowie uns an alle OOP Standards gehalten. Um genau zu sein hat diese kapselung zwischen IO und Verarbeitung dafür gesorgt das ich den Bug zunächst im IO code gesucht hab, wodurch es sogar länger gedauert hat.
Und zu Unittests, was denkst du wie wir den Bug überhaupt gefunden haben? Ohne gute test Suites hat man praktisch keine Chance so einen Fehler überhaupt zu entdecken. (Denn Arr[0] schluckt der Computer einfach selbst wenn der Array erst bei 1 anfängt).
Um dir mal zu zeigen wie einfach es ist einen Fehler zu machen:
Sagen wir wir haben eine Unit SomeTestUnit mit einer Globalen Variable SomeVal:
Code: Alles auswählen
Unit SomeTestUnit;
interface
var SomeVal: Integer;
implementation
end.
Dann gibt dieser Code auf meinem Mac (fpc 3.0.4, OSX 10.13.1
High Sierra) -1 zurück:
Code: Alles auswählen
program test;
uses
SomeTestUnit;
var
arr: array[20..50] of Integer;
i: Integer;
begin
for i:=0 to Length(arr)-1 do arr[i] := -1;
WriteLn(SomeVal);
end.
Da nützt kapselung, Gute Architektur und Unit test gar nix, denn ich habe grade eine Globale Variable einen Wert zugewiesen in dem Programm ohne einen einen expliziten Schreibzugriff auf SomeVal. Und das komplett ohne Fehlermeldung o.ä. Für mich als user sieht es so aus als wäre das program ohne Fehler durchgelaufen.
Um das ganze mal auf die Spitze zu treiben, sagen wir mal du hast eine Globale variable einen Zeiger auf einem Config record, der alle Einstellungen wie Formgröße, Position, etc von deinem Programm speichert.
Jetzt hast du bei der Programmnutzung irgendwo eine stelle die genau den Fehler macht den ich oben gepostet habe, welcher den Pointer auf die Config überschreibt. Beim versuch die Config zu schreiben versucht das Programm dann den neuen ungültigen Pointer zu dereferenzieren, und sagen wir mal wir sind im Worst case, und keine SegFault fliegt dir um die Ohren. Stattdessen wird nur Müll gelesen und in die Config geschrieben. Beim nächsten lesen der config ist plötzlich alles falsch. Dein Fenster ist nicht mehr sichtbar, und beim Debuggen findest du heraus das einfach die Left und Top Koordinaten außerhalb des Bildschirms liegen.
Wo suchst du den Fehler? Im Config Load? im Config Write? in einer von hunderten For schleifen irgendwo zwischen 5000 Zeilen code, welche zufällig durch die Test suite nicht abgedeckt wurde, denn niemand glaubt man könnte eine simple füll mit Wert schleife über einem array verkacken (und test Suites sind nie allumfangend und testen oftmals solche Kleinigkeiten nicht)?
Das ist eine ganz gefährliche Fehlerquelle, die eigentlich bereits schon vom Sprachdesign selbst ausgeschlossen werden könnte. mMn. Ist das von der Fehleranfälligkeit auf dem selben Niveau wie C string Arithmetik