Nieznane's awatar

Wpisy, których autorem jest Teo Vincent Artur Wincenciak

Software engineer writing code in .NET and a conference organizer leading the Cracow .NET Developers Group. I have also been a university teacher as an additional activity. In my free time, I develop open-source projects and enjoy skiing, table tennis, and snooker as my big hobby. I am a fan of Ronnie O'Sullivan and Judd Trump. .NET, C#, C++, SOLID

Adapter Obiektów

Pomysł na ten wpis jest taki, że na początek, napiszę testy jednostkowe, które będą palić się na czerwono, w których zdefiniuje problem. Testy zapalę na zielono poprzez implementację wzorca Adapter.

Adapter przekształca interfejs klas na inny, oczekiwany przez klienta. Adapter umożliwia współdziałanie klasom, które z uwagi na niezgodne interfejsy standardowo nie mogą współdziałać ze sobą.

„Wzorce Projektowe”, Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

Adapter dokonuje konwersji danej klasy do postaci innego interfejsu, zgodnie z oczekiwaniami klienta. Adapter pozwala na współpracę klas, które ze względu na niekompatybilne interfejsy wcześniej nie mogły ze sobą współpracować. {…}. Dzięki temu kod klienta nie musi być modyfikowany za każdym razem, kiedy będzie współpracować z innym interfejsem.

„Head First Design Patterns” Erich Freeman, Elisabeth Freeman, Bert Bates, Kathy Sierra

Adapter Obiektów

Na początek, napiszę test, w którym zdefiniuję problem. Po czym napiszę kod produkcyjny, który zapali ten test na zielono.

public class AdapterTester
{
  private readonly Client client;

  public AdapterTester()
  {
    client = new Client();
  }

  [Fact]
  public void call_request_method_in_target()
  {
    // arrange
    ITarget target = A.Fake();

    // act
    client.CallRequest(target);

    // assert
    A.CallTo(() => target.Request()).MustHaveHappened();
  }
}

Clinet posiada metodę CallRequest, która w argumencie pobiera obiekt spełniający interfejs ITarget. W teście sprawdzamy, czy w wyniku wywołania metody CallRequest została wywołana metoda Request na obiekcie target.

Aby ten test zapalił się na zielono potrzebna jest definicja interfejsu ITarget oraz implementacja klasy Client.

public interface ITarget
{
  void Request();
}

public class Client
{
  public void CallRequest(ITarget target)
  {
    target.Request();
  }
}

Teraz zdefiniuję kolejny test, którego zapalenie na zielono będzie wymagało napisania wzorca Adapter.

public class AdapterTester
{
  // ... pozostały kod jest niezmieniony
  [Fact]
  public void call_specific_request_method_in_adaptee()
  {
    // arrange
    IAdaptee adaptee = A.Fake();
    ITarget adapter = new Adapter(adaptee);

    // act
    client.CallRequest(adapter);

    // assert
    A.CallTo(() => adaptee.SpecificRequest()).MustHaveHappened();
  }
}

W teście tym pojawił się obiekt typu IAdaptee. IAdaptee posiada metodę SpecificRequest, co powoduje, że interfejs IAdaptee jest inny od ITarget. Klient nie będzie umieć współpracować z obiektem typu IAdapteeIAdaptee wymaga adaptacji do współdziałania z metodą CallRequest z klasy Client.

IAdaptee przekazany jest do konstruktora nowej klasy Adapter, która implementuje interfejs ITarget. Wewnątrz klasy Adapter nastąpi przetłumaczenie interfejsu IAdaptee na interfejs ITarget. W ostatniej linijce testu jest asercja mówiąca o tym, że w wyniku przetłumaczenia IAdaptee na ITarget, jeśli klient wywoła metodę Request na obiekcie typu ITarget to w rzeczywistości wywoła się metoda SpecificRequest na obiekcie typu IAdaptee.

Jak widać w teście, klasa Client pozostaje bez zmian — to ważne założenie. Adaptacja nowego interfejsu wykonywana jest bez najmniejszej zmiany klasy, do której ten nowy interfejs adaptujemy.

Test pali się teraz na czerwono. Kod się nie kompiluje. Definiuję teraz ten nowy interfejs, który będę adaptować.

public interface IAdaptee
{
  void SpecificRequest();
}

Teraz definiuję klasę Adapter, która w konstruktorze przyjmuje obiekt typu IAdaptee. Klasa Adapter implementuje interfejs ITarget, czyli ten pierwotny, do którego się adaptujemy.

public class Adapter : ITarget
{
  private readonly IAdaptee adaptee;

  public Adapter(IAdaptee adaptee)
  {
    this.adaptee = adaptee;
  }

  public void Request()
  {
    adaptee.SpecificRequest();
  }
}

Diagram klas wzorca Adapter Obiektów

Wzorzec Adapter Obiektów

Mózg rządzi, czyli poziomy abstrakcji cz. 2

Kilka lat temu natrafiłem na bardzo ciekawy tekst na temat poziomów abstrakcji w komputerze. Dzisiaj przeczytałem równie ciekawy tekst na temat poziomów abstrakcji w postrzeganiu świata przez mózg człowieka.

Rzeczywistość kontra percepcja.

Rozejrzyj się dookoła. Wydaje Ci się świat takim, jakim jest? W filmie Matrix główny bohater może wybrać niebieską pigułkę i pozostać w wyimaginowanym świecie lub czerwoną i podążyć za białym królikiem to znaczy poznać świat rzeczywisty. Neo postanawia sprawdzić, jak głęboka jest królicza nora. Wybiera czerwoną pigułkę.

