Autor Wątek: Wzorzec projektowy  (Przeczytany 18023 razy)

Offline siso

  • Użytkownik

# Lipiec 01, 2012, 09:43:00
Tak jakbyś często miał luksus pisania kodu od samego początku. Najczęściej masz do utrzymania kod, który ma swoje lata i swoje już przeżył.
No i wreszcie doszliśmy do samego sedna :) Brawo!
Gdyby każdy brał odpowiedzialność za jakość swojego kodu, takie sytuacje nie miałyby w ogóle miejsca. A ponieważ tak nie jest, to siedzę teraz czwarty tydzień w pracy nad poprawianiem UI w aplikacji, którą kleciło chyba jakieś stado studentów przed sesją. A po tym już mam zaplanowany refaktoring logiki biznesowej, bo ci sami studenci po sesji też najwyraźniej nie chcieli pisać porządnie.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Lipiec 01, 2012, 10:56:12
Cytuj
Gdyby każdy brał odpowiedzialność za jakość swojego kodu, takie sytuacje nie miałyby w ogóle miejsca.
A był w tej bajce smok?

Kwestia raczej wygląda tak, że masz na starcie coś, co realizuje funkcjonalność X. Masz zadanie dorobić do tego funkcjonalność Y. W jak najkrótszym czasie. Pomimo tego, że kod nigdy nie przewidywał że funkcjonalność Y będzie potrzebna, albo że będzie w ogóle istniała. Potem taki kod robiący X i Y musi zacząć robić Z. A o Z też nigdy wcześniej nikt nie śnił nawet. Tak po prostu wygląda biznes.

Offline koirat

  • Użytkownik

# Lipiec 01, 2012, 11:20:48
A był w tej bajce smok?

Kwestia raczej wygląda tak, że masz na starcie coś, co realizuje funkcjonalność X. Masz zadanie dorobić do tego funkcjonalność Y. W jak najkrótszym czasie. Pomimo tego, że kod nigdy nie przewidywał że funkcjonalność Y będzie potrzebna, albo że będzie w ogóle istniała. Potem taki kod robiący X i Y musi zacząć robić Z. A o Z też nigdy wcześniej nikt nie śnił nawet. Tak po prostu wygląda biznes.

Bo ludzie robią kaszanę bez wcześniejszego projektowania/zastanowienia dlatego tak to wygląda. Warto stosować zasady SOLID w tym wypadku zasadę open-close .
« Ostatnia zmiana: Lipiec 01, 2012, 13:05:25 wysłana przez koirat »

Offline Karol

  • Użytkownik

# Lipiec 01, 2012, 11:46:23
Bo ludzie robią kaszanę bez uwcześniejszego projektowania/zastanowienia dlatego tak to wygląda. Warto stosować zasady SOLID w tym wypadku zasadę open-close .
W teorii to zawsze fajnie brzmi i wygląda, ale w praktyce jest zawsze inaczej. Nie da się z góry wszystkiego przewidzieć (a szczególnie żądań klientów i wymogów czasowych) i prędzej czy później dojdzie do grzebania w kodzie tam, gdzie tego się chciało uniknąć.

Offline koirat

  • Użytkownik

# Lipiec 01, 2012, 13:08:45
Ale ty nie masz niczego przewidywać. Dobry design jest otwarty na zmiany. Oczywiście zawsze może zaistnieć sytuacja że coś będzie wymagało większych zmian w systemie. Jednak projektując system mając na uwadze zasady SOLID unikamy nadmiernych zmina w kodzie podczas zaistnienia takich przypadków.

Offline Xion

  • Redaktor
    • xion.log

# Lipiec 01, 2012, 15:22:21
Cytuj
Bo ludzie (...)
Brawo: właśnie odkryłeś co jest największą przeszkodą w pisaniu dobrego kodu ;-)

Cytuj
Cytuj
Podobną analizę można przeprowadzić np. dla wzorca Iterator, chyba nawet klasyfikacja wg języków będzie taka sama :)
Rad bym obejrzeć taką argumentację.
Służę. (Klasyfikacja według języków jednak nie jest taka sama - Java poczyniła postępy ;)):
  • Iterator jest wzorcem wbudowanym np. w Javie, Pythonie, C++11 czy Rubym. W tych językach jest on obsługiwany bezpośrednio przez elementy składniowe (np. pętlę for w Pythonie) i nie potrzeba w ogóle odwoływać się do obiektu iteratora aby skorzystać z jego funkcjonalności, tj. przechodzenia po kolekcji w uogólniony sposób, bez znajomości szczegółów implementacyjnych tejże kolekcji.
  • W C++03 iterator jest wzorcem jawnym, gdyż skorzystanie z niego wymaga jawnego stworzenia obiektu iteratora (np. poprzez std::vector::begin) i świadomego skorzystania z jego protokołu (operatory * i ++). Wciąż jednak jest to jeden protokół, niezależny od kolekcji (dla uproszczenia mówię tu tylko o forward iterator).
  • Trochę ciężko jest podać języki w których iterator może być uznawany za wzorzec niejawny. Od biedy można by wspomnieć o C i sytuacjach takich jak ta, gdzie "iterator" należy stworzyć jawnie i robi się to inaczej dla każdego typu iteracji (por. np. zwykłe przejście po null-terminated stringu).

