Wie erstellt man gute Software - Eine Übersicht

Wie erstellt man gute Software - Eine Übersicht

  • Andrej Albrecht
  • 2016-08-07 06:47:00

In der Software-Entwicklung ist es relativ einfach und schnell zu lernen, wie kleine Anwendungen z.B. Apps (für iOS, Android oder Windows Phone) oder für den Desktop (Mac, Linux oder Windows) programmiert werden. Doch wie geht man vor, wenn eine sehr große Anwendung entwickelt werden soll. Eine Anwendung mit hunderten grafischen Benutzeroberflächen, die auch zusätzlich über das Internet mit Servern über hunderte unterschiedliche Informationstypen (Datenobjekte) Informationen austauschen soll? Wenn man an diesem Punkt nur das MVC-Entwurfsmuster (Model-View-Controller) kennt, dann reicht es nicht aus diese Anwendung sinnvoll zu strukturieren und aufzubauen. Die Anwendung wird durch das begrenzte Wissen nur minderwertig. Wann ist eine Anwendung qualitativ hochwertig? Eine Anwendung kann als gut bezeichnet werden, wenn es die Anforderungen und Qualitätsmerkmale nach ISO 9126 erfüllt. Diese Qualitätsmerkmale sind nachfolgend aufgelistet.

Qualitätsmerkmale nach ISO 9126

  • Funktionalität
    • Genauigkeit
    • Angemessenheit
    • Interoperabilität
    • Sicherheit
    • Konformität der Funktionalität
  • Zuverlässigkeit
    • Reife
    • Fehlertoleranz
    • Widerherstellbarkeit
    • Konformität der Zuverlässigkeit
  • Benutzbarkeit
    • Verständlichkeit
    • Erlernbarkeit
    • Bedienbarkeit
    • Attraktivität
    • Konformität der Benutzbarkeit
  • Effizienz
    • Zeitverhalten
    • Verbrauchsverhalten
    • Konformität der Effizienz
  • Wartbarkeit
    • Analysierbarkeit
    • Änderbarkeit
    • Stabilität
    • Testbarkeit
    • Konformität der Wartbarkeit
  • Portabilität
    • Anpassbarkeit
    • Installierbarkeit
    • Koexistenz
    • Austauschbarkeit
    • Konformität der Portabilität
Jedoch sind diese Qualitätsmerkmale sehr theoretisch. Wie kann nun eine Anwendung mit Einhaltung dieser Qualitätsmerkmale entwickelt werden? Anwendungen sind so individuell das es keine klare Lösung von den einzelnen Merkmalen gibt. Das Erreichen der Qualitätsmerkmale ergibt sich aus der Erfüllung der Anforderungen einer Anwendung. Eine Anwendung für ein Unternehmen erfüllt die Qualitätsmerkmale auf eine andere Art und Weise, als eine Anwendung mit der “Pokemon” gefangen werden. Diese Ebene der Qualität bezieht sich zu einem großen Teil auf die Erfüllung von Anforderungen. Die Erfüllung der Anforderungen kann schnell überprüft werden, wenn nämlich der Kunde die Anwendung mit den zuvor verlangten Anforderungen bekommt. Es kann schnell festgestellt werden, wenn weine Funktion nicht implementiert wurde. Dieser Artikel gibt eine Übersicht wie die Qualität vom Programmcode gesteigert werden kann. Dadurch werden gleichzeitig die Qualitätsmerkmale Analysierbarkeit, Änderbarkeit, Stabilität, Testbarkeit, Anpassbarkeit, Koexistenz und Austauschbarkeit erfüllt.
In der nachfolgenden Abbildung sind die einzelnen Bereiche dargestellt die ein Software-Entwickler beherrschen sollte, um größere Anwendung in einer angemessenen Qualität erstellen zu können.

