<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ged Bashiri</title>
    <description>The latest articles on DEV Community by Ged Bashiri (@ged_bashiri_f667fe2667068).</description>
    <link>https://dev.to/ged_bashiri_f667fe2667068</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3743925%2F4ce3f3ab-6086-4b54-89f8-f8a07dbad9be.jpg</url>
      <title>DEV Community: Ged Bashiri</title>
      <link>https://dev.to/ged_bashiri_f667fe2667068</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ged_bashiri_f667fe2667068"/>
    <language>en</language>
    <item>
      <title>MVP architecture adapted for Unity</title>
      <dc:creator>Ged Bashiri</dc:creator>
      <pubDate>Sat, 31 Jan 2026 22:07:26 +0000</pubDate>
      <link>https://dev.to/ged_bashiri_f667fe2667068/mvp-architecture-adapted-for-unity-5fk8</link>
      <guid>https://dev.to/ged_bashiri_f667fe2667068/mvp-architecture-adapted-for-unity-5fk8</guid>
      <description>&lt;h1&gt;
  
  
  Intro
&lt;/h1&gt;

&lt;p&gt;This article explains how we adopted an &lt;strong&gt;MVP (Model–View–Presenter)&lt;/strong&gt; architecture for our Unity game. I’ll walk through the overall structure, explain the main modules, and then discuss the pros, cons, and how we handled some common challenges.&lt;/p&gt;




&lt;h1&gt;
  
  
  Disclaimer
&lt;/h1&gt;

&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; a strict MVP handbook, nor a perfect one-to-one mapping of classic MVP into Unity.&lt;/p&gt;

&lt;p&gt;What you’ll see here is &lt;strong&gt;an adaptation&lt;/strong&gt; that works well for our game, which is closer to an app with lots of menus and many mini-games. It may or may not fit your project perfectly, but hopefully it gives you useful ideas.&lt;/p&gt;

