Na jedynym blogu deweloperów, który czytałem, autorstwa tego gościa z Joel-On-Software-Founder-of-SO, przeczytałem dawno temu, że OO nie prowadzi do wzrostu produktywności. Automatyczne zarządzanie pamięcią tak. Chłodny. Kto może zaprzeczyć danym?
Nadal uważam, że OO jest dla non-OO tym, czym programowanie z funkcjami jest programowaniem wszystkiego w linii.
(I powinienem wiedzieć, jak zacząłem od GWBasic.) Kiedy refaktoryzujesz kod w celu użycia funkcji,
variable2654
staje
variable3
się metodą, w której się znajdujesz. Lub, jeszcze lepiej, ma nazwę, którą możesz zrozumieć,
a jeśli funkcja jest krótka , to się nazywa
value
i to wystarczy do pełnego zrozumienia.
Gdy kod bez funkcji staje się kodem z metodami, możesz usunąć mile kodu.
Kiedy byłaby kod, aby być prawdziwie OO, b
, c
, q
, i Z
stać this
, this
, this
i this
. A ponieważ nie wierzę w używanie this
słowa kluczowego, możesz usunąć mile kodu. Właściwie możesz to zrobić, nawet jeśli używasz this
.
Nie sądzę, by OO było naturalną metaforą.
Nie uważam też, że język jest naturalną metaforą, ani też nie sądzę, że „zapachy” Fowlera są lepsze niż powiedzenie „ten kod nie smakuje”. To powiedziawszy, myślę, że OO nie dotyczy naturalnych metafor, a ludzie, którzy uważają, że
przedmioty po prostu wyskakują na ciebie, w zasadzie nie rozumieją.
Definiujesz wszechświat obiektów, a lepsze wszechświaty obiektów dają w rezultacie kod, który jest krótszy, łatwiejszy do zrozumienia, działa lepiej lub wszystkie te elementy (i niektóre kryteria, o których zapominam). Myślę, że ludziom, którzy używają naturalnych obiektów klientów / domeny jako obiektów programistycznych, brakuje możliwości przedefiniowania wszechświata.
Na przykład, gdy dokonujesz rezerwacji w systemie lotniczym, to, co nazywasz rezerwacją, może w ogóle nie odpowiadać rezerwacji prawnej / biznesowej.
Niektóre z podstawowych pojęć to naprawdę fajne narzędzia
Myślę, że większość ludzi przesadza z tą całością „kiedy masz młotek, wszystkie są gwoździami”. Myślę, że druga strona monety / lustra jest równie prawdziwa: kiedy masz gadżet taki jak polimorfizm / dziedziczenie, zaczynasz znajdować zastosowania, w których pasuje jak rękawiczka / skarpeta / soczewka kontaktowa. Narzędzia OO są bardzo potężne. Myślę, że dziedziczenie pojedyncze jest absolutnie konieczne, aby ludzie nie dali się ponieść emocjom, a moje
oprogramowanie do dziedziczenia wielokrotnego nie wytrzymuje tego.
Jaki jest sens OOP?
Myślę, że to świetny sposób na obsługę absolutnie ogromnej bazy kodu. Wydaje mi się, że pozwala to organizować i reorganizować kod, a także daje język, w którym można to robić (poza językiem programowania, w którym pracujesz), a także modularyzuje kod w całkiem naturalny i łatwy do zrozumienia sposób.
OOP jest skazane na niezrozumienie przez większość programistów
Dzieje się tak, ponieważ jest to proces, który otwiera oczy, podobnie jak życie: dzięki doświadczeniu coraz lepiej rozumiesz OO i zaczynasz unikać pewnych wzorców i zatrudniać innych, gdy stajesz się mądrzejszy. Jednym z najlepszych przykładów jest to, że przestajesz używać dziedziczenia dla klas, których nie kontrolujesz, i zamiast tego wolisz wzorzec
Fasada .
Odnośnie twojego mini-eseju / pytania
Chciałem wspomnieć, że masz rację. Wielokrotne użycie to w większości mrzonka. Oto cytat Andersa Hejilsberga na ten temat (genialny) stąd :
Jeśli poprosisz początkujących programistów o napisanie kontrolki kalendarza, często pomyślą sobie: „Och, napiszę najlepszą kontrolkę kalendarza na świecie! Będzie polimorficzna w odniesieniu do rodzaju kalendarza. Będzie miała wyświetlacze, i mungers, i to, tamto i inne. " Muszą wysłać aplikację kalendarza za dwa miesiące. Umieścili całą tę infrastrukturę pod kontrolą, a następnie spędzili dwa dni, pisząc na niej kiepską aplikację kalendarza. Pomyślą: „W następnej wersji aplikacji zrobię o wiele więcej”.
Kiedy zaczną myśleć o tym, jak faktycznie zamierzają wdrożyć wszystkie te inne konkretyzacje swojego abstrakcyjnego projektu, okazuje się, że ich projekt jest całkowicie błędny. A teraz zamalowali się w kącie i muszą wszystko wyrzucić. Widziałem to w kółko. Mocno wierzę w bycie minimalistycznym. Chyba że faktycznie masz zamiar rozwiązać ogólny problem, nie próbuj tworzyć ram do rozwiązania konkretnego problemu, ponieważ nie wiesz, jak ten framework powinien wyglądać.