Vorgehen zu guter Software Qualitt
Angefangen mit der Syntax einer Programmiersprache. Selbstverständlich sollte die Syntax einer Programmiersprache beherrscht werden. Diese wird hier nur Vollständigkeitshalber erwähnt. Als nächstes sollten die Konzepte der objektorientierten Programmierung (OOP) beherrscht werden, besonders wie diese auf die richtige Weise in der verwendeten Programmiersprache eingesetzt werden. Mit der objektorientierten Programmierung können bereits kleine Anwendungen aufgebaut werden. Falls die Anwendung wächst oder gleich zu beginn eine große Anwendung erstellt werden soll, dann fehlt den meisten Software-Entwicklern jedoch das wissen dazu. Mit der objektorientierten Programmierung alleine fehlt das Wissen wie eine große Anwendung aufgebaut wird. Wie größer eine Anwendung ist oder wächst, desto wichtiger werden objektorientierte Grundprinzipien. Bei Einhaltung objektorientierter Grundprinzipien wird die Anwendung automatisch viel strukturierter und übersichtlicher, gerade wenn diese wächst. In der Software-Entwicklung gibt es oft Ähnlichkeiten in unterschiedlichen Anwendungen. Erfahrene Software-Entwickler haben diese Ähnlichkeiten gefunden und die damit verbundenen Schwierigkeiten und Erfahrungen beim Entwurf der Anwendung in Form von Entwurfsmuster (Design pattern) aufgeschrieben. Jeder Software-Entwickler, der größere Anwendungen (10 grafische Benutzeroberflächen und mehr) entwickeln möchte, sollte diese Entwurfsmuster kennen, um beim Entwurf der Anwendung die selben Probleme nicht selbst lösen muss, die bereits andere vor ihm gelöst haben. Das Rad muss so oft nicht neu erfunden werden. Es wird Zeit und damit Geld beim Erstellen von Software eingespart. Als nächsten Schritt werden bei größeren Anwendungen (20 bis 50 grafische Benutzeroberflächen und mehr) Architekturmuster erforderlich, um die Anwendung strukturiert und übersichtlich zu erstellen. Architekturmuster sind genauso wie Entwurfsmuster Lösungsschablonen zu wiederkehrende Entwurfsproblemen. Jedoch werden Architekturmuster auf einer höheren Abstraktionsschicht berücksichtigt und eingesetzt.

Objektorientierte Programmierung (OOP)

In der objektorientierten Programmierung sollte man den unterschied zwischen Klasse, Objekt und Instanz kennen. Eine Klasse ist die Bauanleitung mit der Objekte erstellt werden. Das Erstellen der Objekte wird instanziieren genannt. Ein Objekt ist die Instanz einer Klasse. Es können mehrere Objekte einer Klasse erstellt werden. In einer Klasse befinden sich Attribute und Methoden. Diese definieren welche Attribute und Methoden die später erstellten Objekte besitzen. Ein Interface ist eine Zusammenfassung von Methoden. Über ein Interface findet Kommunikation statt. Darüber können Nachrichten versendet werden, z.B. von einem Objekt zu einem anderen. Das versenden von Nachrichten ist gleichbedeutend mit einem Methodenaufruf. Es gibt noch weitere Konzepte wie Abstraktion, Vererbung, Datenkapselung, Feedback, Persistenz und Polymorphie. Bei der objektorientierten Programmierung gibt es Kriterien, die eingehalten werden sollen wie Austauschbarkeit, Vererbung und Polymorphie. In späteren Artikeln werde ich noch genauer auf die wichtigsten Bereiche der objektorientierten Programmierung eingehen. Das Beherrschen objektorientierter Programmierung ist leider noch keine Garantie zu hochwertiger Software. Der nächste Schritt zu guter Software sind objektorientierte Grundprinzipien.

Objektorientierte Grundprinzipien

Objektorientierte Grundprinzipien (auch Prinzipien objektorientierten Designs genannt) sind unterschiedliche Regeln, die bei der Konzeptionierung von Anwendungen eingehalten werden sollten, um eine bessere Qualität der Anwendung zu erhalten. Die Prinzipien sollten verstanden und im Schlaf beherrscht werden. Beim Erstellen von Anwendungen fallen einem diese ein und das Prinzip kann beim Entwurf direkt berücksichtigt werden. Nachfolgend sind die meisten Prinzipien aufgelistet. In später folgenden Artikeln wird jedes einzelne Prinzip mit einem Praxisbeispiel beschrieben.

