{"id":27,"date":"2025-10-06T09:49:48","date_gmt":"2025-10-06T09:49:48","guid":{"rendered":"https:\/\/docs.pedagotchi.de\/?post_type=docs&#038;p=27"},"modified":"2025-10-08T08:46:31","modified_gmt":"2025-10-08T08:46:31","password":"","slug":"module-first-ansatz","status":"publish","type":"docs","link":"https:\/\/docs.pedagotchi.de\/index.php\/docs\/module-first-ansatz\/","title":{"rendered":"Module-first-Ansatz"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Die App wird nach thematischen\/gesch\u00e4ftlichen Dom\u00e4nen geschnitten, nicht nach technischen Schichten. Statt \u201ealle Controller hier, alle Stores dort\u201c wird gruppiert, was zu einem Feature geh\u00f6rt und als Modul definiert. Module kapseln Controller, Stores, Modelle und Repositories; der zentrale Context stellt sie bereit, steuert Navigation und h\u00e4lt die UI schlank. Das erleichtert Erweiterungen, h\u00e4lt Abh\u00e4ngigkeiten gering und sorgt f\u00fcr konsistente, testbare Datenfl\u00fcsse.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Idee<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Fachlich geschnittene Einheiten<\/strong>: Features werden als Module gedacht und implementiert. Jedes Modul b\u00fcndelt Controller, Stores, Modelle und Repositories f\u00fcr seinen Fachbereich.<\/li>\n\n\n\n<li><strong>Klare Grenzen<\/strong>: UI konsumiert Module \u00fcber den zentralen Controller, statt quer \u00fcber einzelne Services zu greifen. Das erh\u00f6ht \u00dcbersicht, Testbarkeit und Austauschbarkeit.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Struktur<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Konfiguration<\/strong>: Die aktive Modullandschaft ist in\u00a0<code>@configs\/moduleConfig<\/code>\u00a0definiert. Routen stehen in\u00a0<code>@configs\/routeConfig<\/code>.<\/li>\n\n\n\n<li><strong>Bereitstellung<\/strong>: Der\u00a0<code>ContextController<\/code>\u00a0erzeugt und l\u00e4dt Module beim App\u2011Start. \u00dcber den Provider\u00a0providers\/ContextControllerProvider.tsx\u00a0stehen sie global zur Verf\u00fcgung.<\/li>\n\n\n\n<li><strong>Zugriff in der UI<\/strong>: Screens greifen per\u00a0useContextControllerProvider()\u00a0auf\u00a0modules\u00a0zu, z. B.\u00a0<code>modules.core.controllers.authController<\/code>\u00a0oder zugeh\u00f6rige Stores\/Repos.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Lebenszyklus<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beim Start liest der\u00a0<code>ContextController<\/code>\u00a0<code>moduleConfig<\/code>, initialisiert Module (Controller, Stores, Repos) und setzt\u00a0<code>loaded<\/code>, sobald alles bereit ist.<\/li>\n\n\n\n<li>Der Provider gate\u2019t das Rendering bis\u00a0<code>loaded<\/code>\u00a0true ist. Erst dann nutzt die UI die modularen APIs.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Navigation und Routen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Routen verweisen logisch auf Module (z. B. Auth\u2011Bereich unter\u00a0<code>app\/auth\/<\/code>).<\/li>\n\n\n\n<li>Navigation l\u00e4uft bevorzugt \u00fcber den zentralen\u00a0<code>routeController<\/code>\u00a0(injizierte Expo\u2011Router\u2011Funktionen), der modul\u00fcbergreifend Guards, Tracking und Regeln anwenden kann.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Kommunikation zwischen Modulen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Inter\u2011Modul\u2011Aufrufe erfolgen \u00fcber den\u00a0<code>ContextController<\/code>\u00a0bzw. klar definierte Controller\u2011APIs.<\/li>\n\n\n\n<li>Stores liefern nur beobachtbaren Zustand; fachliche Abh\u00e4ngigkeiten werden \u00fcber Controller\u2011Schnittstellen gekapselt, nicht \u00fcber direkte Store\u2011Kopplung.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Vorteile<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Isolation<\/strong>: \u00c4nderungen bleiben im Modul; geringere Seiteneffekte.<\/li>\n\n\n\n<li><strong>Skalierbarkeit<\/strong>: Neue Features entstehen als neue Module ohne Ber\u00fchrung mit bestehenden.<\/li>\n\n\n\n<li><strong>Wartbarkeit<\/strong>: Einheitliche Orte f\u00fcr Logik (Controller), Zustand (Stores), Datenzugriff (Repositories).<\/li>\n\n\n\n<li><strong>Ownership<\/strong>: Teams k\u00f6nnen Module unabh\u00e4ngig warten und deployen (Backendschnittstellen via Directus bleiben stabil).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Neues Modul hinzuf\u00fcgen (High\u2011Level)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>1. Konfiguration<\/strong>: Eintrag in\u00a0<code>@configs\/moduleConfig<\/code>\u00a0(Name, Controller\/Store\/Repo\u2011Wiring).<\/li>\n\n\n\n<li><strong>2. Routen<\/strong>: Dateien\/Ordner in\u00a0<code>app\/&lt;modul>\/<\/code>\u00a0anlegen; falls n\u00f6tig gemeinsames Layout\u00a0_layout.tsx.<\/li>\n\n\n\n<li><strong>3. Implementierung<\/strong>: Controller (Use\u2011Cases, Navigation), Stores (MobX\u2011State), Repositories (Directus\u2011Zugriff), Modelle (Typen).<\/li>\n\n\n\n<li><strong>4. Integration<\/strong>: \u00dcber\u00a0useContextControllerProvider()\u00a0in Screens auf\u00a0<code>modules.&lt;modul>.*<\/code>\u00a0zugreifen.<\/li>\n\n\n\n<li><strong>5. Tests<\/strong>: Controller\/Repos modular testen; UI als\u00a0<code>observer<\/code>\u2011Komponenten gegen Mock\u2011Controller laufen lassen.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Kurzbeispiel Zugriff (konzeptionell)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ In einem Screen\nconst { modules, routeController } = useContextControllerProvider();\n\nawait modules.core.controllers.authController.onPressLogin();\nrouteController.navigateToNext(\"(home)\");<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Die App wird nach thematischen\/gesch\u00e4ftlichen Dom\u00e4nen geschnitten, nicht nach technischen Schichten. Statt \u201ealle Controller hier, alle Stores dort\u201c wird gruppiert, was zu einem Feature geh\u00f6rt und als Modul definiert. Module kapseln Controller, Stores, Modelle und Repositories; der zentrale Context stellt sie bereit, steuert Navigation und h\u00e4lt die UI schlank. Das erleichtert Erweiterungen, h\u00e4lt Abh\u00e4ngigkeiten gering [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"doc_category":[4],"doc_tag":[],"class_list":["post-27","docs","type-docs","status-publish","hentry","doc_category-architekturueberblick"],"year_month":"2026-05","word_count":416,"total_views":0,"reactions":{"happy":0,"normal":0,"sad":0},"author_info":{"name":"jon","author_nicename":"jon","author_url":"https:\/\/docs.pedagotchi.de\/index.php\/author\/jon\/"},"doc_category_info":[{"term_name":"Architektur\u00fcberblick","term_url":"https:\/\/docs.pedagotchi.de\/index.php\/docs-category\/architekturueberblick\/"}],"doc_tag_info":[],"_links":{"self":[{"href":"https:\/\/docs.pedagotchi.de\/index.php\/wp-json\/wp\/v2\/docs\/27","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/docs.pedagotchi.de\/index.php\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/docs.pedagotchi.de\/index.php\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/docs.pedagotchi.de\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/docs.pedagotchi.de\/index.php\/wp-json\/wp\/v2\/comments?post=27"}],"version-history":[{"count":3,"href":"https:\/\/docs.pedagotchi.de\/index.php\/wp-json\/wp\/v2\/docs\/27\/revisions"}],"predecessor-version":[{"id":106,"href":"https:\/\/docs.pedagotchi.de\/index.php\/wp-json\/wp\/v2\/docs\/27\/revisions\/106"}],"wp:attachment":[{"href":"https:\/\/docs.pedagotchi.de\/index.php\/wp-json\/wp\/v2\/media?parent=27"}],"wp:term":[{"taxonomy":"doc_category","embeddable":true,"href":"https:\/\/docs.pedagotchi.de\/index.php\/wp-json\/wp\/v2\/doc_category?post=27"},{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/docs.pedagotchi.de\/index.php\/wp-json\/wp\/v2\/doc_tag?post=27"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}