Ich unterrichte einen Einführungskurs in die Programmierung und wir verwenden Java. Ich möchte den Studenten helfen zu lernen, wie man eine schriftliche Klassenspezifikation in ein funktionierendes Programm umsetzt. Ich werde die schriftliche Spezifikation zur Verfügung stellen. Sie gibt den Namen der Klasse und das Verhalten in Form von Methodensignaturen an. Ich möchte, dass die Schüler diese in eine funktionierende Java-Klasse übersetzen.
Ich könnte ihnen eine Schnittstelle zur Verfügung stellen und sie die Schnittstelle implementieren lassen, aber das verfehlt einen Teil des Zwecks: das Lesen und Interpretieren eines schriftlichen Pflichtenhefts. Ich möchte, dass sie die Klasse von Grund auf neu schreiben. Dann möchte ich ihre Arbeit benoten.
Meine Idee zur Überprüfung ihrer Arbeit ist folgende: Kompilieren Sie ihre Java-Klassendatei gegen meine eigene Schnittstelle. Wenn sie kompiliert, weiß ich zumindest, dass sie alle Methodenverträge befolgt haben, und ich kann mit dem Testen der Funktionalität beginnen. Lässt sie sich nicht kompilieren, erhalte ich eine Fehlermeldung, die mir mitteilt, welche Methoden nicht korrekt implementiert wurden.
Wie kann ich erzwingen, dass eine Java-Klassendatei gegen eine Schnittstelle kompiliert wird, auch wenn im Quellcode ursprünglich keine angegeben war?
Mit anderen Worten: Ich habe die folgenden zwei Dateien:
FooInterface.java
public interface FooInterface
{
...
}
Foo.java
public class Foo
{
...
}
Ich möchte Foo so kompilieren, als ob es FooInterface explizit implementiert. Aber ich möchte nicht einen Haufen von Quellcode-Dateien manuell bearbeiten müssen, um dies zu tun. Wie kann ich das machen?
Editar
Um die Frage nach dem Wert einer schriftlichen Spezifikation im Vergleich zur Bereitstellung der Schnittstelle zu beantworten, soll hier ein hypothetisches Spezifikationsdokument dargestellt werden:
Schreiben Sie eine Klasse namens Foo mit den folgenden Methoden:
älteste : ages (int[]) -> int
Gibt in einem Array von Altersangaben die höchste zurück.anyAdults : ages (int[]) -> boolean
Gibt ein Array von Altersangaben zurück, ob einer von ihnen 18 oder älter ist.
IMO hat dies einen großen pädagogischen Nutzen. Die Schüler müssen kritisch beurteilen, ob ihr Programm die Spezifikationen einhält. Wenn ich die Schnittstellendatei zur Verfügung stellen würde, könnten sie ihr Gehirn ausschalten und sich einfach vom Compiler sagen lassen, ob sie die Spezifikation befolgt haben oder nicht. Die Verwendung des Compilers als kognitive Krücke ist die gleiche Technik, die die schlechteren Schüler derzeit (erfolglos) anwenden, um ihre Klammern auszugleichen.
3 Stimmen
+1 Guter Kurs. Sie sind ein guter Lehrer.
3 Stimmen
Wenn Sie Ihren Schülern genau Methodensignaturen als Teil der Spezifikation zu verwenden, wie unterscheidet sich das davon, ihnen eine echte Schnittstelle zu geben? Und wenn Sie nur die Klasse beschreiben, wird Ihr Ansatz wahrscheinlich in vielen Fällen scheitern, weil die tatsächlichen Signaturen, die Sie und Ihre Schüler entwickeln, sich geringfügig unterscheiden können.
0 Stimmen
@ChssPly76 - Da bin ich anderer Meinung. Wenn der Auftraggeber sorgfältig vorgeht, kann die Signatur der Methode genau beschrieben werden, und die Schüler sollten in der Lage sein, sie leicht auszuführen, vorausgesetzt, sie sind sorgfältig. Es gibt noch einen weiteren Aspekt: Ein Teil des Lernens beinhaltet das Lesen und Interpretieren der Dokumentation, selbst angesichts einer unvollständigen Spezifikation oder eines Fehlers des Lehrers. Etwas selbst angesichts solcher Herausforderungen zu bauen, sollte imho gefördert werden.
2 Stimmen
@weiji - Nein, das kann es nicht. Methode Unterschrift kann sein bereitgestellt oder Methode Funktionalität können sein beschrieben - darfst du dir einen aussuchen. Das erste Szenario kann automatisch validiert werden, aber ich würde argumentieren, dass die Schnittstelle in diesem Fall im Voraus bereitgestellt werden sollte; das zweite Szenario kann nicht zuverlässig automatisch validiert. Bitte beachten Sie, dass ich nichts gegen diese Übung an sich habe - sie ist in der Tat ein ausgezeichnetes Projekt für Studenten; ich kommentiere nur die Umsetzung.
0 Stimmen
@ChssPly76 - Ich denke, Sie sollten den OP im Zweifelsfall gewähren, denn Sie wissen nicht, wie er es den Schülern präsentieren wird. Ich denke, dass es möglich ist, denn ich habe tatsächlich eine Erfahrung mit dem Schreiben einer Klassenspezifikation für Anfänger gemacht. Zum Beispiel: "Diese Klasse soll FooBar heißen und eine Methode namens setName haben, die einen String-Parameter annimmt und keinen Wert zurückgibt". Es ist wie bei diesen "Sag das mit deinen eigenen Worten"-Übungen. Man muss sich in die Lage des Auftraggebers versetzen: Er will ihnen nicht etwas geben, das sie ausschneiden und einfügen können.
0 Stimmen
@Barry Brown: Jetzt, mit deiner Bearbeitung, macht es Sinn. Sonst wäre es zu kompliziert. Ihre Spezifikation ist nicht zweideutig, so dass der Name der Methode abgeleitet werden kann. Ich habe meine Antwort aktualisiert, um sie besser an Ihre letzte Änderung anzupassen.
1 Stimmen
@weiji - Ich weiß, wie OP es darstellen wird, weil er seiner Frage Beispiele hinzugefügt hat. Und ich kann das Argument "sich nicht auf den Compiler als Krücke zu verlassen" durchaus verstehen, obwohl ich aus meiner Erfahrung heraus wetten würde, dass er selbst mit dieser Art von Spezifikation mindestens die folgenden Informationen zurückbekommen wird algunos Klassen, die
Oldest
,getOldest
und andere Permutationen. Oscars Vorschlag, die Reflexion zu verwenden, um die Muster anstelle des genauen Namens ist daher immer noch das Beste.0 Stimmen
Ich werde diesen Sommer daran arbeiten und sehen, was ich herausfinde. Dann werde ich die beste Lösung akzeptieren :)