To dość niejasne pytanie, ale na pytanie, na które nigdy nie czułem, odpowiedziano w zadowalający sposób, czytając o właściwym projekcie.
Zasadniczo, gdy dowiadujesz się o programowaniu obiektowym, abstrakcji, faktorowaniu itp., Święty graal projektowania - i powód, dla którego zawsze twierdzą, że używasz danych technik programistycznych - jest taki, że twój program będzie „łatwy do zmiany” , „konserwowalne”, „elastyczne” lub dowolny z synonimów użytych do wyrażenia tak produktywnie brzmiącego pojęcia. Oznaczając ivars jako prywatne, dzieląc kod na wiele małych, niezależnych metod, zachowując ogólne interfejsy, prawdopodobnie zyskujesz możliwość modyfikowania programu z całkowitą łatwością i gracją.
W przypadku stosunkowo niewielkich zmian zadziałało to dla mnie dobrze. Zmiany wewnętrznych struktur danych wykorzystywanych przez klasę w celu zwiększenia wydajności nigdy nie były poważną trudnością, podobnie jak zmiany interfejsu użytkownika, niezależne od API, takie jak przeprojektowanie systemu wprowadzania tekstu lub przegląd grafiki dla elementu rozgrywki .
Wszystkie te zmiany wydają się z natury samowystarczalne. Żadna z nich nie wiąże się z żadnymi zmianami w zachowaniu lub projekcie modyfikowanego komponentu programu, w zakresie, w jakim dotyczy to kodu zewnętrznego. Niezależnie od tego, czy piszesz proceduralnie, czy w stylu OO, z dużymi funkcjami lub małymi, są to łatwe zmiany, które możesz wprowadzić, nawet jeśli masz umiarkowanie dobry projekt.
Jednak za każdym razem, gdy zmiany stają się duże i owłosione - to znaczy zmiany w interfejsie API - żaden z moich cennych „wzorów” nigdy nie przychodzi na ratunek. Wielka zmiana pozostaje duża, dotknięty kod pozostaje dotknięty, a wiele godzin pracy nad spawaniem błędów stoi przede mną.
Więc moje pytanie brzmi: Jaką zmianę może usprawnić właściwy projekt? Czy istnieje jakaś inna technika projektowania, która jest mi nieznana lub której nie udało mi się wdrożyć, która naprawdę sprawia, że modyfikacja lepkiego brzmienia jest prosta, czy też ta obietnica (którą słyszałem złożoną przez tak wiele różnych paradygmatów) jest po prostu fajnym pomysłem, całkowicie odłączony od niezmiennych prawd rozwoju oprogramowania? Czy istnieje „narzędzie zmiany”, które mogę dodać do paska narzędzi?
Problem, który napotkał mnie na forach, jest następujący: pracowałem nad wdrożeniem zinterpretowanego języka programowania (zaimplementowanego w D, ale to nie dotyczy) i zdecydowałem, że argumentami moich zamknięć powinny być oparte na słowach kluczowych, a nie pozycyjne, jakie są obecnie. Wymaga to modyfikacji całego istniejącego kodu wywołującego funkcje anonimowe, co na szczęście jest raczej niewielkie, ponieważ jestem na wczesnym etapie rozwoju mojego języka (<2000 linii), ale byłoby ogromne, gdybym podjął tę decyzję na późniejszym etapie. Czy w takiej sytuacji jest jakikolwiek sposób, który dzięki właściwemu przewidywaniu projektu mógłbym ułatwić tę modyfikację, czy też pewne (najbardziej) zmiany są z natury daleko idące? Jestem ciekawy, czy to w jakikolwiek sposób zawodzi moje umiejętności projektowe - jeśli tak, to ja ”
Mówiąc wprost, nie jestem w żaden sposób sceptyczny wobec OOP ani innych powszechnie używanych wzorów. Dla mnie jednak ich zaletami są oryginalne zapisy, a nie utrzymanie baz kodu. Dziedziczenie pozwala dobrze wyodrębnić powtarzające się wzorce, polimorfizm pozwala rozdzielić kod według funkcji zrozumiałej dla człowieka (która klasa), a nie efektu rozumianego maszynowo (która gałąź switch
instrukcji), a małe, samodzielne funkcje pozwalają na pisz w bardzo przyjemnym stylu „oddolnym”. Jestem jednak sceptyczny wobec ich twierdzeń o elastyczności.
foo metarg1: bar metarg2: baz
jako foo.metarg1_metarg2_(bar, baz)
. Jednak mój język wprowadza większą zmianę, mianowicie parametry oparte na liście do parametrów opartych na słowniku, co wpływa na środowisko uruchomieniowe, ale nie na analizator składni, w rzeczywistości ze względu na specyficzne właściwości mojego języka, do którego nie będę teraz wchodził. Ponieważ nie ma wyraźnego odwzorowania między nieuporządkowanym słowem kluczowym a argumentami pozycyjnymi, środowisko wykonawcze jest głównym problemem.