Software-Design für gute Codequalität, Teil 1 Embedded Code erfordert hohe Sorgfalt
Guter Code ist Code, der offensichtlich korrekt ist. Offensichtlich korrekter Code ist einfach lesbar, einfach zu warten und einfach überprüfbar. Wie erstellt man also guten Code?
Anbieter zum Thema

Um gutes Software-Design zu erreichen, bestimmen drei Definitionen das Umfeld:
Software-Architektur: Die Definition der Organisation eines Softwaresystems, das die Anforderungen erfüllen kann und Änderungen sowie eine zukünftige Wiederverwendung erlaubt.
Objekte: Code-Blöcke, die bestimmte Funktionen innerhalb der Software-Architektur ausführen. Objekte lassen sich kombinieren. Diese werden oft auch als Funktionen, Prozeduren oder Module bezeichnet. Die Benennung solcher Blöcke ist oft abhängig von der verwendeten Software-Sprache.
Software-Schnittstellen: Spezifikationen, die Definitionen darüber enthalten, wie ein Teil der Software-Architektur mit einem anderen verknüpft ist. Schnittstellen gibt es auf allen Ebenen der Architektur, zwischen einzelnen Code-Blöcken, zwischen diesen Blöcken und High-Level-Funktionen sowie zu externen Systemen oder Anwendern.
Die mit der Softwareentwicklung einhergehenden Herausforderungen sollten nie unterschätzt werden. Selbst das kleinste Detail von der genauen Benennung eines Objektes bis zur erforderlichen Zeit für die Ausführung einzelner Instruktionen spielt eine Rolle. Sorgfalt und Aufmerksamkeit für Details sind hier wesentlich.
Der wohl wichtigste Merksatz im Software-Design lautet: Es gibt kein Konzept, das universell passt. Fasst man jedoch alle relevanten Daten, Eingaben und Anforderungen zusammen und überprüft ihr Zusammenspiel, bildet dies die Grundlage für ein praktikables Konzept. Dieses muss vor allem das Geschäftsszenario für die Entwicklung erfüllen. In der Literatur gibt es reichlich Beispiele für Konzepte wie etwa Software-Pattern, die sich in solchen Fällen als besonders nutzbringend erwiesen haben. Sie bilden einen nützlichen Ansatzpunkt für den Aufbau einer Architektur.
Pattern beschreiben gängige Code-Merkmale wie Zustandsmaschinen, Model View Controller und Objekt-Observer. Ein nach einem bestimmten Pattern aufgebauter Code ist in der Regel einfacher nachzuverfolgen und zu validieren. Er lässt sich auch für eine Definition zum Aufbau von Code-Objekten nutzen. Pattern sollten allerdings nur verfolgt werden, solange dies angemessen ist. Letztendlich muss der Entwickler sicherstellen, dass der gesamte Code gut organisiert und klar verständlich ist. Nur dann kann er als offensichtlich richtig bewertet werden. Besondere Aufmerksamkeit ist dabei den Schnittstellen zwischen den verschiedenen Objekten zu widmen.
Ordentliche Dokumentation ist unverzichtbar
Nach gängiger Praxis ist stets zu berücksichtigen, welchen Zweck jede Schnittstelle hat und wie diese in die Gesamtarchitektur passt. Schnittstellen sollten schriftlich und klar in allen Entwicklern zugänglichen Dokumenten definiert werden. Vor einer Entscheidung über Details sind beide Seiten der Schnittstelle zu untersuchen. Dies gilt besonders, wenn der Code durch unterschiedliche Entwickler oder sogar verschiedene Unternehmen für beide Seiten zu schreiben ist.
Dokumentation ist oft das Stiefkind der Softwareentwicklung und etwas, wovor Entwickler zurückschrecken. Eine gut geschriebene Schnittstellen-Spezifikation kann aber viele Arbeitsstunden einsparen. Die Kunst der Schnittstellen-Entwicklung besteht darin, dass man sie so generisch wie möglich anlegt, ohne dass dabei Stabilität oder Zielsetzung verloren gehen. Nur dann bietet die Schnittstelle die Möglichkeit, von beiden Seiten aus erforderliche Änderungen vorzunehmen. Dabei ist vor allem sicherzustellen, dass der Code immer der Schnittstellen-Spezifikation folgt und nicht andersherum.
Die Entwicklung von Software für Mikrocontroller wie etwa der Renesas Synergy Plattform erfordert besondere Sorgfalt aufgrund der davon betroffenen Hardware-Schnittstellen. Jede Peripherieschaltung innerhalb des Mikrocontrollers ist so zu konfigurieren, dass sie die von der Software benötigten bzw. genutzten Daten liefern kann. Zudem müssen sämtliche nicht verwendeten Pins angesprochen werden. Betrachtet man jede dieser Peripherieschaltungen als Objekte innerhalb des Systems, dann lässt sich die Schnittstelle effektiv adressieren.
Bei der Sprach-Wahl sind Effizienz und Flexibilität wichtig
Die Wahl der Sprache für die Software-Erstellung wirkt sich auf das Software-Design aus. Die Entscheidung für eine dieser Optionen ist daher Teil der Architektur-Überlegungen, und sollte sich weniger danach richten, womit der Entwickler vertraut ist. Für einen Web-gestützten Einsatz ist Java sinnvoll. Bei manchen Anwendungen sind Skript-basierte Sprachen wie Python angemessen.
Für die meisten auf der Synergy-Plattform ausgeführten Embedded-Anwendungen empfiehlt sich eine Kodierung in C und C++. C++ bietet die nötige Flexibilität für den Umgang mit komplexen Architekturen, während es C erlaubt, kompakten und zielgerichteten Code zu schreiben, wenn Effizienz wichtig ist. Bei besonders anspruchsvollen Anwendungen mit eng definiertem Timing für einzelne Instruktionen sollte auch Assembler-Code in Betracht kommen.
:quality(80)/images.vogel.de/vogelonline/bdb/1321300/1321329/original.jpg)
Software-Design für gute Codequalität, Teil 2
Testing und Debugging von Embedded Code
Beim Einstieg in eine Design-Aufgabe entwickeln Ingenieure innovative Ideen, um das Beste bzw. wenigstens das Nächstbeste erstellen zu können. Die Ziele umfassen mehr Qualität, besseren Funktionsumfang oder einen günstigeren Preis. Dieser Prozess kann neue Methoden oder Techniken hervorbringen, doch besteht manchmal auch die Gefahr, dass die geleistete Entwicklungsarbeit frühere Ergebnisse wiederholt. In solchen Fällen scheint es nur, als ob „das Rad neu erfunden wurde“.
Wie bereits erwähnt, ist die Wiederverwendung oder eine Rekonfigurierung von Software eine gute Möglichkeit, das Beste aus einem Software-Investment zu machen. Meist trifft dies nur zu, wenn sich nachweisen lässt, dass sich die Software bewährt hat. Hier kommen drei weitere Definitionen ins Spiel:
COTS: Kommerzielle, einsatzbereite Hard- und Software-Komponenten (COTS - Commercial-off-the-Shelf), die sich in ein System einbinden lassen.
Bewährt (Proven): Getestet und verifiziert, um zu belegen, dass ein vorgegebener Standard erreicht wurde. Hier ist nachzuweisen, dass sich Hard- und Software-Komponenten bewährt haben.
Wert: Relativer Wert oder Nutzen einer Sache. Dies umfasst unter anderem den Geldwert. Gewonnenes Wissen, eingesparte Zeit, Qualität oder Erfahrung sind Beispiele für alternative Maßstäbe.
(ID:45017144)