05.06.2013 Aufrufe

Thema. Strukturierung von Software Studienarbeit Fakultät ...

Thema. Strukturierung von Software Studienarbeit Fakultät ...

Thema. Strukturierung von Software Studienarbeit Fakultät ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Thema</strong>. <strong>Strukturierung</strong> <strong>von</strong> <strong>Software</strong><br />

<strong>Studienarbeit</strong><br />

<strong>Fakultät</strong> Informatik<br />

Hochschule Reutlingen<br />

Reutlingen University<br />

Studiengänge Wirtschaftsinformatik<br />

Alteburgstraße 150<br />

72762 Reutlingen<br />

Bearbeiter<br />

Markus Riegger<br />

Angelstraße 13<br />

72406 Bisingen<br />

Betreuer<br />

Prof. Dr. Laux<br />

07.11.2012


1<br />

Einführung<br />

In diesem Dokument möchte ich über das <strong>Thema</strong> “<strong>Strukturierung</strong> <strong>von</strong> <strong>Software</strong>”<br />

schreiben. Dabei werde ich mich an den Vortrag <strong>von</strong> Barbara Liskov <strong>von</strong> der<br />

Massachusetts Institute of Technology (MIT) zum <strong>Thema</strong> „Programming the Turning<br />

Machine“ beziehen. In den einzelnen Kapiteln wird es um Komplexität <strong>von</strong> <strong>Software</strong>, die<br />

Geschichte <strong>von</strong> <strong>Software</strong>architekturen, die Modularisierung und Objektorientierung in<br />

<strong>Software</strong>projekten gehen. Dabei werde ich auch auf die <strong>von</strong> Frau Liskov entwickelter<br />

Programmierusprache CLU eingehen.<br />

2


2<br />

Die Geschichte der <strong>Software</strong>architektur<br />

Frau Liskov spricht in dem Vortrag ihre Projekte aus den 70er Jahren an. Die<br />

Geschichte der <strong>Software</strong>architektur begann jedoch schon früher. Der Beginn der<br />

<strong>Strukturierung</strong> <strong>von</strong> <strong>Software</strong> war die <strong>Software</strong>krise Mitte der 60er Jahre. Auslöser der<br />

Krise war, dass die Kosten für <strong>Software</strong> zum ersten Mal die Kosten der Hardware<br />

überschritten haben. Die Techniken konnten mit der Komplexität der <strong>Software</strong> nicht<br />

mehr mithalten. Dies brachte große <strong>Software</strong>projekte zum scheitern. 1 Zum ersten Mal<br />

wurde der Begriff „<strong>Software</strong>architektur“ in einem Tagungsband einer <strong>von</strong> der NASA<br />

finanzierter Konferenz erwähnt. Dies war im Jahr 1969. David Parns schrieb im Jahre<br />

1972 einen Artikel über Kritereien für Modulkomposition <strong>von</strong> <strong>Software</strong>systemen. Dabei<br />

legte er die ersten Konzepte und Ideen für <strong>Software</strong>architekturen fest. Dewayne Perry<br />

und Alexander Wolf veröffentlichen im Jahre 1992 einen Artikel in dem sie die Formel<br />

"Elemente + Form + Rational = <strong>Software</strong>architektur" einführten. 1996 wurden die ersten<br />

Entwurfsmuster für die <strong>Software</strong>architektur festgelegt. 1999 fand dann die erste<br />

Konferenz speziell zum <strong>Thema</strong> „<strong>Software</strong>architektur“ statt.<br />

Im Jahr 2000 wurde dann eine IEEE Norm zur Beschreibung <strong>von</strong> <strong>Software</strong>architektur. In<br />

der Version 2.0 (veröffentlicht im Jahr 2003) eignet sich UML nun zur Modellierung <strong>von</strong><br />

<strong>Software</strong>architekturen. 2004 entstand bei der GI ein Arbeitskreis, welcher im Jahre 2006<br />

das Buch „Handbuch der <strong>Software</strong>-Architektur“ veröffentlicht. In der Praxis sind die<br />

Themen Cloud Computing, Mehrkernprozessoren, mobile Endgeräte und<br />

Serviceorientierte Architekturen aktuell. Aktuelle Forschungsthemen sind<br />

Wissensmanagement für <strong>Software</strong>architekturen, modellbasierte Analyseverfahren und<br />

<strong>Software</strong>produktlinien. 2<br />

1 http://de.wikipedia.org/wiki/<strong>Software</strong>krise Zugegriffen am 07.11.2012 14:20<br />

2 http://de.wikipedia.org/wiki/<strong>Software</strong>architektur Zugegriffen am 07.11.2012 13:00<br />

