Benutzer-Werkzeuge

Webseiten-Werkzeuge


se:programmierung

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

se:programmierung [2009-01-30 14:41]
stefan
se:programmierung [2014-04-05 11:42]
Zeile 1: Zeile 1:
-====== Tipps zur (objektorientierten) Programmierung ====== 
  
-===== Werkzeuge ===== 
-  * kenne deine Werkzeuge (z.B. die IDE) in- und auswendig -> höhere Produktivität 
-  * benutze das richtige Werkzeug für deine Aufgaben und schaue dich ständig nach besseren Werkzeugen um 
-    * lerne mehrere Programmiersprachen und wähle die passende für deine Aufgaben 
- 
-===== Namensgebung ===== 
-**nach {[quellen:​Goodliffe2008|S. 43ff.]}** 
-  * Klarheit ist wichtiger als Kürze. 
-  * Funktionen sollten aus einer externen Sichtweise heraus benannt werden und die logische Operation beschreiben,​ nicht die Implementierung. 
-  * Vermeide Redundanzen in Namen (insb. ''​class'',​ ''​data'',​ ''​object'',​ ''​type''​)! 
- 
-===== Defensive Programmierung ===== 
-**nach {[quellen:​Goodliffe2008|S. 6ff.]}** 
-  * Defensive Programmierung bedeutet vorsichtiges,​ überwachtes Programmieren. Jede Komponente wird so entwickelt, dass sie sich selbst so gut wie möglich schützt. Unsichere Annahmen werden eliminiert. 
-  * Defensive Programmierung ist **nicht** Fehlerbehandlung (sollte immer Standard sein!), Testen (stets Teil des Prozesses) und Debuggen (Finden von Fehlern, anstatt sie zu vermeiden)! 
-  * Programmiere mit Bedacht und vertraue niemandem (auch nicht dir selbst)! 
-  * "​Readability is the best single criterion of program quality."​ {[quellen:​Goodliffe2008|S. 17]} 
-  * Benutze ein gutes Logging-Tool! 
-  * Beispiele 
-    * Assert der Vor- und Nachbedingungen und der Invarianten 
-    * entsprechende Datentypen für nicht-negative Zahlen verwenden (z.B. ''​unsigned int''​) um aufwändige Prüfungen des Wertebereichs zu vermeiden 
-    * Rückgabewerte von Funktionen immer prüfen (wofür sind sie sonst da?) 
-    * ''​default''​-Zweig von ''​switch''​-Anweisungen explizit implementieren/​dokumentieren 
-    * Wertebereiche von Variablen im Hinterkopf behalten bei der Wahl eines Datentyps 
- 
-===== Bugfixing ===== 
-  * für jeden gefundenen Bug wird eine entsprechende Assertion eingefügt, damit ein erneuter Verstoß gegen die Rahmenbedingungen sofort auffällt 
- 
-===== Codeoptimierungen ===== 
-(siehe [[algorithmendatenstrukturen#​codeoptimierungen|Skript Datenstrukturen und Algorithmen]]) 
-  * **Constant Propagation**:​ wo es geht Konstanten anstatt von Variablen verwenden 
-  * **Common Subexpression Elimination**:​ einmalige Berechnung gleicher Ausdrücke 
-  * **Operator Strength Reducing**: Bitshifts beim Rechnen mit Zweierpotenzen verwenden 
-  * **Copy Propagation**:​ keine überflüssigen oder doppelten Berechnungen 
-  * **Loop Strength Reduction**:​ Vermeiden überflüssiger Schleifendurchläufe durch Verwenden des passenden Inkrements (z.B. ''​i += 10''​ anstatt ''​i++''​) 
-  * **Invariant Code Motion**: Entfernen invarianter Ausdrücke (Berechnungen mit immer gleichem Ergebnis in der Schleife oder dem Schleifenkopf) aus Schleifen 
-  * **Loop Jamming**: Zusammenfassen mehrerer Schleifen zu einer 
-  * Vermeidung unnötiger Indexzugriffe auf Arrays (da interne Multiplikationen zur Ermittlung des Speicherplatzes nötig) 
-  * keine überflüssigen Funktionsaufrufe (Operatoren sind meist schneller) 
- 
-===== Designprinzipien ===== 
-**nach {[quellen:​Bleek2008|S. 87]}** 
-  * **Don'​t Repeat Yourself (DRY)**: Funktionen werden nur einmal implementiert und nicht mehrmals (womöglich gar durch Copy-and-Paste) -> Modularisierung,​ bessere Wartbarkeit 
-  * **Speaking Code Principle (SCP)**: der Code muss auch ohne Kommentare verständlich sein -> bessere Wartbarkeit,​ einfachere Einarbeitung anderer Entwickler 
-  * **Separation of Concerns (SoC)**: jedes Modul hat genau eine Aufgabe -> Modularisierung,​ bessere Wartbarkeit,​ DRY 
-  * ** Tell, don't ask (TDA)**: Klassen sollten nicht nach Werten gefragt, sondern aufgefordert werden, eine Funktion zu liefern (z.B. nicht MwSt-Satz abfragen, sondern auffordern, Mehrwertsteuer zu berechnen) -> verhindert ausufernde Abhängigkeiten zu anderen Klassen, evtl. jedoch Konflikt zu SoC 
- 
-==== ToDo ==== 
-  * Single Responsibility Principle 
-  * Open Closed Principle 
-  * Liskov Substitution Principle 
-  * Interface Segregation Principle 
-  * Dependency Inversion Principle 
-  * Law of Demeter 
-  * Test-first 
se/programmierung.txt · Zuletzt geändert: 2014-04-05 11:42 (Externe Bearbeitung)