Objektorientierte Programmiertechniken
LVA 185.A01, VU, 3 Ects, 2012/2013 W
| Ausgabe: | 24.10.2012 |
| reguläre Abgabe: | 31.10.2012, 12:00 Uhr |
| nachträgliche Abgabe: | 07.11.2012, 12:00 Uhr |
Vergewissern Sie sich, dass Clients nur das voraussetzen, was Server durch Zusicherungen versprechen, und Server nur das, was Clients versprechen, also alle Verträge in Ihrer Software eingehalten werden. Prüfen Sie nach, ob Zusicherungen überall dort, wo Sie eine Vererbungsbeziehung haben (durch extends oder implements), die Bedingungen für die Ersetzbarkeit erfüllen. Falls Sie Inkonsistenzen bemerken, die sich durch andere Formulierungen der Zusicherungen nicht einfach beheben lassen – das heißt, Sie haben inhaltliche Fehler entdeckt –, beschreiben Sie die Inkonsistenzen durch spezielle Kommentare, die mit FEHLER: oder ERROR: beginnen. Versuchen Sie, in wenigen Worten mögliche Ursachen sowie nötige Programmänderungen zur Fehlerkorrektur zu beschreiben. Lassen Sie den Programmcode selbst (abgesehen von Kommentaren) unverändert.
Finden Sie Stellen in Ihrem Programm, an denen
Finden Sie Stellen in Ihrem Programm, an denen der Klassenzusammenhalt oder die Objektkopplung besonders schlecht sind oder durch Verzicht auf dynamisches Binden der Code größer oder unübersichtlicher wurde. Schreiben Sie an jede dieser Stellen einen Kommentar, der mit SCHLECHT: oder BAD: beginnt, und beschreiben Sie kurz, warum Sie diese Stelle gewählt haben. Beschreiben Sie auch kurz, wie diese Schwachstelle Ihrer Meinung nach zustandegekommen ist und wie eine bessere Lösung aussehen könnte. Falls Sie nicht mindestens fünf solche Stellen finden, schreiben Sie an den Anfang der Datei Test.java einen Kommentar, in dem Sie wahrscheinliche Gründe dafür nennen.
Obwohl nicht ausdrücklich verlangt, empfiehlt es sich, bei jeder Zusicherung zu vermerken, um welche Art von Zusicherung es sich handelt. Das kann Vorteile bei der Überprüfung der Zusicherungen bringen.
Es kann passieren, dass ein Client vom Server etwas anderes erwartet, als dieser bietet, oder umgekehrt. Das ist ein Fehler im Programm, der entweder sofort oder erst nach späteren (dem Vertrag entsprechenden) Programmänderungen zu falschen Ergebnissen führt. Versuchen Sie nicht, solche Fehler durch Tricks in den Verträgen zu beseitigen. Oft ist es tatsächlich möglich, durch komplizierte Formulierungen die Zusicherungen so hinzubiegen, dass das Programm noch korrekt erscheint. Das geht aber fast immer nur auf Kosten der Brauchbarkeit und Wartbarkeit der Software, weil im Vertrag für den Endanwender sinnlose Details und Eigenschaften festgeschrieben werden. Schreiben Sie lieber mit FEHLER: oder ERROR: beginnende Kommentare statt über Tricks Verträge zurechtzubiegen. Solche Kommentare haben garantiert keine Auswirkungen auf Ihre Beurteilung, können Ihnen aber helfen, für Sie typische Fehler, die Sie unter Zeitdruck sicherlich machen, besser zu verstehen.
Es ist empfehlenswert, dass Zusicherungen von der Person geschrieben werden, die auch den entsprechenden Programmcode (aus Sicht des Servers) geschrieben und die entsprechenden Überlegungen vielleicht noch im Kopf hat. Fehler werden aber eher von anderen Personen erkannt, die den Code aus der Sicht eines Clients betrachten. Am wahrscheinlichsten sind Fehler an Schnittstellen, an denen der Code eines Servers und eines Clients von verschiedenen Personen stammt. Diese Stellen sind besonders sorgfältig zu überprüfen.
Auch in Untertypbeziehungen treten häufig Fehler bei den Zusicherungen auf. Vergewissern Sie sich, dass im Untertyp Vorbedingungen nur schwächer und Nachbedingungen sowie Invarianten stärker sein dürfen als im Obertyp und auch History-Constraints ähnliche, aber anders forumlierte Bedingungen erfüllen müssen. Entsprechende Fehler sind ebenso mit FEHLER: oder ERROR: zu kennzeichnen.
Durch Zusicherungen festgelegte Verträge sind ein wichtiges Qualitätsmerkmal, das dabei hilft, die Korrektheit bei Ersetzung einzelner Programmteile zu erhalten. Weitere Qualitätsmerkmale können bei der Wartung auch hilfreich sein. Markieren Sie daher alle Stellen, die Ihnen während der Suche nach passenden Verträgen als besonders gut oder schlecht auffallen, durch mit GUT: oder SCHLECHT: bzw. GOOD: oder BAD: beginnende Kommentare.
Falls Ihre Lösung der zweiten Aufgabe noch so unvollständig ist, dass Sie es nicht für sinnvoll erachten, die Lösung der dritten Aufgabe darauf aufzubauen, setzen Sie sich bitte mit Ihrer Tutorin oder Ihrem Tutor in Kontakt und befolgen Sie die von ihr oder ihm gegebenen Anweisungen. Im Zweifelsfall lösen Sie die Aufgabe so wie oben beschrieben.
Das Schreiben und Überprüfen von Zusicherungen, die Berücksichtigung von Zusicherungen in Untertypbeziehungen, sowie die Abschätzung von Klassenzusammenhalt und Objektkopplung sind wichtige Lehrziele, die in dieser Aufgabe geübt werden. Ein wichtiger Aspekt dabei ist die Eigenständigkeit: Sie sollen Verträge in der Software aufgrund eigener Überlegungen entwickeln (jenen Überlegungen, die Sie im Idealfall bereits beim Schreiben des Programmcodes angestellt haben) statt anhand von Vorgaben oder Beispielsammlungen. Das ist zwar ein schwieriger Weg, aber einer, der Ihnen hilft, auch in außergewöhnlichen Situationen zurechtzukommen.