Offline siso

  • Użytkownik

# Lipiec 01, 2012, 16:23:30
Nie Krzysiek, nie było smoka. Profesjonaliści nie wierzą już w smoki w kodzie. Profesjonaliści, drogi kolego, nie zasłaniają się niemożnością jego zmiany, brakiem czasu, nie zasłaniają się też koniecznością refaktoryzacji.

Trik polega na tym, że wcale nie musisz mieć wszystkiego podanego na tacy. Nie trzeba wszystkiego przewidzieć zawsze i w stu procentach dokładnie. Po to właśnie zostało ukute pojęcie "continuous refactoring". Jeśli zastałeś zmianę wymagań, zastosuj ją w kodzie, jeśli musisz, ale nie łatając jak popadnie, tylko projektując. Z głową. To nie boli :)

@Xion
Podany przez mnie przykład dotyczył potępienia singletona jako wzorca, określenie go nawet mianem antywzorca. Ty przytoczyłeś różne sposoby realizacji wzorca Iterator. Być może się nie zrozumieliśmy. W przeciwnym wypadku czekam dalej na argumentację pokazującą Iterator jako antywzorzec.
Powodzenia :)

Offline Xion

  • Redaktor
    • xion.log

# Lipiec 01, 2012, 17:40:04
Cytuj
W przeciwnym wypadku czekam dalej na argumentację pokazującą Iterator jako antywzorzec.
Successful troll is successful?...

W obu przypadkach (singletona i iteratora) ilustrowałem tylko koncepcję podziału wzorców na kategorie wedle tego jak wygląda ich implementacja w poszczególnych językach. Nigdzie nie podejmowałem się ich oceny jako "legit" i "anty". Nie wiem nawet jak naciągana musiałaby być interpretacja moich wcześniejszych wypowiedzi, żeby można było coś takiego z nich wyczytać.

Offline siso

  • Użytkownik

# Lipiec 01, 2012, 18:17:34
W obu przypadkach (singletona i iteratora) ilustrowałem tylko koncepcję podziału wzorców na kategorie wedle tego jak wygląda ich implementacja w poszczególnych językach. Nigdzie nie podejmowałem się ich oceny jako "legit" i "anty". Nie wiem nawet jak naciągana musiałaby być interpretacja moich wcześniejszych wypowiedzi, żeby można było coś takiego z nich wyczytać.
Odpowiedziałeś na moje sprostowanie mówiące, że singleton jest obecnie coraz częściej postrzegany jako antywzorzec. Tak jak podejrzewałem, nie zrozumiałeś sensu mojej wypowiedzi.

Cytuj
Successful troll is successful?...
Jeśli wykazanie Twojej pomyłki w toku dyskusji nazywasz trollowaniem, to może faktycznie lepiej już nie dyskutujmy. Po co masz mnie wyzywać od trolli i dalej odwracać kota ogonem...

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +2
# Lipiec 01, 2012, 19:06:12
Cytuj
Profesjonaliści, drogi kolego, nie zasłaniają się niemożnością jego zmiany, brakiem czasu, nie zasłaniają się też koniecznością refaktoryzacji.
Z tym brakiem czasu, to jeszcze wytłumacz to wszystko wyższemu managementowi. ;)

Offline siso

  • Użytkownik

# Lipiec 01, 2012, 19:19:34
Z tym brakiem czasu, to jeszcze wytłumacz to wszystko wyższemu managementowi. ;)
Ha! Trik polega na tym, żeby robić takie poprawki małymi kroczkami, niejako "przemycając" refactoring kawałek po kawałku ;)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Lipiec 01, 2012, 21:31:14
Cytuj
Trik polega na tym, żeby robić takie poprawki małymi kroczkami, niejako "przemycając" refactoring kawałek po kawałku ;)
No to się i tak robi. Tyle że nie ma to już nic wspólnego z "projektujemy wszystko na cacy a potem kodujemy".

Offline siso

  • Użytkownik

  • +2
# Lipiec 02, 2012, 19:19:32
No to się i tak robi. Tyle że nie ma to już nic wspólnego z "projektujemy wszystko na cacy a potem kodujemy".
Dokładnie tak, bo czasy "projektowania wszystkiego na cacy" bezpowrotnie minęły. Definicja "projektowania" zmieniła się, chociaż niektórzy jeszcze wciąż chcą widzieć w tym pisanie dziesiątek stron dokumentacji. Projektowanie oprogramowania nierozerwalnie związane jest z kształtowaniem kodu od poznania wymagań aż do ich zrealizowania. A refaktoring taki jest po prostu jakimś  (mniejszym lub większym) krokiem w kierunku poprawienia dizajnu.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +2
# Lipiec 02, 2012, 21:06:54
Cytuj
A refaktoring taki jest po prostu jakimś  (mniejszym lub większym) krokiem w kierunku poprawienia dizajnu.
No właśnie. Dzisiaj dobry design to taki, który implementuje nową wymaganą funkcjonalność, a przy okazji sprząta i ogarnia trochę tego co przez wieki narosło.