Über Effektivität, Effizienz, Agilität und Nachhaltigkeit
2014-07-27
Swift: Unterscheidung statt Vererbung
Vererbung ist ein zentraler Bestandteil fast aller Objekt-orientierter Programmiersprachen. Verwendet wird sie in der Regel für Spezialisierungen von Klassen mit der sogenannten "Ist-ein"-Beziehung. Doch nicht jede "Ist-ein"-Beziehung lässt sich sinnvoll mittels Vererbung abbilden. Ein typisches Beispiel mit alternativer Abbildung.2014-07-20
99 Bottles of Beer (Swift)
Swift ist die neue Programmiersprache für Apples Plattformen. Dieses einfache Beispiel soll dabei helfen, sich mit der Syntax und den Features vertraut zu machen.2014-07-13
The Power of Swift
Swift ist eine neue – jedoch keineswegs experimentelle – Programmiersprache. Einordnen lässt sie sich am Ehesten neben Java und C#. Doch wie schlägt sie sich bei Ausdrucksstärke gegenüber Sprachen wie Ruby? Ein Vergleich ohne Ergebnis.2014-07-06
Kontextwechsel
Die Kosten für Kontextwechsel sind eines der wichtigsten Argumente für die asynchrone Programmierung. Doch wie teuer sind heutzutage Kontextwechsel tatsächlich? Ein kleines Testprogramm schafft Klarheit.2014-06-29
Swift: 10 bestechende Sprachmerkmale
Zehn herausragende Features, die Swift von anderen Mainstream-Programmiersprachen abgrenzt, und wegweisend für die zeitgerechte Softwareentwicklung sein können..2014-06-22
Swift: Die Rückkehr der Referenz-Zähler
Garbage Collection ist in Programmiersprachen seit einigen Jahren allgegenwärtig. Die neue und nicht zu unterschätzende Programmiersprache Swift hat sich allerdings dagegen ausgesprochen und setzt stattdessen auf altbewährte Referenz-Zählung. Entzündet sich hier erneut ein alter Wettstreit?2014-06-15
Java: Swing und CompletableFuture
Die Klasse CompletableFuture ist neu in der Standardbibliothek von Java 8, und unterstützt die asynchrone Programmierung. Die Klasse lässt sich auf vielfache Weise einsetzen. Dass sie auch für die Programmierung mit Swing – sowie anderen Frameworks mit Event-Dispatch-Thread – interessant ist, zeige ich in diesem Beitrag.2014-06-08
Java: Thread-safe Lazy Initialization
Es gibt in Java viele Möglichkeiten, die Lazy Initialization umzusetzen. Doch die meisten sind entweder schwierig zu verstehen oder ineffizient. Eigentlich sollte die Standardbibliothek von Java diese Anforderung direkt unterstützen. Wie das aussehen könnte zeigt dieser Artikel.2014-06-01
C++: Reduce und Collect
Was in Java Stream::reduce und Stream::collect ist, ist std::accumulate in C++. Ein genauerer Blick auf dieses Funktionstemplate deckt jedoch Schwächen beim Umgang mit R‑Value-Referenzen auf. Anscheinend wurde die Spezifikation mit C++11 nicht angepasst. Dieser Artikel zeigt Alternativen.2014-05-25
Java 8: Stream::reduce vs. Stream::collect
Die Schnittstelle java.util.stream.Stream der mit Java 8 eingeführten Stream-API besitzt zwei Methoden, die sehr ähnlich aussehen und doch sehr unterschiedlich sind: reduce und collect. In diesem Artikel betrachte ich, was die beiden Methoden tatsächlich gemeinsam haben – und viel wichtiger – was sie unterscheidet. Denn Letzteres ist in vielen Fällen nicht so offensichtlich, wie es vielleicht sein sollte.2014-05-18
Java 8: IntStream – der Stream-Macher
Java 8 hat vier unterschiedliche Schnittstellen für Streams eingeführt: Die generische Schnittstelle Stream<T> für Referenztypen, sowie die drei Schnittstellen IntStream, LongStream und DoubleStream für primitive Typen. Doch eine dieser Schnittstellen ist besonders: Was die Zählschleife unter den Schleifen ist, ist der IntStream unter den Streams. Fünf Beispiele zur Verwendung.2014-05-11
C++: Race Conditions am laufenden Band
Mit dem Begriff Race Condition werden häufig Programmfehler assoziiert, die vom zeitlichen Verhalten abhängen, und aufgrund ihrer schlechten Reproduzierbarkeit nur schwer auffindbar sind. Doch was passiert, wenn man fortlaufend Race Conditions erzeugt? Ein Beispiel.2014-05-04
C++ vs. Java: Lambda ist nicht gleich Lambda
C++ unterstützt Lambda-Ausdrücke seit C++11 und Java seit der vor einigen Wochen freigegebenen Version 8. Doch trotz gleicher Termini unterscheidet sich die Semantik der beiden Umsetzungen deutlich. Dieser Artikel widmet sich dem wesentlichen Unterschied, den Entwickler kennen sollten, die in beiden Sprachen unterwegs sind.2014-04-27
GCC 4.9: Farbenfrohe Fehlermeldungen
Zu den Neuerungen von GCC 4.9 gehört unter anderem die Option -fdiagnostics-color für farbige Fehlermeldungen. Dieses Feature ist zwar nicht weltbewegend, doch zumindest beachtenswert. Denn die Farben helfen überraschend gut, auf die wesentlichen Informationen zu fokussieren, und damit das eigentliche Problem schneller zu identifizieren. Ein Beispiel.2014-04-20
std::map: emplace und die kontrollierte Objekterzeugung
Seit C++11 besitzen viele Container der Standardbibliothek eine oder mehrere emplace-Funktionen, mit denen sich Objekte an Ort und Stelle erzeugen lassen. Auch std::map bietet mit emplace und emplace_hint zwei solcher Funktionen. In diesem Artikel betrachte ich, wie sich unnötige Objekterzeugungen beim Einfügen von Elementen in eine std::map vermeiden lassen, und welche Rolle emplace dabei spielt.2014-04-13
Java: Über Arrays in Schnittstellen
Sollte man Arrays als Parameter- oder Rückgabetypen in Schnittstellen verwenden? Das ist eine gute Frage. Doch was auch immer die Antwort ist, die Argumentation sollte weder Objekt-Orientierung, Typsicherheit noch Performance sein. Ein Kommentar.2014-04-06
Zeitrechnung
Warum gibt es so viele Softwarefehler im Zusammenhang mit Zeitrechnung? Was ist nur so kompliziert an dem Ding, das sich den ganzen Tag im Kreis dreht? Möglicherweise liegt genau hier das Problem: So einfach ist es nicht, und ein paar Beispiele sollen zeigen, wie leicht man sich täuschen kann.2014-03-30
C++: Höherwertige Container
Die Standardbibliothek von C++ enthält zahlreiche Container für Listen, Mengen und assoziative Felder. Höherwertige Datenstrukturen sucht man dort allerdings vergebens. Viele Anwendungsfälle lassen sich dennoch durch geeignete Kombination der verfügbaren Container realisieren. Eine LRU-Datenstruktur im Eigenbau.2014-03-23
C++: Wann sollten Funktionen noexcept deklariert werden?
C++11 hat mit noexcept eine Alternative zu den unbeliebten throw-Deklarationen eingeführt. Die Semantik von noexcept ist sehr einfach. Unklarheit herrscht dagegen noch über den richtigen Einsatz. Daher ist es höchste Zeit, zumindest ein paar Leitplanken vorzugeben.2014-03-16
C++: Automatische Erkennung von Data Races
Die Abwesenheit von Data Races ist in C++ die wichtigste Voraussetzung für die Korrektheit paralleler Programme. Doch viele Entwickler tun sich damit überraschend schwer. Sinnvolle Unterstützung bieten mittlerweile sowohl GCC als auch Clang: Ein Beispiel für die automatische Erkennung von Data Races anhand eines fehlerhaften Double-checked Locking.2014-03-09
C++: const Type&&
Wer sich mit der Move-Semantik von C++11 auseinandergesetzt hat, kennt die Möglichkeiten der R‑Value-Referenzen. Doch wofür sind eigentlich const R‑Value-Referenzen gut? Zumindest einen wichtigen Einsatzbereich gibt es!2014-03-02
The Power of Java 8
An Java wird häufig kritisiert, wie viel Code selbst für einfache Aufgaben notwendig ist. Sehr beliebt sind Vergleiche mit Skript-Sprachen oder Abkömmlingen auf der JVM. Ob diese Vergleiche nun fair sind, sei dahingestellt. Nichtsdestotrotz schließt Java 8 auf. Ein Beispiel.2014-02-23
Lambda-Ausdrücke und Methoden-Referenzen: Vergleich von Java 7 mit Java 8
Es gibt zahlreiche Leute, die sich kritisch zu den mit Java 8 eingeführten Lambda-Ausdrücken und Methoden-Referenzen äußern. Außer Frage steht, dass der übermäßige Einsatz kontraproduktiv ist. Das sollte einem jedoch nicht den Blick auf die Vorteile verstellen, die Vergleiche zwischen Java 7 und Java 8 deutlich zeigen. Zwei Beispiele.2014-02-16
Die 5 wichtigen Neuerungen in Subversion 1.8
Apache Subversion 1.8 wurde bereits vor über sechs Monaten veröffentlicht. Höchste Zeit also sich mit der neuen Version auseinanderzusetzen und die wichtigsten Neuerungen hervorzuheben. Zusammengefasst: Im Mittelpunkt stehen Verbesserungen bei der Usability, um die effiziente und effektive Verwendung von Subversion zu unterstützen.2014-02-09
C++1y: Quoted Strings
Hinter dem qualifizierten Bezeichner std::quoted werden sich in der kommenden C++-Version drei überladene Funktionstemplates verbergen. Diese Erweiterung ist als "Quoted Strings" bekannt und erfüllt eigentlich nur einen einzigen Zweck: Sie erleichtert Anfängern den Einstieg in C++. Ein Beispiel.2014-02-02
Die dunkle Seite der Non-Blocking I/O
Non-Blocking I/O and single-threaded Event Loop: Dieses Programmiermodell hat mit vielen guten Beispielen einen wahrhaften Hype ausgelöst. Doch klar ist auch: "Wo viel Licht ist, ist starker Schatten." Ein paar unterschätzte und vergessene Probleme.2014-01-26
java.time: Der 3. Versuch
Zuerst Date, dann Calendar, GregorianCalendar und ZimeZone, und nun über 1 600 Methoden verteilt auf knapp 70 öffentliche Klassen, Schnittstellen und Enums im Paket java.time. Muss das wirklich sein?2014-01-19
Java: Multithreading ganz einfach!
Parallelprogrammierung mit Threads und Shared-Memory ist einfacher als Viele denken. Am Beispiel eines minimalen Webcrawlers zeige ich, dass das auch für untypische Fälle gilt – vorausgesetzt der Code hat eine klare Struktur.2014-01-12
Entwurfsprinzip: Best Effort
Der Ausdruck "Best Effort" steht in der Informatik für das Prinzip der Wertsteigerung durch bewusst geringere Güte aufgrund beschränkter Kapazitäten. In vielen Bereichen hat sich dieses Prinzip bewährt. Beim Softwareentwurf wird es jedoch häufig vernachlässigt. Ein Beispiel zur Motivation.2014-01-05
Technologiewechsel 2014: Dos & Don'ts
Der Jahreswechsel ist ein guter Zeitpunkt, um über Veränderungen innerhalb der nächsten 12 Monaten nachzudenken. Daher gebe ich in diesem Artikel einige Ratschläge zu Technologiewechseln, die man 2014 in größeren Softwareprojekten angehen sollte, und zu solchen, von denen man besser die Finger lässt.2013-12-29
Das Ende der Checked Exception
Die "Checked Exceptions" von Java gehören in die Kategorie "Gut gemeint". Die Probleme waren schon lange offensichtlich, doch mittlerweile sind die Schmerzen so groß, dass eine Abkehr unumgänglich ist. Und tatsächlich deutet sich dieser Weg mit Java 8 an.2013-12-22
Java 8 und java.util.Optional<T>
Java 8 führt die generische Klasse Optional<T> ein, mit der sich interessanterweise viele NullPointerExceptions vermeiden ließen – zumindest bei konsequenter Verwendung. Letzteres ist nicht absehbar, und dennoch lohnt sich ein Blick auf diesen Ansatz.2013-12-15
Java 8: Erweiterung von java.util.Comparator
Java 8 erweitert die Comparator-Schnittstelle um zahlreiche statische und Default-Methoden. In Zusammenhang mit Lambda-Ausdrücken und Methoden-Referenzen soll dadurch die Implementierung der Schnittstelle deutlich einfacher werden. Wie das aussieht, zeige ich an einigen Beispielen.2013-12-08
Java 8: Beispiele zur Stream-API
Die Einführung der sogenannten Stream-API ist die größte Änderung der Standardbibliothek in Java 8. Mit ihr sollen Zugriffe auf Daten vereinfacht werden. Doch lohnt sich dafür tatsächlich eine so komplexe API? Fünf Beispiele mit einer Gegenüberstellung zu SQL-Abfragen verschaffen einen ersten Eindruck.2013-12-01
Java 8: Iterable, Collection und List
Java 8 bessert mit Default-Methods an zahlreichen Stellen die in die Jahre gekommene Standardbibliothek nach. Die entsprechenden Erweiterungen von Iterable, Collection und List beschreibe ich in diesem Artikel.2013-11-24