3


3<br />

Komplexität <strong>von</strong> <strong>Software</strong><br />

In ihrem Vortrag geht Frau Liskov auf die Komplexität <strong>von</strong> Programmen ein. Heutige<br />

Programme erreichen eine beachtliche Größe und die Komplexität richtet sich oft nach<br />

genau dieser Größe. Durch jeden Technologiefortschritt erhöht sich diese stetig. Dabei<br />

stellt sich die Frage wie man diese Komplexität des Quellcodes ermitteln kann.<br />

Die Größe eines Programmes kann als Metrik zur Ermittlung der Komplexität eines<br />

Programmes herangezogen werden. Nach Gary McGraw kann die Komplexität eines<br />

Programmes wie folgt abgebildet werden. 3<br />

Anzahl der Zeilen²<br />

Bei diesem Maß gilt es zu beachten, dass ein Programm eine gewissen Länge<br />

erreichen kann ohne eine große Komplexität zu enthalten. Stellen Sie sich vor sie<br />

müssten in die Ausgabezeile die Zahlen 1-100 ausgeben. Dies kann entweder „hart“<br />

codiert sein oder in einer Schleife ablaufen. Die Komplexität der ersten Methode wäre<br />

100² = 10000. Die Komplexität bei einer Schleife wäre 3² = 9. Dies Zeigt obwohl die<br />

Schleife für einen Programmierer schwerer zu verstehen ist erreicht sie einen deutlich<br />

niederen Wert. 4<br />

McGabe versucht mit der zyklomatischen Komplexität die Ermittlung zu verfeinern.<br />

Hierbei werden die Verzweigungen zusätzlich berücksichtigt und in die Metrik<br />

übernommen. Jedoch ist auch diese Methode ungenau.<br />

Eine Eindeutige Bestimmung der Komplexität <strong>von</strong> <strong>Software</strong> ist nicht möglich. Die<br />

Komplexität wird näherungsweise bestimmt. Jedoch kann die Anzahl der technischen<br />

Fehler als weiterer Anhaltspunkt der Komplexität hinzugezogen werden. 5<br />

Wodurch wird nun eine Erhöhung der Komplexität in <strong>Software</strong> ausgelöst?<br />

Bereits Fred Brooks hat festgestellt, dass die Komplexität nur bis zu einem bestimmten<br />

Bereich reduziert werden kann. Jedoch ist es für die <strong>Software</strong>qualität und die<br />

Wartbarkeit <strong>von</strong> <strong>Software</strong>systemen relevant diese möglichen Reduktionen<br />

durchzuführen. Um eine anhaltende Wirkung zu erzielen muss die Verbesserung<br />

durchgehend geschehen, weil sich die <strong>Software</strong>welt dauernd ändert. Eine geringe<br />

Komplexität vereinfacht hierbei die <strong>Software</strong>test und Wartung des Systems. 6<br />

Modularisierung bietet hier zum Beispiel eine Möglichkeit der Reduktion <strong>von</strong> der<br />

Komplexität.<br />

3 http://softwaresanierung.wordpress.com/2010/08/25/komplexitat-<strong>von</strong>-software/ Zugegriffen<br />

am 07.11.2012 10:10<br />

4 http://softwaresanierung.wordpress.com/2010/08/25/komplexitat-<strong>von</strong>-software/ Zugegriffen<br />

am 07.11.2012 10:10<br />

5 http://softwaresanierung.wordpress.com/2010/08/25/komplexitat-<strong>von</strong>-software/ Zugegriffen<br />

am 07.11.2012 10:10<br />

6 http://www.verifysoft.com/de_cmtpp_mscoder.pdf Zugegriffen am 07.11.2012 11:30<br />

4


4<br />

Modularisierung<br />

In ihrem Vortrag spricht Frau Liskov über die Modualisierung <strong>von</strong> <strong>Software</strong>. Die<br />

Modularisierung <strong>von</strong> <strong>Software</strong> ist aus heutiger Sicht nicht mehr wegzudenken. Der<br />

Einsatz der Modularisierung bei <strong>Software</strong> dient dazu <strong>Software</strong> wiederverwertbar und<br />

erweiterbar zu machen. Durch die Modularisierung ermöglicht eine kostengünstiger und<br />

schnelle Entwicklung eines neuen Programms. 7 Mit Modularisierung wird das Aufteilen<br />

einer Aufgabe in unterschiedliche Teilaufgaben bezeichnet. Diese Teilaufgaben sind<br />

<strong>von</strong> einander unabhängig und können ohne Zugriff auf andere Module durchgeführt<br />

