Spotkała mnie niesamowicie miła sytuacja, w której ktoś zrewidował kod podany w poprzednim artykule o pattern matchingu. Code review Blog-posta! How cool is that? 🙂 Co milsze wykazał błąd w rozumowaniu i podał bardziej prawidłowe rozwiązanie.

Głównym problemem przedstawionym przez kolegę jest użycie słownika w tym kontekście. To co sam kiedyś pamiętałem – Dictionary to nie kolejka FIFO i nie zapewnia, że elementy które wprowadziliśmy do słownika w pewnej zadanej kolejności w tej samej zostaną oddane. W takim wypadku użycie:

Może wcale nie sprawdzić po kolei wszystkich warunków i zatrzymać się na pierwszym który je spełnia. Równie dobrze może zacząć od końca. W takim wypadku kod jest poprawny jedynie jeśli warunki zaprzeczają sobie i nie jest istotna kolejność ich sprawdzania. Niestety w moim przypadku jak najbardziej jest, zwłaszcza, że jeden z warunków został zapisany tak:

Gdyby przetwarzanie zaczęło się od tego warunku, to na nim by się też skończyło i zawsze wykonywało tylko tą czynność.

Problem z automatu wskazuje na użycie tablicy. Tablica jest numerowana więc nie ma problemu z kolejnością wpisów. Sprawę uprościć można używają ciągu, a nie macierzy. Jako elementy tablicy użyć można obiektów tego typu:

Mając te elementy należy je umieścić w jakimś kontenerze. Ja utworzyłem tablicę, ale wiedząc jak chcę używać tych obiektów automatycznie przekształciłem je na listę  w ten sposób:

Lista jest mi potrzebna ponieważ chcę używać linq by mój kod był jak najbardziej zbliżony do funkcyjnego.

Na koniec pozostała najprostsza rzecz czyli użycie tego w testach i w funkcji main. Można się spodziewać, że wiele się nie zmieniło, a moim zdaniem nawet zyskało na czytelności. W tej chwili dokładnie widać, ża najpierw sprawdzamy wzorzec (CheckPattern), a potem używamy “zapałki” (UseMatch).  Testy:

Funkcja Main:

Mam nadzieję, że również będziecie komentować i robić review tego kodu. Wszędzie używam tricków z C#6. Nie tłumaczę ich bo mam nadzieję, że są czytelne.

One Reply to “Pattern Matching dla biednych – part 2”

  1. Pingback: dotnetomaniak.pl

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *