Kiedy dzielę duże metody (lub procedury lub funkcje - to pytanie nie jest specyficzne dla OOP, ale ponieważ pracuję w językach OOP w 99% przypadków, to terminologia, z którą czuję się najlepiej) na wiele małych , Często jestem niezadowolony z wyników. Trudniej jest rozumować te małe metody niż wtedy, gdy były to tylko bloki kodu w dużej, ponieważ gdy je wydobywam, tracę wiele podstawowych założeń, które wynikają z kontekstu wywołującego.
Później, kiedy patrzę na ten kod i widzę poszczególne metody, nie od razu wiem, skąd są one wywoływane, i myślę o nich jako o zwykłych metodach prywatnych, które można wywoływać z dowolnego miejsca w pliku. Wyobraźmy sobie na przykład metodę inicjowania (konstruktora lub inną) podzieloną na szereg małych: w kontekście samej metody wyraźnie wiesz, że stan obiektu jest nadal nieprawidłowy, ale w zwykłej prywatnej metodzie prawdopodobnie wychodzisz z założenia, że obiekt jest już zainicjowany i jest w poprawnym stanie.
Jedynym rozwiązaniem, jakie widziałem w tym przypadku, jest where
klauzula w Haskell, która pozwala zdefiniować małe funkcje, które są używane tylko w funkcji „nadrzędnej”. Zasadniczo wygląda to tak:
len x y = sqrt $ (sq x) + (sq y)
where sq a = a * a
Ale inne języki, których używam, nie mają czegoś takiego - najbliższą rzeczą jest zdefiniowanie lambdy w zasięgu lokalnym, co prawdopodobnie jest jeszcze bardziej mylące.
Moje pytanie brzmi: czy napotykasz to i czy w ogóle widzisz, że to problem? Jeśli tak, to jak zazwyczaj to rozwiązujesz, szczególnie w „głównych” językach OOP, takich jak Java / C # / C ++?
Edytuj o duplikatach: jak zauważyli inni, są już pytania dotyczące metod podziału i drobne pytania, które są jednowierszowe. Przeczytałem je i nie dyskutują na temat podstawowych założeń, które można wyprowadzić z kontekstu dzwoniącego (na przykład powyżej, obiekt jest inicjowany). To jest sens mojego pytania i dlatego moje pytanie jest inne.
Aktualizacja: Jeśli podążyłeś za tym pytaniem i dyskusją poniżej, możesz polubić ten artykuł Johna Carmacka na ten temat , w szczególności:
Oprócz wiedzy o wykonywanym kodzie, funkcje wstawiania mają tę zaletę, że nie umożliwiają wywołania funkcji z innych miejsc. Brzmi to absurdalnie, ale ma to sens. Ponieważ baza kodów rośnie z biegiem lat, pojawi się wiele okazji, aby skorzystać ze skrótu i po prostu wywołać funkcję, która wykonuje tylko pracę, którą Twoim zdaniem należy wykonać. Może istnieć funkcja FullUpdate (), która wywołuje PartialUpdateA () i PartialUpdateB (), ale w niektórych szczególnych przypadkach możesz zdać sobie sprawę (lub pomyśleć), że potrzebujesz tylko PartialUpdateB () i jesteś wydajny, unikając innych praca. Wynika z tego mnóstwo błędów. Większość błędów wynika z faktu, że stan wykonania nie jest dokładnie taki, jak myślisz.