SOLID Architecture in Slices not Layers

Oglądałem wartą polecenia prezentację: „SOLID Architecture in Slices not Layers” preprowadzoną przez Jimmy’ego Bogarda (autor min AutoMapper, MediatR)

Obrazek który fajnie podsumowuje to:

slices per feature

Od teraz w ten sposób będę się starał organizować kod. Stare nawyki ciąglę są gdy chcę utworzyć nowy plik. Powoli ale do przodu.

Projekt Githubowy na dziś

Contoso University sample re-done the way I would build it – Project przykładów Microsoftowego Contoso Uniwersity zrobiony wg Jimmy’ego zgodnie z prezentacją.

Widok listy katalogów tego projektu:

Contoso university by jimmy bogard

Dziś miałem ciekawy przykład kiedy się od razu przydała taka organizacja: trzeba było wyrzucić jedną funkcjonalność. Dzięki temu jestem pewien (na tyle na ile mogę) że usunąłem wszystkie klasy powiązane z danym FeatereX. Wsześniej musiałbym gonić po całym projekcie aby z różnych katalogów usuwać wszystko związane z FeatereX.

Minusy

Jest to oczywiście inna konwencja niż „standardowe MVC”, jakiś junior może być zawiedziony że widoki nie są wszystkie w katalogu Views. Próg wejścia może być większy. Zgadzam się, ale nie demonizowałbym tego – są większe zalety.

Opublikowano Programowanie | Otagowano , , | Dodaj komentarz

Building Blocks dla początkującego architekta

bottega logo

Naczytałem się na http://bottega.com.pl/artykuly-i-prezentacje

Z powyższego linku wybrałem te najciekawsze i które radzę poczytać (mój subiektywny wybór):

Building Blocks dla Twojej lewej półkuli: połączenia podejścia obiektowego, proceduralnego, funkcyjnego w codziennej pracy z kodem

Cztery smaki odwracania (i utraty) kontroli: Dependency Injection, Events, Aspect Oriented Programming, Framework

Zarządzenie złożonością przez trójpodział logiki – Open/closed principle w praktyce

Podstawowe Building Blocks DDD

Zaawansowane modelowanie DDD – techniki strategiczne: konteksty i architektu- ra zdarzeniowa

Sposób na projektowanie złożonych modeli biznesowych

A dopiero potem:
Wzorce analityczne modeli biznesowych na przykładzie Party – odkrywanie krok po kroku kolejnych rozwiązań

Mapowanie relacyjno-obiektowe prawdziwych obiektów – rzecz o DDD i JPA

Co mi to dało? Już nie tak na ślepo decyduję czy dana metoda ma być tutaj a nie tam. Są pewne fajne receptury mówiące gdzie w architekturze powinna wylądować pisana przez nas funkcjonalność i z jakich klocków ją zbudować. Architektura to nie luksus.

Opublikowano Programowanie | Otagowano , , | Dodaj komentarz

Wieści z kodu – jak szerzę wiedzę w zespole

Code Review oczywiście rządzi

Najlepszym sposobem na dzielenie się wiedzą w zespole jest Code Review. Takie gdzie na PullRequest można przedyskutować każdą linijkę. Najlepiej korzystało mi się z hostingu BitBucketa i przeglądania PR w przeglądarce (fajnie by to było opisać innym razem). Jest to podejście gdzie każdy może się tanim kosztem wypowiedzieć.

Niestety jeśli Code Review nie ma to zwykłe wysyłam emaile do wszystkich osób w zespole. Emaile dotyczą konkretnej rzeczy czasem większych i ciekawszych a czasem czegoś prostego. Przykładowo:

email graphic

  • How to deal with Exceptions
  • Commenting code
  • Clean separation of concern
  • Duplicated logs and exceptions
  • Concurrent Collections
  • Command pattern
  • UnitOfWork pattern
  • Ile klas DTO potrzebujemy
  • „Fabryki” dla obiektów domenowych oraz metody biznesowe
  • Jak powinien wyglądać controller w angularze

Te emaile zawsze prefiksuję „[News from Code]” lub „[Wieści z kodu]”, czyli „[Wieści z kodu] Ile klas DTO potrzebujemy”. Dzięki temu łatwo się wyszukuje i też wiadomo czego po takim emailu się spodziewać.

Emaile to nie antypattern?

Dlaczego emaile a nie jakieś wiki/OneNote etc? Lepiej jakby to wszystko było w jakimś wiki i czytane przez wszystkich etc. Część wiedzy oczywiście wrzucam do projektowego OneNote’a. Zwłaszcza takie na wejście do projektu, żeby opisać z jakich tooli i w jaki sposób korzystamy. Wyszło mi jednak jeśli wziąłem pod uwagę cały kontekst firmy/projektu/etc że wysyłanie emaili w ten właśnie sposób będzie działać.

Ktoś ma podobne doświadczenia lub sugestie?

