<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Devcartes - Praxis</title>
      <link>https://devcartes.de</link>
      <description></description>
      <generator>Zola</generator>
      <language>de</language>
      <atom:link href="https://devcartes.de/categories/praxis/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Thu, 01 Oct 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Godot jenseits von Spielen: Intro</title>
          <pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate>
          <author>Tristan</author>
          <link>https://devcartes.de/blog/desktop-application-with-godot-intro/</link>
          <guid>https://devcartes.de/blog/desktop-application-with-godot-intro/</guid>
          <description xml:base="https://devcartes.de/blog/desktop-application-with-godot-intro/">&lt;h2 id=&quot;einleitung&quot;&gt;Einleitung&lt;/h2&gt;
&lt;p&gt;Eine Game Engine nutzen, um eine Desktop Anwendung zu schreiben?&lt;/p&gt;
&lt;p&gt;Klingt auf den ersten Blick abwegig, aber gerade Godot eignet sich aus mehreren Gründen extrem gut dafür.&lt;/p&gt;
&lt;h2 id=&quot;warum-godot&quot;&gt;Warum Godot&lt;/h2&gt;
&lt;p&gt;Dass man ausgereifte und komplexere Desktopanwendungen mit Godot bauen kann, zeigt der &lt;strong&gt;Editor&lt;/strong&gt; für die Godot Engine, der nämlich ebenfalls in Godot geschrieben ist.
Außerdem hat Godot eine sehr gute &lt;strong&gt;Crossplattform-Unterstützung&lt;/strong&gt;, was man auch daran sieht, dass der Editor sowohl im Browser, als auch für mobile Endgeräte zur Verfügung steht.
Gerade auch die &lt;strong&gt;geringe Größe&lt;/strong&gt; der ausführbaren Dateien macht Godot zu einer interessanten Engine für mobile Geräte und das Web.
Auch GUIs lassen sich mit dem Editor oder dynamisch aus dem Code sehr einfach bauen und zwar ohne großen Aufwand &lt;strong&gt;responsive&lt;/strong&gt;.
Das ist bei anderen etablierten Desktop-GUI-Frameworks (z.B. Delphi oder .NET) nicht immer so einfach.
Wer Bedenken wegen der Ressourcennutzung hat, für den hat Godot einen &lt;strong&gt;Low Processor Mode&lt;/strong&gt;, der dafür sorgt, dass das Bild seltener und nur bei Bedarf erneuert wird.&lt;/p&gt;
&lt;h2 id=&quot;proof-of-concept&quot;&gt;Proof of Concept&lt;/h2&gt;
&lt;p&gt;Ich schreibe aktuell eine kleine Desktopanwendung mit Godot, die in erster Linie als Proof of Concept (PoC) gedacht war, sich mittlerweile aber als sehr nützlich für mein Studium erwiesen hat.&lt;/p&gt;
&lt;p&gt;KOReader, eine beliebte eBook-Lese-App, speichert Lesestatistiken, Notizen und Highlights in einem bestimmten Format, die ich exportieren, aufbereiten und später zum Nachschlagen nutzen möchte.&lt;/p&gt;
&lt;h3 id=&quot;beispiel-export&quot;&gt;Beispiel-Export&lt;/h3&gt;
&lt;p&gt;Am Ende soll eine Datei herauskommen, die in etwa so aussieht, wie der beispielhafte Ausschnitt aus dem Buch &lt;em&gt;What is it like to be a bat&lt;/em&gt; von &lt;em&gt;Thomas Nagel&lt;/em&gt;. Um den Text soll es an dieser Stelle aber überhaupt nicht gehen, es sind auch keine echten Highlights oder Notizen, sondern nur Beispiele.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Title: What Is It Like to Be a Bat? / Wie ist es, eine Fledermaus zu sein?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Author: Thomas Nagel&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;===========================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Page 7 (yellow)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Das Thema ›Bewusstsein‹ macht das Leib-Seele-Problem praktisch unlösbar.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;===========================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Page 8 (yellow)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Es ist höchst unwahrscheinlich, dass irgendeines dieser mit dem Leib-Seele-Problem nicht verwandten Beispiele erfolgreicher Reduktion die Beziehung zwischen Psyche und Gehirn erhellen wird.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;===========================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Page 47 (yellow)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;But no matter how the form may vary, the fact that an organism has conscious experience at all means, basically, that there is something it is like to be that organism.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;===========================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Page 53 (yellow)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Yet if I try to imagine this, I am restricted to the resources of my own mind, and those resources are inadequate to the task.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;===========================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Page 55 (purple)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Our own experience provides the basic material for our imagination, whose range is therefore limited. It will not help to try to imagine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Note:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Das ist eine Notiz von mir an mich&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;===========================================================================&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;erklarung-zum-export&quot;&gt;Erklärung zum Export&lt;/h3&gt;
&lt;p&gt;Ich färbe meine Highlights und Notizen immer mit bestimmten Farben, die alle ihre eigene Bedeutung haben, um sie später einfacher zuordnen zu können.&lt;/p&gt;
&lt;p&gt;So kann ich ohne großen Aufwand und mit minimaler Unterbrechung Notizen beim Lesen machen und habe diese später in einer einfachen und sortierten Form vorliegen, die ich entweder ausdrucken oder digital weiterverwenden kann. Durch die Seitenzahlen finde ich die Textstellen schnell wieder.&lt;/p&gt;
&lt;h2 id=&quot;zum-ende&quot;&gt;Zum Ende&lt;/h2&gt;
&lt;p&gt;In diesem Artikel bin ich auf das &lt;strong&gt;Was&lt;/strong&gt; und &lt;strong&gt;Warum&lt;/strong&gt; eingegangen.
In den folgenden Artikeln werde ich auf das &lt;strong&gt;Wie&lt;/strong&gt; eingehen und &lt;strong&gt;Wo Godot nicht&lt;/strong&gt; die passende Wahl ist.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Guard Clauses</title>
          <pubDate>Sun, 23 Aug 2026 00:00:00 +0100</pubDate>
          <author>Tristan</author>
          <link>https://devcartes.de/blog/guard-clauses/</link>
          <guid>https://devcartes.de/blog/guard-clauses/</guid>
          <description xml:base="https://devcartes.de/blog/guard-clauses/">&lt;h2 id=&quot;einleitung&quot;&gt;Einleitung&lt;/h2&gt;
