DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung Inhalt • Aufbau des Source Codes – Dokumentation des Source Codes (Layout) – Qualitätskriterien berücksichtigen: • Verständlichkeit Namenskonventionen • Wartbarkeit: Programmierrichtlinien für erlaubte Konstrukte, Schachtelungstiefe, … • Erwartungskonformität bei der Benutzerschnittstelle • …… • • Verwaltung des Source Codes – Konfigurationsmanagement (KM) – Einsatz eines KM-Systems – Bekanntestes KM-Werkzeug (open source) ist CVS (Concurrent Versions System) Anhang: Beispiele für schlechten Programmierstil Datei: ProgrammierungVorlesung.ppt Seite 1 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung Source Code Dokumentation Kommentare und Header: • • • • • comments shall not contain pseudocode or algorithm description, the code itself explains this! Standard header comment section (first item in the declarations section) for modules and classes (and forms): – file name, copyright notice, creation date, original developer, brief description – record of changes in the maintenance phase: name of the person making the change, date of the change, brief description of the change Standard header comment section (first item in the declarations section) for procedures, methods, interfaces and templates: – brief description of the procedure, description of each parameter & any return value – record of changes in the maintenance phase (see above) Variable should have a comment on the same line as the variable declaration (all line up in the same column). If the comment is long, it should be placed on the preceding line Inline comments appear above the code of the program block that they describe proceeded by one blank line Seite 2 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung Source Code Dokumentation Beispiele für einen Header und für die notwendigen Variablen-Kommentare in C: /*********************************************************************** ** NAME bsp9.c ** TITEL ** Speicherreservierung und -freigabe ** KURZBESCHREIBUNG ** Es werden ueber Bildschirm Textzeilen eingelesen und in einem ** zusammenhaengenden Speicherbereich gesichert. ... ** PARAMETER ** -x : Ausgabe in umgekehrter Reihenfolge ** -n : Ausgabe mit Zeilennummern ** HINWEIS: Kompiliert mit VisualC++ V5.0 ** VERSIONSFUEHRUNG ** V3.0 ERSTELLT: 7.04.1998 AUTOR: Riewerts ***********************************************************************/ char char int int *zeil_vektor[MAXZEILEN]; /* /* *zeiger; /* richtig=1; /* zeil_zahl=0; /* Vektor fuer die Anfangsadressen jeder Zeile Zeiger auf die Parameter wenn Parameterangabe ok wenn keine Zeilen eingegeben */ */ */ */ */ Seite 3 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung Source Code Dokumentation Beispiel für einen Header in Visual Basic: • Die Versionsverwaltung wird dabei von dem Konfigurationsmanagement-System VisualSourceSave (VSS) übernommen, der folgende Informationen beim Ein- und Auschecken der Source Code Datei generiert: – – – – • Ablage der Datei Änderungs-Nummer Datum mit Uhrzeit Verantwortlicher Die anderen Angaben im Header müssen per Hand gepflegt werden # region VSS Info // -- <Project Name>, <Subpackage Name> -// Created: <Name> // Copyright: (C) 2003 Microsoft // Purpose: <Short description> // // -- SourceSafe Information -/* $Archive: $ * $Revision: $ * $Date: $ * $Author: $ */ # endregion Seite 4 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung Source Code Dokumentation (mit Javadoc) Javadoc makes use of ‘flags’ to generate specific links and markup. These flags include: @author, @version, @param, @see and @return. Javadoc block comments begin with “/**” on a single line, followed by the comment content, and end with “*/” on a single line. Beispiel: javadoc Eingabe.java -author –version generiert: /*********************************************** <p><b>Kurzbeschreibung:</b> Die Datei enthält die Klasse Eingabe. Sie dient zum Testen einer streambasierten Eingabe mit Konvertierung durch die Klasse InputStreamReader <p> <b>Builded:</b> javac Eingabe.java mit Java WorkShop 2.0 @author Christoph Riewerts, DaimlerChrysler, M413 @version V1.000 vom 04/09/15 ************************************************/ public class Eingabe { // Hier steht die Klassendefinition } java.lang.Object | +----Eingabe public class Eingabe extends Object Kurzbeschreibung: Die Datei enthält die Klasse Eingabe. Sie dient zum Testen einer streambasierten Eingabe mit Konvertierung durch die Klasse InputStreamReader Builded: javac Eingabe.java mit Java WorkShop 2.0 Version: V1.000 vom 04/09/15 Author: Christoph Riewerts, DaimlerChrysler, M415 Seite 5 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung Hinweise auf guten Programmierstil Seite 6 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung QS-Kriterium: Verständlichkeit Namenskonventionen • In general: the name shall be descriptive and unambiguous, avoid using abbreviation, acronyms and computer jargon unless it is extremely awkward not to do so! • Using unique method: – Writing notation: newAddress – Underscore notation: new_address – Consonant notation: nwddrss – Hungarian notation with tag and optional qualifier (i.e. fst for first): padr (tag p means pointer), scadr (tag sc means string with a fixed length) • Name lengths in the range of 9 to 15 characters are considered optimal • In the case of Boolean objects, the name should reflect the object’s TRUE condition • Path names will not be hard coded into any application • Application specific constants will be named as appropriate using all uppercase letters, numbers and underscore (_) characters (with a single lowercase letter prefix for data type, for example tAPP_NAME for a String constant) • User defined types will be declared with the data type in capital letters and the components following normal variable conventions Seite 7 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung QS-Kriterium: Wartbarkeit #ifndef HEADER_H Einsatz von Programmierrichtlinien, z.B. für Sprache C: #define HEADER_H • include-Dateien werden genau einmal bearbeitet /* Inhalt von header.h */ • Klammerungstiefe von Anweisungen ist maximal 4 #endif • Ein Ausdruck enthält maximal 6 (gewichtete) Operatoren: – In Anweisungen zählen arithmetische Operatoren einfach – In Bedingungen zählen Vergleiche und log. Operatoren einfach – Alle anderen Operatoren zählen als „unnatürliche“ Operatoren doppelt – Folgendes Beispiel hat Klammerungstiefe 4 und das Gewicht der Operatoren ist 6: • …. if (((c = getchar ()) != EOF) && (n < MAX)) Weitere Beispiele für schlechten Programmierstil: typedef char string10 [10] #define SOLANGE while ( y+=12*x++ While ((c = getchar ()) != EOF); Seite 8 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung QS-Kriterium: Wartbarkeit Richtlinien für Java-Code (Qualitätsmaß): • • • • • • • • • • (Max 10% aller) Methoden dürfen nicht mehr als 20 Statements haben (oder keine Methode darf mehr als 40 Statements aufweisen) Methoden dürfen nicht mehr als vier Parameter haben (Maß: max. 10% aller Methoden haben zw. 5 und 15 Parameter) Methoden haben eine max. McCabe-Komplexität (Schachtelung & Pfade) von 5 (Max. 10% aller) Klassen dürfen nicht mehr als 10 Instanzvariable haben Übergabeparameter dürfen innerhalb einer Methode nicht überschrieben werden Übergabeparameter dürfen nicht denselben Namen haben wie interne Variable In booleschen Ausdrücken sind Konstante statt Werte zu verwenden Alle Variable müssen mit modifiern belegt werden Die Form „.*“ für Import-Anweisung muss vermieden werden Jede return-Anweisung ist mit JavaDoc zu kommentieren Seite 9 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung QS-Kriterium: Ergonomie der Benutzerschnittstelle z.B. Erwartungskonformität (Dialoggestaltung): • • • • Information, was das Programm leistet – GUI: Im Menüpunkt „info“ oder – Zeilenorientiert (zo): direkter Hinweis bei der Programmausgabe Hinweise, wie man das Programm bedient – GUI: Online-Hilfe oder – Zo: Aufruf mit der Option –help oder – Zo: direkter Hinweis bei der Programmausgabe Informationen über den Hersteller – Name, Version, Copyright, Support-Adresse Eindeutige Fehlerbehandlung – Was hat der Benutzer im Fehlerfall verkehrt gemacht? – Wie kann er in Zukunft den Fehler vermeiden? Seite 10 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung Konfigurationsmanagement Programmverwaltung • Produktionssystem enth. viele Programme mit jeweils einer Version • Entwicklungssystem enth. ein Programm in unterschiedlichen Versionen: – Integrationssystem für Integrationstest und Versionsverwaltung – User area für die Entwicklung einer Version • Konfigurationsmanagement (KM) umfasst – Versionsverwaltung: V. bedeutet, dass alle relevanten Dokumente und Programmbestandteile mit ihrem jeweiligen Änderungsstand archiviert und dokumentiert werden, so dass man u.a. zwischen den Versionen einer Datei unterscheiden kann, die sich in unterschiedlichen Phasen der SoftwareEntwicklung befinden (z.B. Version 10 befindet sich in der Entwicklung, Version 9 im Integrationstest und Version 8 bereits in Produktion) – Releaseverwaltung: R. heißt, dass die einzelnen Release (Auslieferungsstände) der Applikation dokumentiert und verwaltet werden. Ein Release dokumentiert die Versionsnummern aller Dateien, die benötigt werden, um das System zu einem bestimmten Zeitpunkt ausliefern zu können. D.h. das Release 5.0.0 des Systems beinhaltet z.B. die Version 3 der Datei "applicat.dll" die Version 7 der Datei "applicat.exe" und die Version 2 der Datei "manual.doc". Seite 11 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung Konfigurationsmanagement Einsatz eines Konfigurationsmanagement-Systems (zur Versionsverwaltung): • Beispiel SCCS (source code control system) – One(!) File for all releases/versions: s.<module name> – Access rights to the releases/versions: admin – Support for generating new releases/versions (delta): • Automatically assign of version number, date of change, operator name • Reason for changing in a comment – – – Locking of modules for changing: get Reporting of differences between releases/versions: sccsdiff Generating of branches (nomenclature: release.level) $ get -e -r1.5 s.module 1.5 new delta 1.6 18 lines $ .... $ get s.module 1.7 20 lines $ .... $ delta s.modul comments ? change request 22 done 1.6 2 inserted 0 deleted 18 unchanged $ .... Seite 12 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung Konfigurationsmanagement Verwalten von Programmteilen (Versionsunterschiede) in einer Datei durch Einsatz von Präprozessor-Anweisungen in C: Bedingte Übersetzung • Mittels ifdef-, endif- und define-Anweisungen können einzelne Programmabschnitte compiliert werden oder auch nicht Übung: • Tragen Sie in das nebenstehende Programmbeispiel die notwendigen PräprozessorAnweisungen ein, um zu erreichen, dass der Compiler in der Testphase auch die print-Befehle übersetzt. # ………. main() { …. …. /* Schalter fuer Testbetrieb */ # ………. /* Printbefehle fuer Testbetrieb -------------*/ …. printf (…); …. /* Printbefehle ende ------------------------- */ # ………. …. } Seite 13 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung Anhang Beispiele für schlechten Programmierstil (Verständlichkeit): If (Not State = "WA") Then SngSalesTax = 0 End If If blnIsUSCitizen = True Then Wscript.Echo "This person is a citizen." Else Wscript.Echo "This person is not a citizen." End If RegPrice = 100 Discount = 5 SalesTax = 1.05 PreferredCustomer = 2 Wscript.Echo RegPrice * SalesTax - Discount * PreferredCustomer Seite 14 DHBW Stuttgart, Informatik, SW-Engineering, Kapitel 5 Okt 2011 Programmierung Anhang If (State = "WA") Then SngSalesTax = 0.065 End If If (State <> "WA") Then SngSalesTax = 0 If blnIsUSCitizen = False Then End If Wscript.Echo "This person is not a citizen." Else Wscript.Echo "This person is a citizen." … weil bei „True-Abfragen“ sowohl End If 1 als auch -1 richtig sein kann If blnIsUSCitizen Then (false bedeutet immer = 0) Wscript.Echo "This person is a citizen." Else Wscript.Echo "This person is not a citizen." End If Hier sind die Lösungen RegPrice = 100 Discount = 5 SalesTax = 1.05 PreferredCustomer = 2 Wscript.Echo (RegPrice * SalesTax) - (Discount * PreferredCustomer) Seite 15