Piszę program do symulacji aktywności mrówek w siatce (PDF). Mrówka może się przemieszczać, podnosić i upuszczać.
Problem polega na tym, że działanie mrówek i położenia każdej mrówki można łatwo śledzić za pomocą atrybutów klasy (i możemy łatwo stworzyć wiele instancji takich mrówek), mój klient powiedział, że ponieważ ma doświadczenie w programowaniu funkcjonalnym, chciałby symulacja, którą należy wykonać przy użyciu programowania funkcjonalnego.
Żeby było jasne, oryginalne słowa od klienta to tylko „brak klasy”, ale nie „programowanie funkcjonalne”. Zakładam więc, że nie chodzi o programowanie funkcjonalne i mogę to zrobić koniecznie. Ponadto nie mam wcześniejszego doświadczenia w programowaniu funkcjonalnym.
Myślę jednak, że warto skupić się na tym pytaniu, szczególnie na wymogu programowania funkcjonalnego, niż po prostu „zrób to koniecznie”.
Jak poradziłbyś sobie z tą sytuacją? Czy próbowałbyś przekonać swojego klienta, że programowanie obiektowe jest znacznie bardziej przejrzyste, postarać się postępować zgodnie z jego wymaganiami i dać mu kod niskiej jakości, czy zrobić coś innego?
Odpowiedzi:
Kod zorientowany obiektowo nie jest z definicji czyszczący, a odwrotnie, kod inny niż OO nie jest z definicji gburowaty. Chociaż wydaje się, że istnieje dość oczywiste mapowanie obiektowe na ten konkretny problem, sugerowałbym, aby mimo to spróbować funkcjonalnego podejścia do programowania. Daj z siebie wszystko, spróbuj rozwiązać problem w najlepszym funkcjonalnym stylu programowania, który możesz zdobyć, a możesz po prostu nauczyć się czegoś, czego się nie spodziewałeś.
źródło
Wspominasz, że klient zwykł programować w funkcjonalnym języku, być może ma powód, dla którego wymaga pisania kodu w funkcjonalnym stylu. Powinieneś zapytać go dlaczego .
Może zamierza zachować kod i zachować go później.
Co więcej, nie sądzę, że dwie opcje to albo zrobienie tego w stylu OO, albo napisanie kiepskiego kodu, jak wspomniałeś. Na pewno pisanie kodu funkcjonalnego w takim przykładzie może być trudniejsze, szczególnie jeśli masz doświadczenie w językach zorientowanych obiektowo, ale jeśli klient jest gotów poczekać trochę dłużej, abyś nauczył się funkcjonalnego stylu, to nie byłoby boli go o to zapytać.
Zapytałbym go, dlaczego chce kodu w funkcjonalnym stylu, a jeśli czas nie jest tak wielkim problemem, poprosiłbym o kilka dodatkowych dni, aby przyzwyczaić się do programowania funkcjonalnego. (hurra za zarabianie na nauce!)
Jeśli wszystko inne zawiedzie, wyjaśnij, że zajęłoby ci to znacznie mniej czasu, aby zrobić to w stylu OO.
źródło
Czy zdajesz sobie sprawę, że programowanie funkcjonalne nie oznacza tylko „programowania bez klas”?
Zobacz pełny artykuł na ten temat w Wikipedii , ale w skrócie ...
Programowanie funkcjonalne jest paradygmatem programowania, podobnie jak OO jest paradygmatem programowania.
Jeśli twoje tło jest w OO, to mogę zobaczyć, jak chcesz, aby wszystkie twoje mrówki były obiektami. Z drugiej strony, jeśli symulujesz farmę mrówek z milionami mrówek, OO i przekazywanie wiadomości mogą stać się nieefektywne.
Na szczęście dla Ciebie Python ma doskonałe narzędzia do programowania funkcjonalnego (najważniejsze jest to, że funkcje są obiektami najwyższej klasy).
Programowanie funkcjonalne Pythona HOWTO
źródło
Wyjaśnij swojemu klientowi, że jeśli chce programowania funkcjonalnego, powinien zatrudnić kogoś, kto się w tym specjalizuje. Programowanie funkcjonalne różni się bardzo od OOP i pomylisz się, jeśli uważasz, że możesz go łatwo odebrać i dostarczyć kompleksowe rozwiązanie wysokiej jakości.
źródło
Istnieje powszechne błędne przekonanie, że „OO” jest całkowicie sprzeczne z „funkcjonalnym”. Te rzeczy mogą iść w parze bardzo dobrze. W twoim przykładzie „Ant” może być modelowany jako abstrakcyjny typ danych, który można łatwo zaimplementować za pomocą klas i obiektów. Przejścia między stanami „Ant” można naturalnie modelować za pomocą funkcji, co doprowadzi cię do funkcjonalnego podejścia, o ile klasa „Ant” jest niezmiennym typem.
I pamiętaj, że „obiekty” mogą być zamienione przez funkcjonalną koncepcję zamknięcia, ponieważ przedmioty są zamknięciami biednego człowieka, przedmioty biednego człowieka są… ;-):
https://stackoverflow.com/questions/2497801/closures-are-poor-mans-objects-and-vice-versa-what-does-this-mean
https://stackoverflow.com/questions/501023/closures-and-objects
źródło
Po rozmowie z klientem, jeśli nadal chce to po swojemu, albo wykonujesz profesjonalną robotę, a jeśli nie możesz, albo nie podpisujesz kontraktu, albo znajdujesz rozwiązanie.
Tworzenie „gównianego kodu” tylko dlatego, że się nie zgadzasz, byłoby wysoce nieprofesjonalne.
źródło
Dlaczego wszyscy zakładamy, że klient zna różnicę między programowaniem funkcjonalnym a imperatywnym? Wiele osób nie zna nazw ani specyfiki paradygmatów programowania innych niż OO i chętnie zamienia terminy takie jak „proceduralne”, „imperatywne” i „funkcjonalne”.
Nie chodź tak, jak mówią ci inni, chyba że uważasz, że powinieneś iść tą drogą. Dlatego jeśli nie uważasz, że programowanie funkcjonalne jest odpowiednie, nie nastawiaj się na porażkę lub podejmuj się projektu bez entuzjazmu.
Jeśli klient pisze spec następnie wdrożyć spec, inaczej piszesz spec i realizować swoje spec.
Najlepszą strategią wpływania na decyzje klientów jest uczynienie niepożądanej opcji znacznie droższą. Działa za każdym razem.
Jeśli jesteś ekspertem (w stosunku do klienta), powinieneś być w stanie ich przekonać.
Aby naprawdę wiedzieć, czy klient ma rację, musisz zdobyć więcej doświadczenia z programowaniem funkcjonalnym, abyś mógł go zestrzelić z pewnością lub uświadomić sobie, że twoje nastawienie do OO wynika z twojego braku doświadczenia.
Dlaczego nie zrobić tego w obie strony, pozwól klientowi zobaczyć obie implementacje i zdecydować, które łatwiej utrzymać. Po prostu uwzględnij to wszystko w swoich szacunkach projektu, abyś mógł cieszyć się krzywą uczenia się podczas zarabiania.
źródło
Zanim przejdę dalej, upewnię się, że oboje mówicie o tym samym. Możesz zapytać go, kiedy oprogramowanie jest dla niego „obiektowe”. Sine powiedział, że to nie jest jego główna wiedza, być może ma on wypaczony pomysł.
Na przykład wiele osób mogłoby rozważyć
być klasycznym podejściem obiektowym, ale
nie (nawet jeśli oba są w równym stopniu zorientowane obiektowo, o ile chodzi o klasyczne dane wraz z funkcjami, które na nich działają).
źródło
Myślę, że musisz się lepiej uczyć paradygmatów programowania. Obiektowy kod programowany niekoniecznie jest czystszy, aw rzeczywistości nie ma uniwersalnego zastosowania. Ponadto dobry obiektowy programista wie, jak wykonać dobrą pracę za pomocą proceduralnych / modułowych (w paradygmacie funkcjonalnym i deklaratywnym jest to nieco trudniejsze, ale dobry programista nie powinien być zbyt trudny do przybycia - poprzez czytanie i dedukcję - do akceptowalnego rozwiązania FP / deklaratywnego).
Prawie nigdy nie możesz, powtarzam, prawie nie możesz dobrze zrozumieć, kiedy i jak korzystać z Object Orientation, bez dobrego zrozumienia programowania proceduralnego i modułowego. OO to znacznie więcej niż tylko deklarowanie klas i hierarchii dziedziczenia.
Jeśli nie możesz napisać dobrego kodu proceduralnie, wątpię, czy możesz napisać dobry kod w sposób obiektowy. Kropka. Nie próbuję tutaj osądzać, ale należy to potwierdzić.
Orientacja obiektowa jest rozszerzeniem programowania proceduralnego i modułowego. Orientacja obiektowa zapewnia po prostu narzędzia, które przy odpowiednim zastosowaniu dają lepsze mechanizmy radzenia sobie z problemami enkapsulacji, łączenia, spójności i ponownego użycia / rozszerzalności kodu.
Ale wszystkie te problemy nie są nieodłączne i specyficzne dla OO. Istnieją w kodzie proceduralnym / modułowym (i w innych paradygmatach w tej sprawie). Jest to rodzaj problemów ze złożonością, które w swej istocie są niezależne od paradygmatów. Jeśli nie poradzisz sobie z nimi bez kleju OO, to jest mało prawdopodobne, że poradzisz sobie z nimi.
=========
Wracając do pierwotnego pytania, czy spróbować przekonać klienta. To zależy. Jak powiedział Sean McMillan, jeśli klient po prostu próbuje mikro-zarządzać pracami rozwojowymi nad jakimś programem (czytanie, polityka biurowa), odejdź. Ludzie, którzy dokonują tego sabotażu, projektują, aby obwiniać kogoś innego lub realizować konkretny program. Nie chcesz się w to angażować.
OTH, mogą istnieć inne powody takiego wymogu. Wiele sklepów osadzonych, zarówno dobrych, jak i złych, decyduje się na wiele ograniczeń dotyczących tego, co można zrobić w C ++ (na przykład bez metod wirtualnych, bez wyjątków). Czasami robi się to w sposób szarpiący kolana. W innych przypadkach istnieją uzasadnione przyczyny techniczne.
Musisz więc zrozumieć, dlaczego klient chce unikać kodu OO. A jeśli możesz przypuszczać, że nie ma programu politycznego (bez czerwonych flag), powinieneś zrobić coś profesjonalnego, czyli po prostu zrobić kod proceduralny / modułowy i zrobić dobrą robotę.
Naprawdę nie ma usprawiedliwienia dla dostarczania kiepskiego kodu, niezależnie od paradygmatu programowania. Jeśli nie możesz stworzyć akceptowalnego kodu za pomocą jednego paradygmatu, z całą pewnością nie możesz stworzyć akceptowalnego kodu w ogóle.
źródło
Mieszacie struktury danych i programowanie obiektowe (powszechne zamieszanie w tym zainfekowanym świecie OO)
Jeśli wszystko, co musisz zrobić, to „śledzić atrybuty danych” w strukturze danych i modyfikować je, to prawie każdy język utworzony po latach 70. będzie miał dla niego dobre wsparcie, OO lub nie.
To, co łatwiej zrobić w OO, to szorstka mucha
Jeśli nie potrzebujesz jednej z nich, zasadniczo każdy paradygmat programowania powinien rozwiązać ten problem bez zbyt wielu problemów.
źródło
(Jest to kolejny przykład pomylenia problemu społecznego z zagadnieniem technicznym / projektowym).
Istnieją dwie możliwości:
Twój klient spodziewa się, że będzie mógł pobrać napisany przez Ciebie kod i zaadaptować go lub zachować samodzielnie po zakończeniu pisania. Jeśli tak, to powinieneś dowiedzieć się znacznie więcej o „stylu domu” - funkcjonalne vs OO to tylko wierzchołek góry lodowej. Musisz albo ograniczyć się do stylu programowania, który rozumie twój klient, albo musisz nauczyć swojego klienta stylu, który preferujesz. (Raz poproszono mnie o zbudowanie aplikacji internetowej z CGI, bez użycia szablonów lub bibliotek, ponieważ klient może chcieć wprowadzić zmiany).
Twój klient próbuje kontrolować rozwój z powodu jakiegoś programu. To pełna szaleństwa torba, z którą nie chcesz mieć nic wspólnego. Jeśli naprawdę dostarczasz oprogramowanie „pod klucz”, klient nie powinien się przejmować, czy składa się on z chomików poruszających się na kołach, o ile działa niezawodnie. Pozwolenie na mikrozarządzanie w ten sposób wymaga jedynie bólu.
To Ty decydujesz, w jakiej jesteś sytuacji, i postępujesz zgodnie z nią.
źródło
Umm ... czy tylko ja tutaj myślę „to oczywiście praca testowa / zadanie”? .
Po pierwsze - samo zadanie ma charakter „akademicki” (symuluje aspekt zachowania mrówek).
Po drugie - żądanie implementacji wymagań przy użyciu (lub unikania) bardzo specyficznego paradygmatu programistycznego pachnie „klientem”, który może czytać kod i dokonywać takich twierdzeń.
Jeśli tak jest, lepiej rób to, co jest od ciebie wymagane - będzie to raczej przyjemne doświadczenie edukacyjne, a jeśli możesz to zrobić, nauczysz się wiele podczas tego procesu ...
Jeśli tak nie jest, powinieneś zapytać siebie i / lub klienta o uzasadnienie zlecenia. Jeśli rozumowanie jest solidne, zrób to - nauczysz się i będziesz lepszy jako programista tego doświadczenia. Kto wie - możesz nauczyć się lubić funkcjonalny styl w stosunku do OO.
Jeśli brakuje wyjaśnienia, wszystkie zakłady są wyłączone. Nie mogę ci zalecić, co robić.
Możesz spróbować niezależnie od wdrożenia wymagań w funkcjonalnym języku / stylu lub możesz grzecznie odrzucić ofertę, jeśli poczujesz coś podejrzanego.
Najważniejsze jest - gdy zrozumiesz motywację stojącą za wymaganiami, właściwy kierunek działania stanie się oczywisty.
EDYCJA: Po przekątnym spojrzeniu na przywoływany plik PDF, opisane tam algorytmy z pewnością wydają się dobrze pasować do funkcjonalnego stylu, a nie do OO
źródło
Prośba o zastosowanie programowania funkcjonalnego ma kilka dobrych aspektów:
Ale są też niepokojące objawy:
źródło
Oparcie się na powyższych odpowiedziach, że być może OO nie jest najlepszym rozwiązaniem, w którym to przypadku klient może mieć rację.
Spójrz na AI Challenge, które modeluje niektóre zachowania wyszczególnione w pytaniu tutaj http://aichallenge.org, a następnie zapoznaj się z różnorodnością pakietów startowych - http://aichallenge.org/starter_packages.php/ most są języki, których nie umieszczałbym w paradygmacie OO.
źródło
Nie napisałeś nic o języku programowania, który jest prawdopodobnie najważniejszą rzeczą. Różnica między OOP a programowaniem funkcjonalnym polega nie tylko na sposobie organizacji kodu, ale także na języku. W przypadku wysokiej współbieżności używany jest funkcjonalny język Erlang, który ma bardzo dużą przewagę nad np. Javą (jest używany np. Przez czat na Facebooku). Rozwiązanie OOP może po prostu zawieść z powodu problemów z wydajnością.
Tutaj klientem jest uniwersytet, więc język to nie tylko kwestia wydajności / konfiguracji, kod może być również wykorzystywany do pracy dydaktycznej ze studentami lub do własnych badań. Tak więc „przekonanie” klienta do wyboru innego paradygmatu nie ma moim zdaniem zastosowania tutaj. Możesz albo poradzić sobie z zadaniem, albo nie możesz (i dlatego nie powinieneś brać tego projektu).
źródło
Klient mówi „skacz”, twoja odpowiedź brzmi: __ _ ?
Dla mnie postaram się przekonać, czy ma to sens (nowy projekt), ale mam też klienta z 10-letnią aplikacją VB6, którą czasami aktualizuję ... nie zamierzam ich przekonywać
źródło
„Zbadaj” trochę swojego klienta (w sposób niekonfrontacyjny):
Czy klient faktycznie zna różnicę między OOP a programowaniem funkcjonalnym? Czy obawy / prośby klienta są uzasadnione?
Jeśli „Tak”: Jeśli masz kwalifikacje, rób, co chcesz i zabierz swoje pieniądze. Jeśli nie masz kwalifikacji, powiedz im o tym i pozwól im zdecydować, co robić.
W przeciwnym razie: cześć, ogon!
źródło
Ta funkcja działa, o ile nie odczytuje / nie zapisuje niczego poza funkcją. Gdyby funkcja dotknęła zmiennej klasy, przestałaby być „funkcjonalna”. Zaletą funkcjonalnego stylu jest to, że nie ma już błędów związanych ze zmianą lub nieprawidłowym stanem. Duża liczba funkcji to tylko formuły matematyczne. To funkcjonalne programowanie w pigułce.
BTW możesz łączyć funkcjonalny styl w projektowaniu obiektowym lub zorientowanym. Na przykład dwie zmienne „Punkt” to obiekty ze stanem. A funkcja nadal działa! Tak !!
źródło