&lt;p&gt;MVP has been used in Unity before, and there are many tutorials out there (for example:&lt;br&gt;
&lt;a href="https://learn.unity.com/tutorial/build-a-modular-codebase-with-mvc-and-mvp-programming-patterns" rel="noopener noreferrer"&gt;https://learn.unity.com/tutorial/build-a-modular-codebase-with-mvc-and-mvp-programming-patterns&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My main concern with many existing examples,&lt;/strong&gt; is that they rely heavily on MonoBehaviour APIs everywhere. That undermines one of the biggest benefits of MVP: &lt;strong&gt;Testability&lt;/strong&gt; (in my opinion of course)&lt;/p&gt;


&lt;h1&gt;
  
  
  Our App
&lt;/h1&gt;

&lt;p&gt;Before talking architecture, it’s important to understand the product. There is no “one architecture to rule them all.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYnJkOHNrazdpc2pkNnF4a2I4ZTJuOHhnYnN3YTRmMDgyeGJxdHg3ayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FelUGwgiPOdq7e%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYnJkOHNrazdpc2pkNnF4a2I4ZTJuOHhnYnN3YTRmMDgyeGJxdHg3ayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FelUGwgiPOdq7e%2Fgiphy.gif" width="245" height="200"&gt;&lt;/a&gt;&lt;/p&gt;
One ring to rule them all.



&lt;p&gt;Our app, &lt;strong&gt;&lt;a href="https://magrid.education/" rel="noopener noreferrer"&gt;Magrid&lt;/a&gt;&lt;/strong&gt; is a learning solution for kids aged 3 to 10 (check it out if you have a kid or you are a 5 years old by any chance), designed to address two major goals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    It is &lt;strong&gt;language-free&lt;/strong&gt;, so children around the world can use it&lt;/li&gt;
&lt;li&gt;    It is &lt;strong&gt;inclusive&lt;/strong&gt;, including support for children with disabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From a technical perspective, the app contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Many &lt;strong&gt;menus&lt;/strong&gt; (login/register, student management, performance review, curriculum management, etc.)&lt;/li&gt;
&lt;li&gt;    Many &lt;strong&gt;mini-games&lt;/strong&gt; (pattern recognition, visual perception, number comparison, and more)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main technical concern was &lt;strong&gt;separation of concerns&lt;/strong&gt;, both for menu logic and for the mini-games themselves.&lt;/p&gt;


&lt;h1&gt;
  
  
  Architecture
&lt;/h1&gt;

&lt;p&gt;The architecture has 2 types of entities: &lt;strong&gt;MVP modules&lt;/strong&gt; and &lt;strong&gt;Systems&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  MVP Modules
&lt;/h2&gt;

&lt;p&gt;An MVP module has 3 components (duh!):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsznf9jjorw5uiwq89srx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsznf9jjorw5uiwq89srx.png" alt="Well, Who would have thought?" width="600" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  View:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;    Essentially a &lt;code&gt;MonoBehaviour&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;    Handles user input&lt;/li&gt;
&lt;li&gt;    Displays data&lt;/li&gt;
&lt;li&gt;    Talks directly to the Presenter&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Presenter:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;    &lt;strong&gt;Not&lt;/strong&gt; a &lt;code&gt;MonoBehaviour&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;    Contains all business logic&lt;/li&gt;
&lt;li&gt;    Fetches data from Model and processes it&lt;/li&gt;
&lt;li&gt;    Updates the &lt;strong&gt;View only through an interface&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Model:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;    Stores data needed by the module&lt;/li&gt;
&lt;li&gt;    Separated for clarity&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  MVP Lifecycle
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;View&lt;/strong&gt; is the entry point of an MVP module.&lt;br&gt;
It can be initiated either by Unity event functions or by another MVP module.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;    The View creates its Presenter(s)&lt;/li&gt;
&lt;li&gt;    A View may have &lt;strong&gt;more than one Presenter&lt;/strong&gt; for reusability (covered in last section)&lt;/li&gt;
&lt;li&gt;    The View passes its interface to the Presenter&lt;/li&gt;
&lt;li&gt;    The Presenter creates its Model (if needed)&lt;/li&gt;
&lt;li&gt;    The module is ready&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All &lt;strong&gt;business logic lives in the Presenter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Imagine, if you were to replace the View with a command-line implementation, the application would still work. because the Presenter Uses &lt;strong&gt;no Unity APIs&lt;/strong&gt; and Communicates only via interfaces&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3bhmf4dex6fass0w4gj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3bhmf4dex6fass0w4gj.gif" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;
Presenter doesn’t need visuals to work. If your imagination is good enough.



&lt;p&gt;Here is simple example of each components:&lt;/p&gt;
&lt;h3&gt;
  
  
  View:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class FooView : BaseScreen, IFooView
{
    [SerializeField] private TMP_Text exposedInExpectorExample;

    private FooPresenter _presenter;

    private void Start()
    {
        _presenter = new FooPresenter(this);
    }

    public void SetName(string barName)
    {
        exposedInExpectorExample.text = barName;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  View interface:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public interface IFooView : BaseMvpView&amp;lt;FooPresenter&amp;gt;
{
     public void SetName(string barName);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Presenter:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class FooPresenter : BaseMvpPresenter
{
    private IFooView _view;
    private FooModel _model;

    public FooPresenter(IFooView view)
    {
        _view = view;
        _model = new FooModel();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Model:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class RegisterTeacherModel : BaseMvpModel
{
     public string BarName { get; set; }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In the example:&lt;br&gt;
— &lt;code&gt;BaseScreen&lt;/code&gt;, which our view extends, is a &lt;code&gt;MonoBehaviour&lt;/code&gt; responsible for canvas management(Open, Close, …)&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;BaseMvpView&lt;/code&gt;, which our interface extends, is just a generic interface&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public interface BaseMvpView&amp;lt;T&amp;gt; where T : BaseMvpPresenter
{
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;— &lt;code&gt;BaseMvpModel&lt;/code&gt; also is just a simple interface&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public interface BaseMvpModel
{
    public int Version { get; }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Version&lt;/code&gt; field helps with data migration when loading persistent data after updates. Each module can manage its own migration logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  System
&lt;/h2&gt;

&lt;p&gt;Systems are more or less an MVP module without View.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia0.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExc2R0a2h1dXVuNzA2Mm1mYzQwYWxubTYwemhnc3pkZDF4dzFkNXRoMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FuNE1fngZuYhIQ%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia0.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExc2R0a2h1dXVuNzA2Mm1mYzQwYWxubTYwemhnc3pkZDF4dzFkNXRoMyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FuNE1fngZuYhIQ%2Fgiphy.gif" width="320" height="135"&gt;&lt;/a&gt;&lt;/p&gt;
The systems are accessible via dependency injection.



&lt;p&gt;Their purpose is to serve all the MVP modules. They all will be initiated by a single MonoBehaviour (I called it AppManager) which is Accessible by MVPs (A Unity adapted singleton).&lt;br&gt;
This could also be implemented using dependency injection.&lt;br&gt;
I chose not to use &lt;a href="https://github.com/modesttree/Zenject" rel="noopener noreferrer"&gt;Zenject&lt;/a&gt; due to IL2CPP issues and instead built a simple dependency manager.\&lt;/p&gt;

&lt;h3&gt;
  
  
  Key points:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;    Each system exposes an interface&lt;/li&gt;
&lt;li&gt;    All systems can be mocked in tests&lt;/li&gt;
&lt;li&gt;    Systems are initialized during app loading&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Common Systems:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;    &lt;strong&gt;Profile System&lt;/strong&gt; — persistent data storage&lt;/li&gt;
&lt;li&gt;    &lt;strong&gt;API System&lt;/strong&gt; — server communication&lt;/li&gt;
&lt;li&gt;    &lt;strong&gt;Purchase System&lt;/strong&gt; — in-app purchases&lt;/li&gt;
&lt;li&gt;    &lt;strong&gt;Analytics System&lt;/strong&gt; — analytics providers and events (Game analytics, Firebase, …)&lt;/li&gt;
&lt;li&gt;    &lt;strong&gt;UI System&lt;/strong&gt; — screens, popups, navigation, back actions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  PlayInfo
&lt;/h2&gt;

&lt;p&gt;Ok, there is another entity which I called it PlayInfo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtk82x9qm5hlj7p54438.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtk82x9qm5hlj7p54438.png" alt="Here me out, you can just ignore this if you are starting from scratch." width="360" height="186"&gt;&lt;/a&gt;&lt;/p&gt;
Here me out, you can just ignore this if you are starting from scratch.



&lt;p&gt;&lt;code&gt;PlayInfo&lt;/code&gt; handles rare cases where MVP modules need to communicate.&lt;/p&gt;

&lt;p&gt;It contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    A set of &lt;strong&gt;events&lt;/strong&gt; that modules can subscribe to&lt;/li&gt;
&lt;li&gt;    Some &lt;strong&gt;shared variables&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally, this existed mainly to help transition from a &lt;strong&gt;legacy codebase&lt;/strong&gt;, where everything accessed everything else via static methods. &lt;code&gt;PlayInfo&lt;/code&gt; acted as a &lt;strong&gt;mediator&lt;/strong&gt; between refactored MVP modules and legacy code. In the end, we kept a few of its events because they turned out to be genuinely useful.&lt;/p&gt;




&lt;h1&gt;
  
  
  Review
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Pros:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Testability (Main Goal)
&lt;/h3&gt;

&lt;p&gt;We use two types of tests:&lt;/p&gt;

&lt;h4&gt;
  
  
  Unit tests
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;    You can have excessive unit testes, covering presenters and systems. They have minimum dependencies which can be easily mocked.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Smoke / Integration tests
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;    You can simulate user interactions and test multiple modules together.&lt;/li&gt;
&lt;li&gt;    Simulating user interactions and checking UI can be done using UnityTest and Reflection which deserves its own article.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Encapsulation
&lt;/h3&gt;

&lt;p&gt;Each module is fully isolated.&lt;br&gt;
Communication happens only via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Interfaces&lt;/li&gt;
&lt;li&gt;    (Rarely) events
This makes refactoring/changing safer and reduces unintended side effects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cons:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Boilerplate:
&lt;/h3&gt;

&lt;p&gt;Each module usually needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    View&lt;/li&gt;
&lt;li&gt;    View Interface&lt;/li&gt;
&lt;li&gt;    Presenter&lt;/li&gt;
&lt;li&gt;    Model
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvavdqbeuxym8pngmsm4.gif" width="244" height="170"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Unity Edge Cases
&lt;/h3&gt;

&lt;p&gt;At the end of the day, this is still a &lt;strong&gt;game&lt;/strong&gt;. Sometimes you need unity APIs such as &lt;code&gt;Coroutines&lt;/code&gt;, &lt;code&gt;Physics&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  our solution:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;    To start &lt;code&gt;Coroutines&lt;/code&gt;, use &lt;code&gt;AppManager&lt;/code&gt; (Remember? &lt;code&gt;MonoBehaviour&lt;/code&gt; Singleton)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These cases were rare for us.&lt;br&gt;
If this becomes frequent in your project, it may be worth introducing a new entity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reusability
&lt;/h3&gt;

&lt;p&gt;Although, I’ll take &lt;strong&gt;maintainability&lt;/strong&gt; over &lt;strong&gt;reusability&lt;/strong&gt; any day, but repeating yourself still hurts.&lt;/p&gt;

&lt;p&gt;Ways we addressed this:&lt;/p&gt;

&lt;h4&gt;
  
  
  View Reuse
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Build generic UI components. For example a &lt;strong&gt;Student Profile UI element&lt;/strong&gt; reused across multiple views. Not only you don’t repeat yourself over and over but also changing code/prefab once will update all screens everywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Logic Reuse
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Stateless logic goes into &lt;strong&gt;Utils&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For example email validation regex can be used in multiple places.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Presenter reuse
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;A view can use multiple Presenters and pass proper interface to the presenter constructor. (Interface segregation)&lt;/li&gt;
&lt;li&gt;Example: “Contact Support” logic already exists in Settings. Reuse that Presenter in the Shop screen instead of duplicating code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your situation doesn’t fit in these two cases, most probably it deserves to be a system and provide service to MVP modules in need.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Sometimes Games and Apps are very similar and they are not very distinguishable. Architectures like &lt;strong&gt;MVP&lt;/strong&gt; or &lt;strong&gt;MVVM&lt;/strong&gt;, while not originally designed for games, can work extremely well for &lt;strong&gt;menu-heavy&lt;/strong&gt;, &lt;strong&gt;logic-driven&lt;/strong&gt; &lt;strong&gt;Unity projects&lt;/strong&gt;. Here I tried adopt MVP architecture for Unity environment and benefited from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Testability&lt;/li&gt;
&lt;li&gt;    Separation of concerns&lt;/li&gt;
&lt;li&gt;    Maintainability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the end, if you have questions or better idea to improve this approach, let me know. :D&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>gamedev</category>
      <category>softwareengineering</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