Przenosiny do prawdziwego świata okazały się złym wyborem. Nasz wyimaginowany świat jest od niego lepszy.

Już w starożytności filozofowie głowili się, skąd możemy wiedzieć, że to, co widzimy, istnieje naprawdę. Czym jest rzeczywistość? Jeśli mamy na myśli to, co możemy poczuć, wywąchać, posmakować i zobaczyć wówczas rzeczywistość to jedynie impulsy elektryczne interpretowane przez nasz mózg.

Do świata rzeczywistego mamy dostęp wyłącznie poprzez zmysły. To trochę tak jakbyśmy znaleźli się w skórze Neo. Rozumiemy, że to, co oko nam nie pokazuje, to uniwersalna jedyna właściwa odpowiedź na pytanie o prawdziwy świat a mózg za pomocą informacji napływających od zmysłów prezentuje nam jedynie jego spersonalizowany obraz. Ten obraz nazywamy percepcją lub postrzeganiem.

Nordenger Kaja „Mózg rządzi. Twój niezastąpiony narząd”

 

Trzej DotNetos

Trzej dotNETowi amigos przemierzą nasz kraj.

Konrad Kokosa
Szymon Kulec
Łukasz Pyrzyk

Cytat:

„Pakujemy się we trójkę w samochód i wyruszamy w Polskę. 5 miast, dzień po dniu. Trzech .NETomaniaków. Trzej Dot Netos w trasie. Codziennie wieczorem inne miasto, inni ludzie ale te same tematy – wydajność .NET, wnętrza .NET, zaawansowane tematy .NET. Tematycznie – ostra jazda bez trzymanki. Litości nie będzie. Jeśli nudzisz się na sesjach o .NET na innych konferencjach, teraz powinieneś być zadowolony! Oczywiście nie ma to być sztuka dla sztuki. Wszystkie poruszane tematy będą praktyczne i życiowe. Ale nie będziemy nudzić, że „typy referencyjne są na stercie, a wartościowe na stosie itd. itp.”. Oj nie nie!”

Przeczytaj całość na Blog Kokosa

Continue reading →

KGD .NET

KGD .NET

KGD_LOGOKGD .NET czyli Krakowska Grupa Deweloperów .NET

Krakowska Grupa Deweloperów .NET to społeczność, skupiająca osoby związane z technologią .NET z Krakowa i okolic. Grupa działa nieprzerwanie od czerwca 2004 roku i tym samym jest najstarszą profesjonalną grupą .NET w Polsce. Zorganizowaliśmy już ponad 100 spotkań.

Zawsze raz w miesiącu, zawsze w środy, zawsze o 18:30, zawsze dwie prelekcje

Naszą tradycją jest to, że spotkania organizujemy raz w miesiącu, zawsze w środy i zawsze o 18:30.

Na każdym spotkaniu odbywają się dwie prelekcje, które trwają od czterdziestu do sześćdziesięciu minut. Między prelekcjami jest piętnastominutowa przerwa, podczas której można zjeść pizzę oraz napić się piwa ufundowanego przez firmę Making Waves.

Continue reading →

Boiling Frogs 2018 – Sofrware Craftsmandsip Conference in Wrocław

W tym roku również jadę wraz z całą ekipą znajomych z Krakowa.

Byłem na każdej edycji tej konferencji, czyli w 2016 i 2017 roku. Za każdym razem byłem bardzo zadowolony. Równie tematyka, sposób prowadzenia prezentacji oraz organizacja stały na bardzo wysokim poziomie.

Link do strony

https://2018.boilingfrogs.pl/

Nagrania

Na YouTube można obejrzeć wykłady, na których nie można było się pojawić, ponieważ odbywały się równolegle z innymi na innej ścieżce, na których również chciało się być.

https://www.youtube.com/channel/UCgUfIjfLvWmARsQ-d5gPzrw

Nazwa Boiling Frogs

Nazwa nawiązuje do tego, żeby uważać na siebie i nie zostać ugotowanym. Jest takie przysłowie, które mówi, że jak będziemy bardzo powoli podgrzewać wodę, w której znajduje się żaba, to ta żaba w pewnym momencie się ugotuje, nie wiedząc o tym. Żaba jest zmiennocieplne, więc temperatura jej ciała będzie się podnosić wraz z temperaturą wody. W każdej chwili żaba mogłaby wyskoczyć z wody, za nim się ugotuje, ale tego nie zrobi, ponieważ nie zauważy wzrostu temperatury.

Ważne, aby nasze otoczenie nas nie ugotowało tak jak tę żabę. Należy szkolić się, rozwijać, zdobywać nowe doświadczenia tak, aby wiedzieć, kiedy wyskoczyć z garnka w odpowiednim momencie.

Woda w garnku, powoli podgrzewana aż do momentu ugotowania nas jest tutaj metaforą do takich sytuacji jak na przykład uczestnictwo w projekcie rozwijanym w przestarzałych, dawno już nierozwijanych technologiach lub tkwienie w toksycznej firmie, w której nie ma możliwości rozwoju, itp…

Rozmowy o programowaniu na konferencji

Konferencje dla .NET’owców, które polecam wpisać do kalendarza

Boiling Frogs

Wrocław
https://2018.boilingfrogs.pl/


DevConf

Kraków
http://devconf.pl/

Continue reading →