Opublikowano Programowanie | Otagowano | 2 komentarzy

Ja już korzystam z Domain Driven Design

Jestem oczarowany podejściem Domain Driven Design.

Pomaga to na kilku poziomach, zarówno jak pisać kod jak i jak architektonicznie budować cegiełki. Przemyślałem na nowo rzeczy, o których już kiedyś myślałem, że są mi znane – teraz wiem lepiej/wreszcznie naprawdę zrozumiałem. Temat jest ogromny i w tym krótkim wpisie nawet nie będę próbował wchodzic w szczegóły (nie ma czasu na pisanie, trzeba implementować). Chciałem wspomnieć tylko o materiałach, które aktualnie przerabiam.

Na początku przeczytałem dedykowane DDD fragmenty książki https://www.amazon.com/Microsoft-NET-Architecting-Applications-Enterprise/dp/0735685355 (chociaż nie polecam jej aż tak bardzo, lepiej przeczytać książkę Vernona przytaczaną w następnym zdaniu), od tego się zaczęło. Później były filmiki z opisane przeze mnie O architekturze ze Sławkiem Sobótką, jak również https://www.amazon.com/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/0321834577.

Aktualnie przeczytałem prawie wszystko z Artykuły i prezentacje – wiedza do pobrania, znakomita esencja tego co najważniejsze. Olbrzymim plusem jest to, że są to artykuły napisane po polsku z przykładami w Javie (gdzie wszystko na poziomie koncepcji jest takie samo jak w .NET – składnia minimalnie inna).

Opublikowano Programowanie | Otagowano | Dodaj komentarz

O architekturze ze Sławkiem Sobótką

