<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title><![CDATA[Za Warstwą Abstrakcji]]></title>
    <link href="http://zawarstwaabstrakcji.pl/atom.xml" rel="self"/>
    <link href="http://zawarstwaabstrakcji.pl/"/>
    <updated>2021-01-31T23:10:27+00:00</updated>
    <id>http://zawarstwaabstrakcji.pl/</id>
        <generator uri="http://sculpin.io/">Sculpin</generator>
            <entry>
            <title type="html"><![CDATA[Zewnętrzne zależności w modelu biznesowym]]></title>
            <link href="http://zawarstwaabstrakcji.pl/20210201-zewnetrzne-zaleznosci-w-modelu-biznesowym/"/>
            <updated>2021-02-01T00:00:00+00:00</updated>
            <id>http://zawarstwaabstrakcji.pl/20210201-zewnetrzne-zaleznosci-w-modelu-biznesowym/</id>
            <content type="html"><![CDATA[<p>Model biznesowy, domena, logika biznesowa - jakkolwiek nie nazwiemy kodu, który w założeniu reprezentuje sedno
projektu, często zgadzamy się co do jednego. Ten model nie powinien zawierać zewnętrznych zależności, tylko czy aby na pewno?</p>
]]></content>
        </entry>
            <entry>
            <title type="html"><![CDATA[Modular Monolith PHP - Testy]]></title>
            <link href="http://zawarstwaabstrakcji.pl/20201012-modular-monolith-testy/"/>
            <updated>2020-10-12T00:00:00+00:00</updated>
            <id>http://zawarstwaabstrakcji.pl/20201012-modular-monolith-testy/</id>
            <content type="html"><![CDATA[<p>W modularnym monolicie kluczowa jest izolacja modułów, izolacja zarówno na poziomie kodu, jak i testów.
Pierwszy raz implementując monolit z ambicjami na mikroserwisy największą zagwozdką było jak
sensownie podejść do testów tak aby w razie ewentualnego wydzielenia nie utknąć z test suitem, 
którego nie da się ruszyć. W tym celu, podążając za mocną inspiracją <a href="https://docs.behat.org/en/latest/">Behatem</a>
wdrożyliśmy coś, co zostało nazwane Kontekstami.</p>
]]></content>
        </entry>
            <entry>
            <title type="html"><![CDATA[Modular Monolith PHP - Wprowadzenie]]></title>
            <link href="http://zawarstwaabstrakcji.pl/20200630-modular-monolith-wprowadzenie/"/>
            <updated>2020-06-30T00:00:00+00:00</updated>
            <id>http://zawarstwaabstrakcji.pl/20200630-modular-monolith-wprowadzenie/</id>
            <content type="html"><![CDATA[<p>Od bardzo dawna zbierałem się do poruszenia tego tematu. 
W tym wpisie postaram się odnieść do podstaw, wrzucę trochę materiałów do 
poczytania/pooglądania tak aby przygotować bazę pod kolejne wpisy. 
Jeżeli pod koniec czytania będziesz czuć, że czegoś jeszcze brakuje i nie do 
końca wiesz czy byłbyś w stanie zaimplementować modularny monolit, nie przejmuj się. 
To bardzo obszerne zagadnienie, z wieloma szczegółami które wychodzą 
dopiero w trakcie implementacji lub w czasie migracji do mikroserwisów.</p>

<p>Polecam w ogóle zacząć temat od oglądnięcia tej prezentacji:</p>

<div class="text-center">
    <iframe width="100%" 
        height="415" 
        src="https://www.youtube.com/embed/5OjqD-ow8GE" 
        frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" 
        allowfullscreen>
    </iframe>
</div>

<p><br/>
Jeżeli po oglądnięciu dalej będziesz miał pytania, szczególnie o aspekty związane z PHP, czytaj dalej.</p>
]]></content>
        </entry>
            <entry>
            <title type="html"><![CDATA[Scratchpad]]></title>
            <link href="http://zawarstwaabstrakcji.pl/20200318-scratchpad/"/>
            <updated>2020-03-18T00:00:00+00:00</updated>
            <id>http://zawarstwaabstrakcji.pl/20200318-scratchpad/</id>
            <content type="html"><![CDATA[<p>Każdy, kto musiał integrować kiedykolwiek swój system z systemami zewnętrznymi, wie jak bardzo bolesne potrafi
być takie doświadczenie. Często trzeba coś na szybko sprawdzić, dokumentacja mówi jedno a API drugie. Jeszcze
gorzej jeżeli taka integracja polega na procesowaniu raportów w dziwnych formatach. 
Jak najlepiej podejść do takiego tematu?</p>
]]></content>
        </entry>
            <entry>
            <title type="html"><![CDATA[Testy w PHP - Mock czyli Test Double]]></title>
            <link href="http://zawarstwaabstrakcji.pl/20181005-testy-php-mock-czyli-test-double/"/>
            <updated>2018-10-05T00:00:00+00:00</updated>
            <id>http://zawarstwaabstrakcji.pl/20181005-testy-php-mock-czyli-test-double/</id>
            <content type="html"><![CDATA[<p>W języku polskim słowo „imitacja” chyba najlepiej oddaje czym jest „mock”. Coś co tylko naśladuje oryginalny byt,
zachowuje się w bardzo podobny do niego sposób jednak nim nie jest.  Mówiąc, że mamy coś „zamockować” jako programiści
tak naprawdę myślimy o stworzeniu implementacji interfejsu która naśladuje prawdziwą.</p>
]]></content>
        </entry>
            <entry>
            <title type="html"><![CDATA[Testy w PHP - Object Mother]]></title>
            <link href="http://zawarstwaabstrakcji.pl/20180925-testy-php-object-mother/"/>
            <updated>2018-09-25T00:00:00+00:00</updated>
            <id>http://zawarstwaabstrakcji.pl/20180925-testy-php-object-mother/</id>
            <content type="html"><![CDATA[<p>Pisanie testów nie jest łatwe, tak samo jak pisanie kodu. Utrzymywanie testów jest jeszcze
trudniejsze, tak samo jak utrzymywanie kodu. Pisanie czytelnych testów tak samo jak pisanie
czytelnego kodu to sztuka.
Mother Object to wzorzec który znacząco ułatwia te niezwykle skomplikowane procesy.
Na pierwszy rzut oka nie różni się on niczym od zwykłej fabryki, jego cel jest niemalże identyczny,
skomponować obiekt. Chodzi jednak o obiekt który wykorzystany będzie jedynie w testach.</p>
]]></content>
        </entry>
            <entry>
            <title type="html"><![CDATA[FP i OOP w PHP]]></title>
            <link href="http://zawarstwaabstrakcji.pl/20180507-fp-oop-w-php/"/>
            <updated>2018-05-07T00:00:00+00:00</updated>
            <id>http://zawarstwaabstrakcji.pl/20180507-fp-oop-w-php/</id>
            <content type="html"><![CDATA[<p>Tablice asocjacyjne i nie tylko to chyba jedna z pierwszych struktur danych z którą spotykają się programiści zaczynający
przygodę z językiem. Pozwalają one na budowanie dowolnych struktur nie ograniczanych przez żaden schemat, można 
dokładać elementy, usuwać, zagnieżdżać jedną tablicę w drugiej. Przy okazji programista poznaje wszelkiego rodzaju
pętle, instrukcje warunkowe, zmienne oraz stałe i to daje mu w zasadzie wszystko czego potrzebuje żeby napisać swój pierwszy program.
Kolejnym krokiem w ewolucji programisty PHP jest podejście obiektowe, wszystko staje się obiektem (nawet kiedy tym obiektem być nie powinno). 
Niektórzy jednak przesiąknięci złymi nawykami będącymi często efektami samokształcenia próbują usilnie ukryć podejście
strukturalne pod maską obiektów. Zamiast tego moim zdaniem lepiej jest zainteresować się programowaniem funkcyjnym, które
w połączeniu z obiektowym daje naprawdę dobre efekty i pozwala bardzo skomplikowane problemy przedstawiać za pomocą
nieskomplikowanego kodu.</p>
]]></content>
        </entry>
            <entry>
            <title type="html"><![CDATA[CQRS - System]]></title>
            <link href="http://zawarstwaabstrakcji.pl/20180425-cqrs-system/"/>
            <updated>2018-04-25T00:00:00+00:00</updated>
            <id>http://zawarstwaabstrakcji.pl/20180425-cqrs-system/</id>
            <content type="html"><![CDATA[<p>Każdy poprzedni wpis dotyczący CQRS'a mniej lub bardziej wspominał o systemie, czyli o takim bycie
do którego trafiają wszystkie command oraz queries. Za pomocą komend, stan systemu może być zmieniony, query
natomiast służy do jego odczytania. Przykładowo budując system do zarządzania pracownikami, komendą 
<code>CreateUser()</code> moglibyśmy dodać użytkownika do systemu a następnie korzystając z <code>UserQuery::totalCount() : int</code> 
moglibyśmy pobrać całkowitą liczbę użytkowników, którymi system zarządza. Czym jednak jest system?</p>
]]></content>
        </entry>
            <entry>
            <title type="html"><![CDATA[Event Sourcing - wprowadzenie PHP]]></title>
            <link href="http://zawarstwaabstrakcji.pl/20171106-event-sourcing-wprowadzenie-php/"/>
            <updated>2017-11-06T00:00:00+00:00</updated>
            <id>http://zawarstwaabstrakcji.pl/20171106-event-sourcing-wprowadzenie-php/</id>
            <content type="html"><![CDATA[<blockquote>
  <p>Capture all changes to an application state as a sequence of events.</p>
</blockquote>

<p class="text-right" >
<a href="https://martinfowler.com/eaaDev/EventSourcing.html" target="_blank">Martin Fowler</a>
</p>

<p>Ciężko o lepszą definicję Event Sourcingu. Niezależnie od technologii i implementacji Event Sourcing to po prostu 
sposób na tworzenie stanu systemu poprzez zapisywanie i odtwarzanie zdarzeń. Utarło się twierdzenie, że Event Sourcing
należy implementować w parze z <a href="/20170130-cqrs-w-praktyce-wprowadzenie-php">CQRS</a>. Nie jest to prawda, CQRS bardzo dobrze
współgra z Event Sourcingiem jednak mogą istnieć całkowicie od siebie niezależnie.
Ten wpis nie poruszy jeszcze tematu implementacji Event Sourcingu za pomocą jakiegokolwiek konkretnego frameworka. 
Chodzi w nim bardziej o zaprezentowanie i wyjaśnienie samego konceptu niż implementacji.</p>
]]></content>
        </entry>
            <entry>
            <title type="html"><![CDATA[CQRS - identyfikacja zasobów, UUID]]></title>
            <link href="http://zawarstwaabstrakcji.pl/20170710-cqrs-identyfikacja-zasobow-uuid/"/>
            <updated>2017-07-10T00:00:00+00:00</updated>
            <id>http://zawarstwaabstrakcji.pl/20170710-cqrs-identyfikacja-zasobow-uuid/</id>
            <content type="html"><![CDATA[<div class="image">
    <img src="/assets/img/cqrs/uuid.png" alt="CQRS - UUID PHP"/>
</div>
]]></content>
        </entry>
    </feed>