SOLID

  • Single-Responsibility-Prinzip
  • Open-Closed-Prinzip
  • Liskovsches Substitutionsprinzip
  • Interface-Segragation-Prinzip
  • Dependency-Inversion-Prinzip

GRASP (General Responsibility Assignment Software Patterns)

  • Information Expert
  • Creator
  • Controller
  • Low Coupling
  • High Cohesion
  • Polymorphism’s
  • Pure Fabrication
  • Indirection
  • Protected Variations

Weitere Prinzipien

  • DRY - Don’t repeat yourself
  • KISS principle
  • YAGNI
  • Packaging principles


Entwurfsmuster

Entwurfsmuster sind bewährte Lösungsschablonen von bereits gelösten Entwurfsproblemen in der Softwarearchitektur. Ursprünglich wurden die ersten Entwurfsmuster 1994 in dem Buch Design Patterns. Elements of Reusable Object-Oriented Software von Erich Gamma, Richard Helm, Ralph Johnson und John Vlissides beschrieben. Diese vier Autoren werden oft als Gang of Four (GoF) bezeichnet. Seit der Zeit sind noch weitere Entwurfsmuster von anderen Leuten entwickelt worden. Die Entwurfsmuster werden in Kategorien aufgeteilt. Die drei wichtigsten sind Erzeugungsmuster, Strukturmuster und Verhaltensmuster. Nachfolgend werden die meisten Entwurfsmuster zur Übersichtlichkeit aufgelistet und in weiteren Artikeln beschrieben.

Erzeugungsmuster

  • Abstract Factory
  • Builder
  • Factory Method
  • Object Pool
  • Prototype
  • Singleton

Strukturmuster

  • Adapter
  • Bridge
  • Composite
  • Decorator
  • Facade
  • Flyweight
  • Private Class Data
  • Proxy
    • Virtual Proxy
    • Security Proxy
    • Remote Proxy

Verhaltensmuster

  • Chain of responsibility: A way of passing a request between a chain of objects
  • Command: Encapsulate a command request as an object
  • Command processor
  • Interpreter
  • Iterator
  • Mediator
  • Memento
  • Null Object
  • Observer
  • State
  • Strategy
  • Template method
  • Visitor
Das Muster MVC (Model View Controller) wird in der Literatur unterschiedlich eingeordnet. Meiner Meinung nach fällt dieses Muster eher unter Architekturmuster, alleine durch die Tatsache das dieses Architekturmuster aus drei unterschiedlichen Entwurfsmustern zusammen gebildet wird.

Architekturmuster

Architekturmuster sind ähnlich zu Entwurfsmuster Lösungsschablonen von bereits gelösten Entwurfsproblemen, jedoch auf einer abstrakteren Ebene. Ein Architekturmuster verknüpft meist mehrere kleinere Komponenten zu einer großen oder stellt die Kommunikation zwischen kleineren Komponenten sicher. Nachfolgend sind einige Architekturmuster abgebildet. Wie auch bei den anderen Bereichen werden die Muster in folgenden Artikeln ausführlich mit Praxisbeispielen beschrieben werden. Das wichtigste Architekturmuster ist Model View Controller (MVC) und sollte bereits sehr früh beherrscht werden. Es sollte bereits mit der objektorientierten Programmierung zusammen gelernt werden.
  • Model View Controller (MVC)
  • Layering (Schichtenarchitektur)
  • Plugin
  • Service Oriented Architecture (SOA)
  • Pipe and filter
  • Broker


Zusammenfassung

Ich hoffe das diese Auflistung alleine bereits einen Leitfaden zu guter Software gibt. In folgenden Artikeln werde ich auf jeden Bereich genauer eingehen und mit Praxisbeispielen erläutern wie diese eingesetzt werden, um eine qualitativ hochwertige Software zu erhalten. Bis dahin findet ihr ansonsten unter den unten aufgelisteten Quellen weitere Informationen.

Empfohlene Bücher und weitere Quellen