Ostanio (już ze 4 miesiące temu) wkręciłem się w DDD (Domain Driven Design) a pchnęły mnie do tego między innymi poniższe filmiki Sławka Sobótki (http://bottega.com.pl). Kilka wynotowanych ciekawostek pod niektórymi nagraniami.

Polecam oglądnąć wszystko!

„Dlaczego …?” – „to zależy” – „zależy od czego?” – 1 godzina 1 minuta

„Możemy się wykazac autyzmem i zrobić w UMLu, dzidę wbić” – 39 minuta

Terapia dla traumy UML’owej – 27 minuta 10 sekunda

Switch są dozwolone tylko w czeluściach fabryk – 46 minuta 40 sekunda

Refactoring gdy nie znamy modelu – 48 minuta 35 sekunda

„Misiu, dlaczego nie sprzedałeś drugiego jachtu?” – 46 minuta (trwa 3 minuty)


3:43 kto Cię robił, Super Senior Developer i pakuje do Utilsa.
18:00 zapisywanie dzieci korzenia i brudzenie sztuczne korzenia. czy w .NET jest to rozwiązanie które on pokazał? Dobre praktyki za chwilę + o granicach agregatu.
31:00 zachęca do wołania save explicite.
39:00 nie będzie nieświeżych danych, będą eventually consistent. Tak jakby ktoś pobrał produkty i się gapił na nie przez pół godziny.

Oczywiście to nie wszystkie jego prezentacje, akurat do tych miałem notatki i bardziej mi utkwiły.

Inne prezentacje o CQRS, których też przy okazji wysłuchałem:


Opublikowano Programowanie | Otagowano , , | Dodaj komentarz

Entity Framework – Seed – wypełnianie danymi

Podczas podejścia z migracjami tworzona jest klasa Configuration: DbMigrationsConfiguration<MyContext>, która posiada metodę Seed() służącą do wypełniania danymi początkowymi. Ta metoda uruchamia się po każdym „Update-Database”. Jeśli więc teraz dodaliśmy nowy kod do tej metody to wykona się ona na bazie podczas następnego update’u bazy.

AddOrUpdate

Esencją tego podejścia jest metoda AddOrUpdate():

protected override void Seed(BookService.Models.BookServiceContext context)
{
    context.Authors.AddOrUpdate(x => x.Id,
        new Author() { Id = 1, Name = "Jane Austen" },
        new Author() { Id = 2, Name = "Charles Dickens" },
        new Author() { Id = 3, Name = "Miguel de Cervantes" }
        );

    context.Books.AddOrUpdate(x => x.Id,
        new Book() { Id = 1, Title = "Pride and Prejudice", Year = 1813, AuthorId = 1, 
            Price = 9.99M, Genre = "Comedy of manners" },
        new Book() { Id = 2, Title = "Northanger Abbey", Year = 1817, AuthorId = 1, 
            Price = 12.95M, Genre = "Gothic parody" },
        new Book() { Id = 3, Title = "David Copperfield", Year = 1850, AuthorId = 2, 
            Price = 15, Genre = "Bildungsroman" }
        );
}

Dzięki niej symulujemy operację Upsert czyli gdy danych brak to wstawiamy, a gdy są to nadpisujemy. Pierwszy argument do tej metody służy właśnie do weryfikowania czy dany wiersz już istnieje. Najczęściej będziemy tam przekazywać klucz główny, ponieważ jest on unikalny.

Nie tylko po kluczu głownym

Gdy dodajemy użytkowników a nie wiemy jakie będą Id które nam baza przydzieli (bo jest ustawione Identity), to musimy polegać na czymś innym. Możemy wtedy przekazać inną unikalną kolumnę np UserLogin. Wtedy wyglądałoby to:

protected override void Seed(BookService.Models.BookServiceContext context)
{
    Author jane = new Author() { Name = "Jane Austen", Login = "jane.austen" };
    Author dickens = new Author() { Name = "Charles Dickens", Login = "charles.dickens" };

    context.Authors.AddOrUpdate(x => x.Login, new []{ jane, dickens });

    context.Books.AddOrUpdate(x => x.Id,
        new Book() { Id = 1, Title = "Pride and Prejudice", Year = 1813, AuthorId = jane.Id, 
            Price = 9.99M, Genre = "Comedy of manners" },
        new Book() { Id = 2, Title = "Northanger Abbey", Year = 1817, AuthorId = jane.Id, 
            Price = 12.95M, Genre = "Gothic parody" },
        new Book() { Id = 3, Title = "David Copperfield", Year = 1850, AuthorId = dickens.Id, 
            Price = 15, Genre = "Bildungsroman" }
        );
}

Ten przypadek bardziej odpowiada temu co jest w rzeczywistych produkcyjnych systemach.

Podzielę się kilkoma rzeczami które dopiero w trakcie korzystanie zrozumiałem:

  • nie działa tutaj dodawanie poprzez navigation properties. Zawsze musi to być ustawianie kolumny odpowiedzialnej za relacje (ForeignKey). Jak w przykładzie na górze „AuthorId = 1”. Może inaczej – zadziała za pierwszym razem, ale już się wywali podczas kolejnych uruchomień seeda.
  • gdy z poziomu Package Manager Console uruchamiamy Update-Database to nie zawsze widzimy gdzie wywaliła się metoda Seed. Możemy na jej początku umieścić:
    // Used for attaching with second VS when running migration and Update-Database
    //if (System.Diagnostics.Debugger.IsAttached == false)
    //    System.Diagnostics.Debugger.Launch();
    

    i odkomentować gdy coś sie wywala, odpali tam to drugiego Visual Studio, którym zdebugujemy pierwszego.

  • gdy nie mamy klucza głównego, albo używanie go nie ma sensu przy relacji wiele do wielu, możemy użyć kilku column na raz, np:
    context.UserRoles.AddOrUpdate(x => new { x.UserId, x.RoleId }, userRole);
    
  • AddOrUpdate() jako drugi parametr przyjmuje listę obiektów a nie tylko jeden obiekt. Przykłady, z których się uczyłem nie pokazały tego, a jedna pętla mniej zawsze cieszy🙂
Opublikowano Programowanie | Otagowano , | Dodaj komentarz

Ergonomiczna bezprzewodowa klawiatura – Sculpt Ergonomic Desktop

Kupiłem sobie (z polecenia kolegi) pół roku temu taką klawiaturę:

Sculpt Ergonomic Desktop keyboard

Microsoft Sculpt Ergonomic Desktop

Sprawdza się bardzo dobrze. Kupiłem tylko dla klawiatury, a myszka też okazała się bardzo przydatna.

Posiada połączenie radiowe z laptopem za pomocą małego dongla USB. Jednego dla całego zestawu (nie zapychamy tylu portów). Dongle chowa się w myszce.

Bateria w klawiaturze wystarczyła komuś na rok czy dwa działania (nie pamiętam, ale i tak ciężko porównywać). Mi baterie (zwykłe AAA) wystarczyły tylko na pół roku, ale to dlatego, że woziłem ją często w torbie gdzie miała wciśnięte klawisze i cały czas „nadała”. Teraz bedę wkładał papier, żeby bateryjki nie stykały. Myszkę można wyłączać gdy nie używamy. Wyczerpywanie się baterii nie jest problemem – rozwiązano to, ponieważ poprzednie modele miały z tym problem.

W zestawie jest jeszcze oddzielna klawiatura numeryczna, z której nie korzystam.

Sculpt Ergonomic Desktop keyboard full set

Najdziwniejszą rzeczą jest przycisk Windows na myszce – zupełnie nieprzydatny. Można w niego np. naparzać z nudów gdy strona się długo ładuje.

Inne:

  • wygodna
  • minimalistyczna, wszystko jest blisko
  • mała i mieści sie w torbie z laptopem
  • Kosztuje ok 400zł

Polecam więc następnym produktywnym Developerom🙂

Opis na stronie producenta Sculpt Ergonomic Desktop

Opublikowano Tip of the day | Otagowano | 4 komentarzy