werden. Als Module werden also autonome und rekonfigurierbare Systembausteine<br />

benannt. 8<br />

4.1<br />

Moduleigenschaften<br />

Um eine Modulübergreifende Kommunikation der Modul zu realisieren müssen<br />

Schnittstellen zwischen beiden Modulen existieren. Der Output eines Moduls muss an<br />

ein weiteres Modul weitergeleitet werden und dort als Import verarbeitet werden. Die<br />

Versorgung eines Modul erfolgt mit Hilfe <strong>von</strong> Material-, Medien-, und<br />

Informationsflüssen über standardisierte Schnittstellen. 9<br />

4.2<br />

Was gilt es bei Modularisierung zu beachten?<br />

Ein wichtiger Punkt ist die Modulgeschlossenheit. Dabei ist ein Modul für eine in sich<br />

geschlossene Aufgabe zuständig. Das bedeutet, wenn ein Modul zum Beispiel eine<br />

Kennzahl berechnen soll ist die Berechnung mit Ende des Moduls abgeschlossen. Eine<br />

Kennzahlenformel wird nicht auf mehrere Module verteilt.<br />

Es muss auf eine Modulbindung geachtet werden. Modulbindung meint dabei die<br />

Summe an Beziehungen die zwischen untergeordneten Modulen besteht. Dabei sollte<br />

es keine Module ohne Modulbindung geben. Also keine Module die keinen<br />

Zusammenhang mit einem anderen Modul.<br />

Mit der Modulkopplung wird die stärke der Verbindung zwischen verschiedenen<br />

Modulen. Die Größe der Modulkopplung gibt an wie viele Schnittstellen es gibt. Diese<br />

müssen bei Weiterentwicklungen beachtet werden. Je mehr Modulkopplungen<br />

existieren desto Fehleranfällig ist ein System. Es sollte also auf eine Minimalität <strong>von</strong><br />

Schnittstellen geachtet werden. Dabei gilt desto kleiner die Schnittstelle eines Moduls<br />

7 http://wwwiti.cs.uni-magdeburg.de/iti_db/publikationen/ps/auto/thesisKuhlemann.pdf Seite 7<br />

Zugegriffen am 07.11.2012 15:14<br />

8 http://www.fml.mw.tum.de/fml/index.php?Set_ID=320&letter=M&b_id=3444427B-4630-<br />

3633-342D-424346442D34 Zugegriffen am 07.11.2012 15:30<br />

9 http://www.fml.mw.tum.de/fml/index.php?Set_ID=320&letter=M&b_id=3444427B-4630-<br />

3633-342D-424346442D34 Zugegriffen am 07.11.2012 15:30<br />

5


ist, desto besser. Durch die kleineren Schnittstellen wird die Höhe der Modulkopplung<br />

reduziert.<br />

Die optimale Modulgröße ermittelt sich aus der Summe <strong>von</strong> Modulkopplungs- und der<br />

Modulbindungskurve. Dabei ist die ideale Modulgröße eines Systems an dem Punkt an<br />

dem die Komplexität am geringsten ist. Die Modulkopplung nimmt mit steigender Anzahl<br />

<strong>von</strong> Modulen zu. Dagegen nimmt die Modulbindung bei steigender Modulanzahl ab.<br />

Dies gilt solange das Systemfunktionen gleich bleiben. 10<br />

4.3<br />

Gestaltungsregeln<br />

Abbildung 1: Optimale Anzahl der Module 11<br />

Bei der Modularisierung muss auf die Wartbarkeit des Systems geachtet werden. Bei<br />

der Modularisierung werden die Methoden Hierarchisierung, Abstraktion, und<br />

Kapselung verwendet. Die Zusammenfassung oder Zerlegung (in Submodule) <strong>von</strong><br />

Modulen erzeugt eine hierarchische <strong>Strukturierung</strong>. Die Strukturhierarchie legt den<br />

Aufbau des Systems dar. Die Hierarchisierung erhöht die Transparenz des Systems<br />

und verringert die Komplexität der Struktur.<br />

Abstraktion, also das Weglassen unwichtiger Details und Ermittlung der<br />

Gemeinsamkeiten, ist eine Technik um die Komplexität zu beherrschen. Dabei wird auf<br />

die Unterschiede der Module geachtet. Als Ergänzung der Abstraktion gilt die<br />

Kapselung. In der Kapselung wird der innere Aufbau eines Moduls dargestellt. Sie stellt<br />

eine klare Trennung zwischen der Bedienschnittstelle und dem inneren Aufbau des<br />

Moduls sicher. Die Verwendung eines Moduls muss ohne genaue Kenntnis des<br />

