third week
This commit is contained in:
1 parent
95e62c915f
commit
a935851e22
31 files changed
+1269
-33
No files matched your search
@@ -0,0 +1,125 @@
|
||||
\section{Architekturális felépítések}
|
||||
|
||||
\begin{frame}{Mi a szoftverarchitektúra, és miért számít?}
|
||||
\footnotesize
|
||||
A szoftverarchitektúra azt írja le, hogyan van a kódunk nagy egységekre (rétegekre, modulokra, szolgáltatásokra) felosztva, és ezek hogyan kommunikálnak egymással. Egy kis, egyszemélyes prototípusnál szinte mindegy, hova írjuk a kódot -- de amint a projekt nő, csapatban dolgozunk rajta, vagy hónapok múlva kell hozzányúlni, a jó architektúra dönti el, hogy karbantartható marad-e a rendszer, vagy "spagettikóddá" válik.
|
||||
|
||||
\begin{itemize}
|
||||
\item Könnyebb megérteni: világos, hogy melyik kód mit csinál, és hol keresendő egy adott logika
|
||||
\item Könnyebb tesztelni: a rétegek külön-külön, elszigetelten tesztelhetők
|
||||
\item Könnyebb bővíteni: új funkció hozzáadásakor tudjuk, hova illesztjük be
|
||||
\item Könnyebb csapatban dolgozni: a felelősségek szét vannak választva
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Rétegzett architektúra -- az öt réteg (1/2)}
|
||||
\footnotesize
|
||||
A rétegzett felépítésnél a kódot vízszintes rétegekbe szervezzük, ahol minden réteg csak a közvetlenül alatta lévővel kommunikál. Ezen a tárgyon a következő öt réteges felosztást fogjuk következetesen használni -- elsőként a "felső" három réteg:
|
||||
|
||||
\begin{block}{}
|
||||
\begin{itemize}
|
||||
\item \textbf{API / Controller:} fogadja a HTTP kéréseket, validálja a bemenetet, meghívja az Application réteget, visszaadja a választ -- ezt Express.js-ben már megírtuk a múlt héten
|
||||
\item \textbf{Application:} az egyes use case-eket (parancsokat/lekérdezéseket) orchesztrálja -- ide kerülnek majd a CQRS command/query handlerek
|
||||
\item \textbf{Domain:} a tiszta üzleti logika, entitások, aggregates -- semmilyen technikai függősége nincs, nem "tudja", hogy Express-ben vagy adatbázissal fut
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Rétegzett architektúra -- az öt réteg (2/2)}
|
||||
\footnotesize
|
||||
A maradék két réteg a rendszer "peremén" helyezkedik el: az egyik a kifelé irányuló adatszerződéseket, a másik a technikai megvalósítást fogja össze.
|
||||
|
||||
\begin{block}{}
|
||||
\begin{itemize}
|
||||
\item \textbf{Communication:} a rétegek/külső rendszerek közti szerződések -- DTO-k, mapperek (6. hét)
|
||||
\item \textbf{Infrastructure:} a konkrét technikai megvalósítás -- adatbázis-kapcsolat, külső szolgáltatások
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
|
||||
\begin{alertblock}{Miért éri meg?}
|
||||
Ha lecseréljük az adatbázisunkat, csak az Infrastructure réteget kell módosítani -- a Domain és az API réteg változatlan marad.
|
||||
\end{alertblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{MVC minta}
|
||||
\footnotesize
|
||||
Az MVC (Model-View-Controller) a rétegzett architektúra egyik legismertebb konkrét megvalósítása, eredetileg felhasználói felületekhez, de a backend világban is elterjedt elnevezés lett a hasonló felosztásra.
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Model:} az adatokat és az azokhoz tartozó szabályokat képviseli (nálunk: a Domain + Infrastructure réteg)
|
||||
\item \textbf{View:} a megjelenítés -- backend API-nál ez jellemzően a JSON válasz formázása
|
||||
\item \textbf{Controller:} fogadja a bejövő kérést, meghívja a megfelelő Model-műveletet, és visszaküldi a View-t
|
||||
\end{itemize}
|
||||
|
||||
\begin{block}{Backend kontextusban}
|
||||
Amikor a múlt héten Express.js-ben "route handler"-t írtunk, az gyakorlatilag az API/Controller réteg szerepét töltötte be: fogadja a HTTP kérést, és delegálja a munkát az Application rétegnek.
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Monolit vs mikroszolgáltatás}
|
||||
\footnotesize
|
||||
Ez a döntés arról szól, hogy a teljes backend rendszerünket egyetlen, összefüggő alkalmazásként (monolit), vagy sok, önállóan futtatható kis szolgáltatásra bontva (mikroszolgáltatások) építjük-e fel. Egyik sem "jobb" alapból -- a projekt méretétől és a csapat helyzetétől függ.
|
||||
|
||||
\begin{columns}
|
||||
\begin{column}{0.48\textwidth}
|
||||
\begin{block}{Monolit}
|
||||
\begin{itemize}
|
||||
\item Egyetlen kódbázis, egyetlen futó folyamat
|
||||
\item Egyszerűbb fejleszteni és deployolni kisebb csapatban
|
||||
\item Egyszerűbb tranzakciókezelés
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
\end{column}
|
||||
\begin{column}{0.48\textwidth}
|
||||
\begin{block}{Mikroszolgáltatások}
|
||||
\begin{itemize}
|
||||
\item Sok kis, önálló szolgáltatás, saját adatbázissal
|
||||
\item Külön-külön skálázhatók és deployolhatók
|
||||
\item Nagyobb komplexitás: hálózati kommunikáció, elosztott tranzakciók
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
\end{column}
|
||||
\end{columns}
|
||||
|
||||
\begin{alertblock}{Gyakorlati tanács}
|
||||
Kezdj monolittal! A tárgy során épített API is monolit lesz -- a mikroszolgáltatásokra való szétbontás egy már működő, jól rétegzett monolitból sokkal könnyebb, mint elölről tervezni.
|
||||
\end{alertblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Separation of Concerns}
|
||||
\footnotesize
|
||||
A "Separation of Concerns" (felelősségek szétválasztása) az az elv, ami az összes eddigi mintát (rétegzés, MVC) megalapozza: minden kódegységnek egyetlen, jól körülhatárolt felelőssége legyen.
|
||||
|
||||
\begin{itemize}
|
||||
\item Egy függvény/osztály ne csinálja egyszerre a HTTP kérés kezelését \emph{és} az adatbázis-lekérdezést \emph{és} az email küldést
|
||||
\item Ha egy dolog megváltozik (pl. az adatbázis lekérdezésének módja), az csak egy helyen igényeljen módosítást
|
||||
\item Könnyebb egyesével, elszigetelten tesztelni az egyes felelősségeket
|
||||
\end{itemize}
|
||||
|
||||
\begin{block}{Ökölszabály}
|
||||
Ha egy függvény nevét csak "és"-sel tudod leírni (pl. "validál ÉS ment ÉS emailt küld"), valószínűleg érdemes szétbontani.
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Kitekintés -- mi jön még ebben a témában}
|
||||
\footnotesize
|
||||
A rétegzett architektúra és a Separation of Concerns elve két fogalmat is megalapoz, amikkel a félév további részében részletesen foglalkozunk majd -- most csak annyit érdemes megjegyezni, hogy hova illeszkednek.
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Repositories és Aggregates (5. hét):} az Infrastructure réteg formalizált, ORM-alapú megvalósítása -- a repository "elrejti" az adatbázis-lekérdezéseket egy egyszerű interfész mögé
|
||||
\item \textbf{Dependency Injection (11. hét):} technika arra, hogy a rétegek közötti függéseket (pl. "a controllernek szüksége van a service-re") ne kézzel drótozzuk be, hanem egy keretrendszer intézze
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Összefoglalás -- Architekturális felépítések}
|
||||
\footnotesize
|
||||
\begin{block}{Architektúra}
|
||||
\begin{itemize}
|
||||
\item A jó architektúra karbantarthatóvá, tesztelhetővé és bővíthetővé teszi a rendszert
|
||||
\item Rétegzett architektúra (öt réteg): API/Controller -- Application -- Domain -- Communication -- Infrastructure
|
||||
\item MVC: Model-View-Controller -- a Controller felel meg a jövő heti Express.js route handlernek
|
||||
\item Monolit vs mikroszolgáltatás: kezdj monolittal, bontsd szét később, ha indokolt
|
||||
\item Separation of Concerns: minden kódegységnek egy jól körülhatárolt felelőssége legyen
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
\end{frame}
|
||||
Reference in new issue
Block a user