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)