Dane testowe

Wszystkiemu winna szuflada

Tworząc projekty do szuflady może pojawić się problem, skąd i jak wygenerować zawartość. Chociaż kilku użytkowników, chociaż kilka wpisów, kilka słów, dzięki czemu można zobaczyć jak system będzie wyglądać gdy ktoś będzie z niego korzystać.

Pisałem wcześniej o generatorze losowych danych Faker (http://jaroslawstadnicki.pl/2015/04/generator-danych-faker/). Nadal z niego korzystam, dzięki temu w stosunkowo krótkim czasie byłem w stanie wygenerować całkiem sensowną, pod względem ilości – nie jakości, bazę danych na której pracuję.

Tests controller

W projekcie posiadam specjalny kontroler, z którego zarządzam generowaniem losowych (lub pseudo losowych) danych.

2016-04-24 14_12_58-title

Continue reading

Użytkownik czy użytkownicy? Jak nazywać klasy – moje doświadczenia.

Dobra nazwa

Szukałem porad w sprawie trudnej czynności jaką jest nazywanie .NET DEVELOPERS POLAND – facebook Co prawda w innym temacie, ale warto przeczytać aby uświadomić sobie jaka to ciężka praca. Także człowiek szuka i myśli i próbuje.

Próby

W ramach swoich poszukiwań i eksperymentowania z tworzeniem najlepszego i najczystszego kodu, najlepiej nazwanego i cacy. Dotarłem do takiej sytuacji, gdzie chciałem posiadać osobne klasy (kontrolery, serwisy, repo, co tam jeszcze) które rozróżniały operacja na pojedynczych obiektach lub na kolekcjach obiektów. Tworzyłem osobne klasy dla UserOperation jak i UsersOperation, ChannelService i ChannelsService. Koncepcja jak papier wszystko przyjmie. Niestety dosyć szybko zaczęło to boleć, bolało nawet dwa razy podobnie jak ostra papryczka. Continue reading

Czytaj kod jak książkę

Czytakpisanyblogbyłbyczytelnydlawas?
CzyMożeTakBędzieCzytelniej?
A_Może_Część_Z_Was_Preferuje_Taki_Zapis?
MgSZłŻITkLpjBdzZCztlnscNzTrz. (Aktualnie już nie pamiętam co tutaj napisałem)

Dlaczego gdy piszemy do ludzi potrafimy używać pełnych wyrazów, pełnych zdań, samogłosek i spółgłosek i nie skracamy. Natomiast gdy tylko siada jeden z drugim (ja nie jestem święty), piszemy P=ObsłużW(1,false, new Coś());
NIE MA SZANSY ŻE KTOŚ TO ZROZUMIE. NIE-MA.

Czy to jest wstyd pisać czytelny kod? Czy panuje u nas takie zdanie, że jak jesteś pro, to twojego kodu nikt nie może zrozumieć? Dostaje czasem jakiś kod do przejrzenia, żeby powiedzieć czy warto czy nie warto. Zdarzają się rozwiązania zadań oparte na if-else-if-else-if-else i globalnych zmiennych. Albo stringi wszędzie, czy 1,2,3,4,5,6 zamiast sensownego enuma.

Czemu tak jest? Lenistwo? Lans? Czy może tak jak napisał kiedyś mój dobry kolega Hanselman piszemy taki kod żeby czuć się nie zastępowalnymi. To totalny absurd! Ja chcę skoczyć i zmienić swój projekt, albo przez dowiezienie go do końca albo oddanie komuś po drodze. Staram się za wszelką uczynić go tak prostym żeby każdy mógł go przejąć.  Nie zmarnować nawet godziny na niepotrzebne tłumaczenie co i jak zrobiłem.  Gdzie jest to a gdzie jest inne coś.  Marzy mi się ze przychodzi ktoś w zastępstwo i mówi: wypas wszystko jasne, nie musisz niczego tłumaczyć, pokazywać czy demonstrować.  Wzorce są tam gdzie są potrzebne. Albo nawet ich nie ma. Bo może aplikacja była prosta.

Ale wiecie jest najważniejsze NAZWY.  Klasy, metody, warunki, zmienne, wszystko nazywa się zgodnie z tym co ma reprezentować robić i oznaczać.  Tak bym chciał.  Tak mi się marzy.  Wiem że droga jeszcze daleka ale nie podaje się i poprawiam.  Patrzę i czytam to co napisałem i się zastanawiam czy ja to jeszcze rozumiem czy to ma sens.  Czy ktoś to zrozumie?

Zmiany w ITAN są nie uniknione! #dajsiępozać

Good enough software moim zdaniem

Bogowie

Słuchając wystąpień wujka Boba czy innych wielkich mówiących o czystym kodzie, solidzie, testach, architekturze, devopsach i innych słowach kluczowych można popaść w depresję: “O żesz, mój kod nigdy taki nie będzie, lepiej nikomu go nie pokaże, sam zamknę się w piwnicy i do końca życia będę żywic się ziemniakami i robakami które będą do mnie przypełzać”.
Czy naprawdę tak jest? Czy kod który piszemy musi być jak kryształ?

Obrazek

Słuchając różnych podcastów, usłyszałem taka myśl: Gdy przychodzi do was klient i mówi, że potrzebuje zrobić dziurę w ścianie, żeby wkręcić haczyk, żeby na nim powiesić obrazek. Gdy zaczynają się tańce godowe sprzedawców którzy chcą sprzedać mu komplet wierteł, wiertarek, zaprawy murarskiej, farby, etc. Może pojawić się firmą z którą przegracie, bo zaoferują mu taśmę dwustronnie przylepną. Klient nie chce dziury w ścianie, chce obrazek na ścianie.
Podobnie z naszym wyścigiem zbrojeń, jasne że fajnie mieć super hiper wypasioną architekturę, testy które sprawdzają wszystko, continuos-wszystko i jeszcze więcej, tylko która z tych rzeczy jest tą taśmą dwustronną?

Continue reading

Zamień bóla na enuma

Dlaczego zamienić? Moim zdaniem czytelniej i jasno sformułowana myśl i łatwiej zrozumieć. Nie chodzi o prosty przypadek, gdzie zamiana polegałaby na zamianie true/false na MyEnum.True/MyEnum.False – nie nie, to byłoby szaleństwem. Ale może od razu do kodu, bo czas nagli dzisiaj.

Pierwszy przypadek, wszystko działa jak należy:

Jakaś tam klasa filtrów, przyjmuje (@3) identyfikator, nazwę i bit, które oznacza że filtr będzie grupą lub nie (w zasadzie nie wiadomo, czym jest nie-grupa)

Teraz wykorzystanie:

Zasadniczo prosty kod, jest jakaś lista filtrów (@5). Następnie dodajemy filtry; pierwsze id, jakaś nazwa i true, potem id, nazwa i false. Osoba nowa w projekcie, lub nowa w tej części kodu na pierwszy rzut oka nie będzie wiedzieć co to oznacza. Następne dwie linijki są trochę bardziej rozgadane, bo jawnie mówią jak interpretować ostatniego bool’a.
Dalej szukamy tylko tych, gdzie IsGroup jest ustawione na true (@12). Jeszcze dalej wołamy metodę, która robi to samo, ale na podstawie parametru wejściowego (@18). Najczęściej gdy się tworzy takie metody nie zwraca się dużej uwagi na nazwę parametru, bo albo to R# wygenerował, a on robi dobrze, albo jest to jedna linijka i nie muszę się nad tym za bardzo skupiać. Rzeczywiście sama metoda jest prosta, trudno się pomylić do czego służy parametr i gdzie go wykorzystać.
Spójrzcie teraz na klienta tej metody, ma przesłać dwa parametry, listę filtrów (to proste), a potem flagę która oznacza group – group co?! Trzeba zajrzeć do ciała metody, żeby sprawdzić co oznacza ten parametr i jak mam go wykorzystać. Można też poprawić nazwę parametru lub (czuję obrzyd jak to piszę) napisać dokumentacja.

A co gdyby napisać kod w taki sposób:

Na scenę wchodzi tajemniczy FilterType:

Jak widać, tajemniczy bohater to enum, które jawnie definiuje jakiego rodzaju może być filtr:

  • 0 – nie został określony, nikt nie wie, nikt nie słyszał. Jeśli w ten sposób został zainicjalizowany, to najprawdopodobniej nie zostanie nigdy wykorzystany
  • 1- Typ grupowy
  • 2- Typ pojedynczy (aha, teraz to trochę jaśniejsze)

Prosty klient klasy Filtr, może wyglądać jakoś tak:

Na początku ponownie tworzymy listę, tym razem nie trzeba zgadywać co oznacza true/false. Nie trzeba także uciekać się do używania nazwanych parametrów aby rozjaśnić intencje.
Następnie gdy wybieramy z kolekcji filtry (@12), znowu w jasny sposób mówimy o typie, który nas interesuje. I wreszcie na koniec metoda filtrująca (@18) także w jawny sposób definiuje parametry których wymaga do działania.

Co jeszcze dobrego płynie z przyjęcia enuma? Jeśli pojawi się nowy rodzaj, nie trzeba będzie wprowadzać kolejnego bool’a który będzie mówić, czy filtr jest czy nie jest danego rodzaju. Domyślnie filtr jest nie znanego typu, więc wszystkie podczas poszukiwać za grupowym/pojedynczym takie znaleziska się nie pojawią. Nawet gdy nazwa parametru będzie do bani, sam tym parametru sprzeda intencje programisty i użytkownik metody (@18) będzie wiedzieć jakiego rodzaju wartość ma przesłać, aby otrzymać interesująco go wynik.

I jeszcze na koniec: oczywiście że ciężko tworzyć enum’y do każdego wykorzystania bool’a. Równie ciężko jest pisać kod który działa i jest czytelny, bezbłędny czy zoptymalizowany – a jednak każdy się stara.

Miłego wieczoru!