Lösung zu Übung 7 „ Implementierung“ - IAS
Transcription
Lösung zu Übung 7 „ Implementierung“ - IAS
Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich Lösung zu Übung 7 „ Implementierung“ Aufgabe 7.1 Verbalisierung Messreihe1, Messreihe2, AnzahlZeichen Praemie = Grundpraemie2 + Zulage1 * Dienstjahre const float Grundpraemie2 = 50.0; const float Zulage 1 = 10.0; Praemie = Grundpramie2 + Zulage1 * Dienstjahre Lagermenge = Lagermenge + 1; Aufgabe 7.2 Kommentare Kommentare in Modulen In den Modulkommentaren sollen nur solche Angaben gemacht werden, die auch in verschiedenen Versionen gleich bleiben: Projekt, Datei, Autor, Kurzbeschreibung und Copyright. Somit ist jede Übersetzungseinheit (Quellcodedatei, Header-Datei) wie im folgenden Beispiel zu dokumentieren: /* *************************************************************************** * * Project name : FaSu * * Filename : fl.c * * Author : J. Examplename, IAS * * ---------------------------------------------------------------------------* * Descritpion: * * Type and function definitions for the use of flank protection and * flank protection search * * ---------------------------------------------------------------------------*/ Für weitere Kommentare, insbesondere für die Versionsverwaltung, soltte eine externe Textdatei „Version.txt“, angelegt werden, die projektweit Gültigkeit hat. Vorlage: =============================================================================== VERSION-HISTORY Projekt : ... Stand : <dd.mm.yyyy> Softwaretechnik I Übung 7: Implementierung 2 ------------------------------------------------------------------------------Entwicklungswerkzeug(e) : ... Tabulator-Groesse : <4 | 8 | Soft-Tabs> =============================================================================== Version Datum Bearbeiter Kurzbeschreibung ------------------------------------------------------------------------------V?.?? <dd.mm.yyyy> <Nachname> ... STATUS : <in Bearbeitung | vorgelegt | akzeptiert (<Namenszeichen>)> Änderungen: - <Änderung 1> - ... Erkenntnisse: - <Erkenntnis 1> - ... ------------------------------------------------------------------------------V1.00 <dd.mm.yyyy> <Nachname> Neuimplementierung STATUS : <in Bearbeitung | vorgelegt | akzeptiert (<Namenszeichen>)> =EOF=========================================================================== Für das Hochzählen der Versionsnummern gilt folgende Konvention: Bug-Fixes Vorgängerversion += 0.01 Kleine funktionale Änderung Vorgängerversion += 0.10 Große funktionale Änderung Vorgängerversion += 1.00 Die älteren Versionen sollen unten in der Datei stehen, weil die zuletzt vorgenommenen Änderungen häufiger eingesehen werden. Musterbeispiel: =============================================================================== VERSION-HISTORY Projekt : IAS-Kart SteerByWire (ViPER) Stand : 11.08.1999 ------------------------------------------------------------------------------Entwicklungswerkzeug(e) : MS Access 97, ConsoleMaker V1.11, Esterel V5.21 (Win32), Tasking C/C++ for C166_ST10 v6.0 r1 Tabulator-Groesse : 4 =============================================================================== Version Datum Bearbeiter Kurzbeschreibung ------------------------------------------------------------------------------V?.?? <dd.mm.yyyy> <Nachname> ... STATUS : <in Bearbeitung | vorgelegt | akzeptiert (<Namenszeichen>)> Änderungen: - <Änderung 1> - ... Erkenntnisse: - <Erkenntnis 1> - ... ------------------------------------------------------------------------------V2.00 19.08.1999 Eberle Perfektionierung STATUS : akzeptiert (Gu, Eb) Änderungen: - ... Erkenntnisse: - ... ------------------------------------------------------------------------------V1.00 11.08.1999 Gunzert, Eberle Erstmalig voll lauffähig STATUS : akzeptiert (Gu, Eb) Änderungen: - Ausbau zur vollständigen SteerByWire-Applikation für IAS-Kart - Steer auf SRU5, Servo auf SRU3 - erste lauffähige SteerByWire-Appli, die generiert wurde!!! Softwaretechnik I Übung 7: Implementierung 3 Erkenntnisse: - mit Option -Lc:-ansi kann der Esterel V5.10 (UNIX) Compiler doch dazu bewegt werden, für die extern-Deklarationen der importierten Funktionen eine Parameterliste zu generieren =EOF=========================================================================== Kommentare in Funktionen, Prozeduren sowie Methoden Jede Definition und Implementierung einer Funktion (bzw. Klasse, Prozedur oder Methode) ist wie folgt zu dokumentieren: /* ************************************************************************* * Function: <Kurze Funktionsbeschreibung> * Return value: <Beschreibung> * * Comments: * - <Zusätzliche Details; behandelte Fehler; Besonderheiten> * - <...> */ <Funktionstyp> <Funktionsname> (<Parametertype> <Parametername> /*<Beschreibung des Parameters> */ ,<...> ) { .... .... } Beispiel: /* ************************************************************************* * Function: Acquires flank protection beginning with tfe_prev and tfe_akt. * Return value: none * * Comments: * - At the moment no flank protection is wanted. The function is * intended for alternative flank protection. * This would be suitable for switches and kswitches, then, if necessary, * FL conflicts during simultaneous searches of possible routes could be * avoided. * */ EXTERN void fl_fl_search (struct sTrackFieldElement *tfe_prev /*(in): preceding track field element */ , struct sTrackFieldElement *tfe_akt /*(in): current TFE */ , List fl_list /*(in): flank protection list for an TFE */ , List fl /*(in): Flank protection for RFE (current FL list with flank protection elem.) */ , int length /*(in): current length of the FL */ ) { ... ... } Softwaretechnik I Übung 7: Implementierung Aufgabe 7.3 Anrufbeantworter a) Muster Doppelt verkettete Liste für die Nachrichtenspeicherung: interface SoundSource { Sound getSound(); } class Message implements SoundSource { Message previousMessage; Message nextMessage; Sound message; void record(SoundSource source){ message = source.getSound(); } void save(){ //save message in file } Sound getSound(){ return message; } } class SoundStorage { Announcement announcement; Message firstMessage; Message lastMessage; int messageCounter; Message appendMessage(){ Message message = new Message(); if(messageCounter == 0){ firstMessage = message; lastMessage = message } else{ lastMessage.setNext(message); newMessage.setPrevious(lastMessage); lastMessage = message; } messageCounter++; return message; } } 4 Softwaretechnik I Übung 7: Implementierung 5 Zustandsautomat für die Betriebszustände des Anrufbeantworters: class AMCore { State answeringMachineState = new IdleState(); void setState(State newState){ answeringMachineState.exit(); answeringMachineState = newState; answeringMachineState.entry(); answeringMachineState.doWork(); } } abstract class State { void entry(){ // NOP } // may be implemented by subclass abstract void doWork(); // must be implemented by subclass void exit(){ // NOP } // may be implemented by subclass } class IdleState extends State { void doWork(){ // NOP } } class AnnounceState extends State { void doWork(){ speaker.play(soundStorage.getAnnouncement()) aMCore.setState(new RecordMessageState()) } } Softwaretechnik I Übung 7: Implementierung class RecordMessageState extends State { Message message; void entry(){ message = storage.appendNewMessage(); } void doWork(){ message.record(phoneLine); aMCore.setState(new IdleState()) } void exit(){ message.save(); } } class PlayMessagesState extends State { void doWork(){ Message msg = storage.getFirstMessage(); while(msg != null) { speaker.play(msg); msg = msg.getNextMessage(); } aMCore.setState(new IdleState()) } } 6 Softwaretechnik I Übung 7: Implementierung 7 Beobachter für die Telefonleitung: interface PhoneLineListener { void incomingCall(int type); // type: 0=AM; 1=Fax, 2=Phone } class AMCore implements PhoneLineListener { AMCore(){ phoneLine.addPhoneLineListener(this) } void incomingCall(int type){ if(type == 0) setState(new AnnounceState()); } } class PhoneLine { PhoneLineListener[] listeners; void addPhoneLineListener(PhoneLineListener listener){ // add listener to listeners } void receiveCall(int type){ // type: 0=AM; 1=Fax, 2=Phone // for all listeners invoke listener.incomingCall(type) } } b) Implementierung siehe Implementierungsbeispiel „Anrufbeantworter“ (Eclipse-Projekt)