&lt;p&gt;Softwareentwickler aller Erfahrungsstufen, weltweit kennen das Problem:&lt;br /&gt;
Man schaut sich Code von Kollegen oder eigenen, älteren Code an und hat keine Ahnung, was dieser eigentlich macht.
Er ist so tief verschachtelt und nimmt so viele Abzweigungen, dass man überhaupt nicht mehr weiß, welches Kriterium nun zum Abbruch der Funktion geführt hat oder welchen Wert eine Variable zu Zeitpunkt des Ausstiegs hat.&lt;/p&gt;
&lt;p&gt;Viel schöner wäre es doch, wenn man seine Funktion lesen könnte wie ein Buch, von oben nach unten, und dabei auf einen Blick erkennen kann, an welcher Stelle die Funktion vorzeitig verlassen wird und warum.&lt;/p&gt;
&lt;p&gt;Eines der Werkzeuge, auch Patterns genannt, in der Softwareentwicklung, das genau diesem Zweck dient, nennt man Guard Clauses.&lt;/p&gt;
&lt;p&gt;Sie machen deinen Code sowohl lesbarer und wartbarer als auch robuster.&lt;/p&gt;
&lt;h2 id=&quot;was-sind-guard-clauses&quot;&gt;Was sind Guard Clauses&lt;/h2&gt;
&lt;p&gt;Guard Clauses (ins Deutsche frei übersetzt Schutzklausel), sind ein Pattern, bei dem man frühzeitig aus einer Funktion aussteigt, wenn eine bestimmte Bedingung eintritt, die die weitere Abarbeitung des Codes unnötig macht.&lt;/p&gt;
&lt;p&gt;Das Prinzip ist, dass man Ausnahmen zuerst behandelt und dann den eigentlichen Programmfluss.&lt;/p&gt;
&lt;p&gt;Entscheide selbst, welchen der beiden folgenden Codeabschnitte du lesbarer findest:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;if&lt;/span&gt;&lt;span&gt; user&lt;/span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;.&lt;/span&gt;&lt;span&gt;is_logged_in &lt;/span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    if&lt;/span&gt;&lt;span&gt; user&lt;/span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;.&lt;/span&gt;&lt;span&gt;has_permission &lt;/span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        if&lt;/span&gt;&lt;span&gt; user&lt;/span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;.&lt;/span&gt;&lt;span&gt;name &lt;/span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;Max&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;            // logik kommt hier&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; !&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;.&lt;/span&gt;&lt;span&gt;is_logged_in &lt;/span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; return&lt;/span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; !&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;.&lt;/span&gt;&lt;span&gt;has_permission &lt;/span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; return&lt;/span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;if&lt;/span&gt;&lt;span&gt; user&lt;/span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;.&lt;/span&gt;&lt;span&gt;name &lt;/span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;Max&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; return&lt;/span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;//logik kommt hier&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Wichtig!&lt;/strong&gt; Die Bedingungen der Guard Clauses sind &lt;strong&gt;logisch negiert&lt;/strong&gt;, da wir prüfen, wann wir &lt;strong&gt;nicht weitermachen&lt;/strong&gt; dürfen.&lt;/p&gt;
&lt;h2 id=&quot;wann-solltest-du-guard-clauses-nutzen&quot;&gt;Wann solltest du Guard Clauses nutzen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Wenn dein Code zu tief verschachtelt ist&lt;/li&gt;
&lt;li&gt;Bei Vorbedingungen (Preconditions), die den Rest der Funktion hinfällig machen (z.B. Null-Checks)&lt;/li&gt;
&lt;li&gt;Wenn die Ausnahmen klar vom Normalfall abgegrenzt werden können&lt;/li&gt;
&lt;li&gt;Wenn du Code von oben nach unten lesen willst, wie ein Buch&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;wann-solltest-du-guard-clauses-nicht-nutzen&quot;&gt;Wann solltest du Guard Clauses nicht nutzen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Wenn es nicht &lt;strong&gt;den einen Normalfall&lt;/strong&gt; gibt, sondern mehrere gleichwertige Zweige
&lt;ul&gt;
&lt;li&gt;z.B. wenn je nach User-Rolle unterschiedliche Logik ausgeführt werden soll (Zweige sind gleichwertig)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Wenn es viele Vorbedingungen (mehr als 5 - 6) gibt, dann lohnt es sich in eine eigene Validierungsfunktion auszulagern&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;best-practices&quot;&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Guard Clauses am Anfang der Funktion bündeln&lt;/li&gt;
&lt;li&gt;Eine Bedingung pro Guard Clause&lt;/li&gt;
&lt;li&gt;Aussagekräftige Fehler zurückgeben oder sauberes Logging statt stiller &lt;em&gt;returns&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Guards nicht schachteln&lt;/li&gt;
&lt;li&gt;Reihenfolge nach Wahrscheinlichkeit, statistisch häufige Fehler zuerst prüfen&lt;/li&gt;
&lt;li&gt;Trotzdem das &lt;strong&gt;Single Responsibility Principle&lt;/strong&gt; einhalten&lt;/li&gt;
&lt;li&gt;In Teams das Pattern klar als Standard definieren, das spart Zeit und Diskussionen im Code Review&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;schluss&quot;&gt;Schluss&lt;/h2&gt;
&lt;p&gt;Du siehst also, Guard Clauses sind ein sehr einfaches und nützliches Pattern, um deinen Code zu verbessern.
Sie reduzieren Verschachtelung und erhöhen somit die Lesbarkeit.&lt;/p&gt;
&lt;p&gt;Doch trotz der Einfachheit nutzen nicht alle erfahrenen Entwickler sie.&lt;/p&gt;
&lt;p&gt;Was denkst du, woran liegt das?&lt;br /&gt;
Liegt es vielleicht daran, dass viele Entwickler mit if-else-Verschachtelungen groß geworden sind und Guard Clauses sich fremd anfühlen?&lt;/p&gt;
</description>
      </item>
    </channel>
</rss>