technischen Aufbau des Moduls möglich sein. 12<br />

Eine hohe Modulkoppelung wirkt sich negativ auf die Testbarkeit aus. Eine gute<br />

Testbarkeit ist dann gegeben, wenn ein Modul ohne Kenntnis des Gesamtsystems<br />

getestet werden kann.<br />

Module müssen durch andere Module ersetzt werden können. Dabei sollten keine<br />

unerwünschten Effekte auf andere oder auf dieses Modul auftreten. Dies nennt man<br />

Interferenzfreiheit. Interferenzfreiheit ist nicht gegeben, wenn Aufgaben auf mehrere<br />

Module verteilt sind oder Module mehrere Aufgaben erledigen.<br />

10 http://www.fml.mw.tum.de/fml/index.php?Set_ID=320&letter=M&b_id=3444427B-4630-<br />

3633-342D-424346442D34 Zugegriffen am 07.11.2012 15:30<br />

11 Abbildung übernommen <strong>von</strong> http://www.fml.mw.tum.de/fml/index.php?<br />

Set_ID=320&letter=M&b_id=3444427B-4630-3633-342D-424346442D34 Zugegriffen am<br />

07.11.2012 15:30<br />

12 http://www.fml.mw.tum.de/fml/index.php?Set_ID=320&letter=M&b_id=3444427B-4630-<br />

3633-342D-424346442D34 Zugegriffen am 07.11.2012 15:30<br />

6


Die Wiederverwendbarkeit eines Moduls gibt die Verwendungszahl eines Moduls an.<br />

Ein gutes Modul kann in unterschiedlichen oder dem Selben Projekt mehrfach<br />

verwendet werden.<br />

7


5<br />

Objektorientierung<br />

In ihrem Vortrag ging Frau Liskov auf ihre Programmiersprache CLU und<br />

objektorientierte Programmierung ein. Dabei hat sie auch die Elemente wie<br />

Datenkapselung, Polymorphie und Vererbung eingegangen.<br />

5.1<br />

CLU<br />

Die Programmiersprache CLU wurde <strong>von</strong> Barbara Liskov und ihren Studenten zwischen<br />

1974 und 1975 entwickelt. Diese Sprache gilt als erste Programmiersprache, welche<br />

eine Datenbankabstraktion bot. Dies war grundlegend für die Entwicklung <strong>von</strong><br />

objektorientierten Programmiersprachen. CLU wurde als Programmiersprache für<br />

Großprojekte entwickelt und ermöglicht die Bearbeitung eines Projektes durch mehrere<br />

Bearbeiter.<br />

CLU beinhaltet die Sprachelemente Cluster, Ausnahmebehandlungen, Iteratoren und<br />

Mehrfachzuweisung <strong>von</strong> Variablen. CLU war für fortgeschrittene Programmierer<br />

gedacht. 13<br />

5.2 LSP<br />

Unter der Abkürzung LSP versteht man das liskovsche Subtitutionsprinzip. LSP ist auch<br />

unter dem Begriff Ersetzbarkeitsprinzip bekannt und ist ein Kriterium in der<br />

objektorientierten Programmierung. LSP wurde 1993 <strong>von</strong> Barbara Liskov und Jeannette<br />

Wing entwickelt. Bei der Modellierung eines Datentyps gibt LSP die Bedingungen für<br />

den Untertyp an. 14<br />

5.3<br />

Objektorientierte Programmierung<br />

Objektorientierung ist eine Methode zur Komplexitätsreduzierung in <strong>Software</strong>systemen.<br />

Objektorientierte Programmiersprachen sind eng mit der Entwicklung der Konzept der<br />

Objektorientierung verbunden. 15<br />

Die Objektorientierung hat sich erst spät, also Anfang der 90er Jahre, durchgesetzt.<br />

Objektorientierte <strong>Software</strong>entwicklung bietet dabei Techniken an, welche einen<br />

Entwickler bei der Entwicklung einfacher wartbarer, erweiterbarer und besser testbarer<br />

Systeme hilft.<br />

Die Objektorientierung kann jedoch nicht alle Probleme oder diese nur teilweise lösen.<br />

13 http://de.wikipedia.org/wiki/CLU_(Programmiersprache) Zugegriffen am 07.11.2012 18:15<br />

14 http://de.wikipedia.org/wiki/Liskovsches_Substitutionsprinzip Zugegriffen am 07.11.2012<br />

18:30<br />

15 Bernhard Lahres, Gregor Rayman Objektorientierte Programmierung, Galileo Computing<br />

8


5.3.1<br />

