Archive for the ‘Design patterns’ Category

Object Thinking

maj 7, 2008

Będąc w Galway wysłuchałem prezentacji ‘Object Thinking’ Alan’a Deana. Początek prezentacji, trzeba to powiedzieć, był zniechęcający, pojawiło się sporo akademickich formalizmów, mających nikłe odzwierciedlenie w codziennym życiu. Przykładowo przydługawe, dywagacje o tym który z terminów jest właściwy: software developer czy software engineer? Dość mistrzu, nie po to tu przyszedłem, nawijaj o obiektach.

Jednak gdy doszliśmy do meritum prezentacji, przestałem ziewać i zacząłem słuchać . Otóż padła propozycja aby odrzucić dotychczasowy sposób myślenia o klasach jako o zbiorze pól i właściwości, no i metod ale o nich za chwilę, i zastąpić je koncepcją samo-opisywalności. Zgodnie z propozycją, najprostsza, definicja klasy wyglądała by następująco:

public class Customer : Dictionary<Uri, Object> {}

Ciekawe prawda, ot taki pojemnik na wszystko. Metody, rzecz jasna, pozostają a ich celem jest opisywanie intencji klasy.

Uzasadnieniem takiego podejścia do klas, jest twierdzenie, że zdecydowana większość modyfikacji jakie, jesteśmy zmuszeni wprowadzać, dotyczy właśnie sposobu reprezentacji danych. Oczywiście tego typu zmiany zwykle, powodują reakcję łańcuchową i pociąga modyfikacje w innych klasach. Więc po co się z tym męczyć? Umożliwmy przechowywanie dowolnych danych i wszyscy będą szczęśliwi.

No chyba niezupełnie. Nie twierdzę, że idea jest pozbawiona sensu, bo widzę logikę tego rozumowania, jednak dostrzegam również kilka potencjalnych problemów.

Przede wszystkim porzucamy strong typing, wszystko może być obiektem więc konieczna jest walidacja elementów przechowywanych w naszym pojemniku. Oczywiście bez jawnego określenia typów, intellisense Visual Studio, przestanie nas ostrzegać o potencjalnych problemach. Dalej z punktu widzenia bazy danych, tabele też miały by zostać tylko pojemnikami na dane? Żadnych kluczy, indeksów etc. ? Już widzę jak przystają na to administratorzy baz danych.

Kolejnym problemem może być czynnik ludzki i nie chodzi mi tu o mentalne reperkusje przestawienia się na nowy sposób myślenia, a czysto pragmatyczne podejście. Nie oszukujmy się większość ludzi jest leniwa, a programiści to już w szczególności ;) . Wcale nie jest takie nieprawdopodobne, że niektóre wartości mogą być przechowywane w klasie po kilka razy (szczególnie jeśli pracujemy w zespole). Co może prowadzić do wszelakiej maści problemów.

Jak na razie nie oceniam, czekam, aż tęższe głowy od mojej wypowiedzą się w tej sprawie. Może za jakiś czas pojawią się jakieś study case, projektów wykorzystujących to podejście. Poczekamy zobaczymy. Tymczasem dla zainteresowanych slajdy i przykłady z prezentacji są dostępne tutaj.

UserControl, MVP i interfejs aplikacji mobilnych

sierpień 6, 2007

Stworzenie dobrego interfejsu aplikacji mobilnej jest wyzwaniem, szczególnie jeśli chcemy wykorzystać całą dostępną przestrzeń ekranu i nie bazować, tylko na właściwościach Anchor i Dock. W zależności od złożoności okna możemy próbować - manualnie, w kodzie, zmieniać położenie kontrolek - jednak jest to podejście pracochłonne i utrudniające przyszłe modyfikacje.

Mimo wszystko żyjemy w dobie wizualnych narzędzi programistycznych i szybciej przyjdzie nam utworzenie odpowiedniego interfejsu użytkownika przy użyciu designer’a wbudowanego w Visual Studio niż ręczne kodowanie położenia poszczególnych elementów okna.
Dlatego też lepszym rozwiązaniem może być utworzenie dwóch różnych form dla tego samego ekranu i wyświetlanie ich w zależności od aktualnej orientacji. To rozwiązanie ma jednak dość poważną wadę - otóż, nie możemy go zastosować do głównego ekranu naszej aplikacji (gdyż jest ono powiązane z podstawowym wątkiem programu). Aby wyeliminować tą niedogodność możemy umieścić zawartość naszego okna w kontrolce UserControl i mając dwie takie kontroli dla jednego ekranu (orientacja horizontal/landscape) możemy je wyświetlać w zależności od potrzeby.

Kolejnym problemem z jakim, w powyższym przypadku, przyjdzie się nam borykać jest to, iż musimy umieścić taki sam kod w dwóch różnych miejscach. Ale i na to jest rada - zastosowanie wzorca Model - View - Presenter (MVP). Przykład wykorzystania tego wzorca w tym konkretnym zastosowaniu można pobrać stąd.

MVP - UserControl example

O dobrym screencast‘cie traktującym o wzorcach Model - View - Presenter i Model - View - Controller pisałem tutaj.

Nie lubię spaghetti …

lipiec 6, 2007

Jestem zwolennikiem rozdziału zadań - tj. każda metoda powinna mieć jedno jasno określone zadanie, owszem można ją dodatkowo parametryzować aby np. wykonywała daną operacje na różne sposoby. Jeśli jedna metoda służy więcej niż jednej operacji, prędzej czy później ktoś będzie musiał którąś z tych operacji zmodyfikować i tu pojawiają się schody np. co gdy metoda jest użyta w więcej niż jednym miejscu i w każdym z tych miejsc musi ona przebiec inaczej? W podejściu jedna-metoda-jeden-cel zmieniamy tylko jedną funkcję ew. dodajemy nową w innym przypadku czeka nas refactoring.
Do tych dywagacji skłonił mnie kod nad którym pracuje, jest on dość skomplikowany (oczywiście brak jakiejkolwiek dokumentacji nie powinien nikogo dziwić) i jest on napisany w stylu wczesnego Basica. Teraz ja muszę rozplątać to spaghetti :(

Model View * Patterns Screencast

kwiecień 30, 2007

Czym są wzorce projektowe wie chyba każdy kto zajmuje się programowaniem (a przynajmniej powinien o nich słyszeć). Jednymi z bardziej przydatnych szablonów są wzorce - Model-View-Presenter (MVP) i Model-View-Contrler (MVC). Jednakże - pomimo, że można znaleźć całkiem sporą ilość informacji na ich temat - cały czas ciężko o proste, krok po kroku przedstawienie jak to wszystko powinno działać i jak uniknąć najczęstszych pułapek. O takową prezentacje pokusił się Craig Shoemaker prowadzący PolymorphicPodcast.com - i muszę przyznać, że mu się udało. W prosty sposób wyjaśnia jak zaimplementować wzorce i jak ich używać pomiędzy różnymi warstwami prezentacyjnymi. Cały screencast podzielony jest na pięć części i które razem z przykładami można ściągnąć stąd.