
Geschäftsführer
7. Februar 2021

Die letzten Posts zu den beiden Prinzipien PoMO und IOSP waren eher theoretischer Natur. Deshalb möchte mich in diesem Post über das EVA-Prinzip an einer weiteren einfachen Aufgabe probieren und ein einfaches Informationssystem bauen. Hierzu habe ich die beliebteste Aufgabe auf SPOJ (SPhere Online Judge) herausgepickt. Bei der Aufgabe sollen Zahlen von der Konsole eingelesen und so lange auf dem Bildschirm ausgegeben werden, bis die Zahl 42 eingegeben wird. Die Zahl 42 ist deshalb so besonders, weil ein gewisser Anhalter, diese als Antwort auf die unklar gestellte Frage „nach dem Leben, dem Universum und dem ganzen Rest“ erhalten hat.
Die Aufgabe lässt sich leicht in folgende Teilschritte zerlegen:
- Zahlen von der Konsole einlesen
- Zahlen vor Eingabe der 42 ermitteln
- Zahlen auf der Konsole Ausgeben
Die Aufgabe erinnert dabei an das klassische EVA-Prinzip.
Was ist das EVA-Prinzip?
Das EVA‑Prinzip in der Informatik beschreibt den Ablauf eines Systems in drei Schritten: Eingabe, Verarbeitung, Ausgabe. Bei der Eingabe werden Daten erfasst, in der Verarbeitung nach definierten Regeln bearbeitet, und als Ausgabe entstehen die Ergebnisse, die zum Beispiel angezeigt, gespeichert oder weitergeleitet werden. Dies trifft quasi auf so gut wie jedes Software-Problem zu.
Lösung im Flow Design
Weshalb sich EVA auch in meinem Flow Design-Entwurf widerspiegelt. Eine mögliche Lösung für die hier gestellte Aufgabe nach Flow Design sieht dann wie folgt aus:

Flow Design für 42
In diesem Flow Design sind schön die einzelnen Teilschritte in Form von Funktionseinheiten zu sehen. Jede der Funktionseinheiten ist in diesem Falle so einfach, dass diese direkt als Operation implementiert werden kann. Eine weitere Zerlegung ist somit nicht notwendig. Zwischen den Funktionseinheiten fließen jeweils beliebig viele Zahlen (0-n). Dies wird durch das Sternchen (*) gekennzeichnet. Eine Umsetzung eines solchen Datenflusses kann z. B. in C# mit dem Interface IEnumerable<int> erfolgen.
Die Integration übernimmt in diesem Falle die Main-Methode. Bei der Konsole handelt es sich genau genommen um eine Ressource. Der Zugriff darauf, und damit die Abhängigkeit, kann in Flow Design modelliert werden. Aus diesem Grund sieht das vollständige Diagramm dann so aus:

Vollständiges Flow Design für 42
Die Umsetzung dieses Flow-Designs kann dann so aussehen (https://github.com/KevinErath/FindTheAnswer):
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
var numbers = ReadNumbersFromCmd();
var answer = FindTheAnswer(numbers);
PrintNumbers(answer);
}
public static IEnumerable<int> ReadNumbersFromCmd()
{
while (true)
{
var line = Console.ReadLine();
yield return int.Parse(line);
}
}
private static IEnumerable<int> FindTheAnswer(IEnumerable<int> numbers)
{
return numbers.TakeWhile(x => x != 42);
}
private static void PrintNumbers(IEnumerable<int> numbers)
{
foreach (var number in numbers)
{
Console.WriteLine(number);
}
}
}Auf Tests habe ich, aufgrund der Einfachheit des Codes, an dieser Stelle verzichtet. Außerdem wird die Lösung bei Einreichung durch SPOJ selbst getestet. Dort wird sie nach erfolgreichem Test in einem Ranking veröffentlicht. Unter allen damals eingereichten Lösungen (Sprachen übergreifend) ist die Variante doch weit abgeschlagen. Vermutlich, da bei einer .NET Anwendung erst die Laufzeitumgebung initialisiert werden muss und ein JIT-Compiling durchgeführt wird. Gefiltert auf C# Lösungen befand sich die Lösung in 2015 hingegen im Mittelfeld.

Ranking.png Screenshot des Rankings auf der Webseite SPOJ
Für die Bewertung scheint auf SPOJ hauptsächlich die Performance zu zählen. Das Ergebnis verwundert deshalb auch nicht ganz. Habe ich die Lösung doch auf mehrere Methoden verteilt, LINQ verwendet und ein nicht zwingend notwendiges int-Parsing durchgeführt. Vermutlich letzteres ist hier der größte Bremser. Was letztendlich aber wirklich der Zeitfresser ist, müsste jetzt mit einem Profiler ermittelt werden. Einen guten Blog-Artikel zum Thema Performance-Messung habe ich damals hier gelesen.
Trotz der durchwachsenen (Performance-)Bewertung favorisiere ich am Ende des Tages trotzdem die hier vorgestellte Lösung, da sie für mich eine saubere Struktur aufweist.
Anmerkung: Bei diesem Text handelt es sich um einen überarbeiteten Repost eines alten Blog-Artikels aus 2015 von mir.

Kevin Erath
Ich bin Mitgründer und Geschäftsführer von pep.digital und bringe über 20 Jahre Erfahrung in der Entwicklung individueller Unternehmenssoftware ein. Seit 2004 lehre ich an der Hochschule Esslingen (Fakultät Informatik) und wurde 2025 für meine langjährige Lehrtätigkeit geehrt. Meine Vorlesungen zu Clean Software und Systemarchitekturen mit .NET verbinden Praxisnähe mit einem hohen Qualitätsanspruch. Als Microsoft Certified Trainer leitete ich viele Jahre ein Academic Center und habe im Laufe der Zeit zahlreiche Studierende in Praxissemestern und Abschlussarbeiten betreut. Heute unterstütze ich mittelständische und große Unternehmen dabei, ihre Softwarelandschaften zukunftssicher auszurichten, von der KI-Integration bis zur NIS2-Compliance. Technik ist für mich kein Selbstzweck, sondern ein Werkzeug für nachhaltige und durchdachte Lösungen.
Quellen
- [1]https://pep-digital.de/blog/das-prinzip-der-gegenseitigen-nichtbeachtung
- [2]https://pep-digital.de/blog/zwischen-integration-und-operation-trennen
- [3]http://www.spoj.com/problems/TEST/
- [4]http://de.wikipedia.org/wiki/Per_Anhalter_durch_die_Galaxis_%28Romanreihe%29
- [5]http://de.wikipedia.org/wiki/42_%28Antwort%29
- [6]http://de.wikipedia.org/wiki/EVA-Prinzip
- [7]https://github.com/KevinErath/FindTheAnswer
- [8]http://de.wikipedia.org/wiki/Profiler_%28Programmierung%29#Messen_von_Geschwindigkeit
- [9]http://www.hanselman.com/blog/ProperBenchmarkingToDiagnoseAndSolveANETSerializationBottleneck.aspx
Weitere interessante Artikel
Wir möchten hier nicht nur über Neuigkeiten aus dem Unternehmen berichten, sondern auch das Wissen und die Erfahrung unserer Experten teilen.

Ein Headless CMS trennt, was traditionelle Systeme wie WordPress fest zusammenhalten: die Verwaltung von Inhalten und ihre Darstellung – und schafft damit eine Flexibilität, die moderne Anwendungen brauchen. Content-Management-Systeme ermöglichen es auch technisch unbedarften Nutzern, Inhalte zu publizieren. Traditionelle CMS legen den Fokus auf das Web und können nur schwer in Anwendungen integriert werden. Mit einem Headless CMS werden diese Limitierungen überwunden, ohne dass das Pflegen der Inhalte darunter leidet. Auch wir setzen auf Headless CMS, wenn der Kunde eine individuelle Lösung mit umfangreicher Content-Pflege benötigt.

Kevin Erath
Geschäftsführer

Das EVA-Prinzip, bestehend aus Eingabe, Verarbeitung und Ausgabe, beschreibt ein grundlegendes Prinzip für Informationssysteme. Dies kommt selbst bei komplexen Suchen wie der 42 zum Einsatz.

Kevin Erath
Geschäftsführer








.webp&w=3840&q=90)