Kapselung<br />

In der Objektorientierung gehören Daten direkt zu einem Objekt. Direkte Aufrufe der<br />

Datenstruktur, wie sie in der strukturierten Programmierung, ist nicht möglich. Daten<br />

können also nur <strong>von</strong> dem Objekt gelesen oder verändert werden. Ein anderes Objekt<br />

kann die Daten nur über eine Schnittstelle anfordern.<br />

Das Objekt kann also selbst für die Konsistenz der Daten sorgen. Zum Beispiel können<br />

Abhängigkeiten definiert werden. So können <strong>von</strong> einander abhängige Daten nur<br />

gemeinsam geändert werden. Änderungen an der Datenstruktur wirken sich nur auf das<br />

betroffene Objekt aus. Dies reduziert die Anzahl der Betroffenen in einem System und<br />

den Aufwand für die Anpassung. Die Kapselung macht es also einfacher die Korrektheit<br />

<strong>von</strong> Programmen zu gewährleisten und reduziert den Änderungsaufwand. 16<br />

5.3.2<br />

Polymorphie<br />

Polymorphie bedeutet auf Deutsch „Vielgestaltigkeit“. In der Objektorientierung bedeutet<br />

dies einen möglichen Aufruf der selben Operation <strong>von</strong> verschiedenen Objekten<br />

unterschiedliches Verhalten zur Folge haben kann.<br />

Dynamische Polymorphie erlaubt es dabei einer Variablen eines Objekts Werte<br />

unterschiedlicher Typen zuzuweisen. Dies ist möglich, da der Typ der Variablen<br />

lediglich eine Schnittstelle ist. Werden einer Variablen während der Programmlaufzeit<br />

Werte unterschiedlicher Typen zugeordnet geschieht dies über unterschiedliche<br />

Methoden.<br />

Die Polymorphie ist die Voraussetzung um Konzepte wie die Vererbung oder der<br />

Ersetzbarkeit zu realisieren. 17<br />

5.3.3<br />

Vererbung<br />

Die Vererbung wurde erstmals in der Programmiersprache Simula (1967) eingesetzt.<br />

Dabei ist die Vererbung ein Grundlegendes Konzept der Objektorientierung. Diese hat<br />

daher eine große Bedeutung in der <strong>Software</strong>entwicklung. Anhand bereits vorhandenen<br />

Klassen werden neue Klassen geschaffen. Die Klassen sind dabei für immer mit<br />

einander verbunden. Eine Klasse, welche <strong>von</strong> einer anderen erbt, kann eine<br />

Erweiterung oder eine Einschränkung der ursprünglichen Klasse sein. Die Vererbung<br />

kann zusätzlich zur Dokumentation <strong>von</strong> Ähnlichkeiten zweier Klassen verwendet<br />

werden. Klassenhierarchien stellen strukturelle Ähnlichkeiten <strong>von</strong> Klassen dar.<br />

Basisklassen (auch Superklasse genannt) ist die Bezeichnung für die vererbende<br />

Klasse. Subklassen sind die erbenden Klassen. Generalisierung beschreibt die Umkehr<br />

der Vererbung. Ableitung oder Spezialisierung beschreibt das Erben selbst. Subklassen<br />

16 Bernhard Lahres, Gregor Rayman Objektorientierte Programmierung, Galileo Computing<br />

17 Bernhard Lahres, Gregor Rayman Objektorientierte Programmierung, Galileo Computing<br />

9


und Superkassen stehen in einer „is-a“ Beziehung. In einer Klasse werden Datentypen<br />

und Funktionalitäten definiert, welche an andere Klassen vererbt werden können.<br />

Mehrfachvererbung tritt auf, wenn eine Subklasse <strong>von</strong> mehreren Superklassen erbt.<br />

Diese Art der Vererbung steht nicht in allen Sprachen zur Verfügung. 18<br />

5.3.4 Iterator<br />

Iteratoren sind eine Art <strong>von</strong> Zeigern. Er besitzt zwei Funktionen. Eine Funktion ist die<br />

Erstellung einer Referenz auf ein bestimmtes Objekt und eine andere ist die<br />

Selbstmodifizierung um auf das Nächste Element zu zeigen. Ein Iterator dient dazu auf<br />

ein Element zuzugreifen und diesen <strong>von</strong> der Menge der Datenstruktur zu trennen. 19<br />

18 http://de.wikipedia.org/wiki/Vererbung_(Programmierung) Zugegriffen am 07.11.2012 19:00<br />

19 http://de.wikipedia.org/wiki/Iterator Zugegriffen am 07.11.2012 20:40<br />

10

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!