Sugerowałbym zarówno ze względów teoretycznych i praktycznych, dlaczego podejście używasz (refaktoringu się wspólny kod do osobnej metody i nazywając go zarówno od słupka i uzyskać metody) przewyższa pozornie prostszą alternatywę polegającą na tym, że jedna z tych dwóch metod nazywa się drugą.
Z teoretycznego punktu widzenia "metoda A całkowicie deleguje do metody B" implikuje pojęcie "prymatu" lub "asymetrii" - decyzji projektowej, która, idąc do przodu, każda zmiana, która może być zastosowana do B, będzie nieuchronnie, nieodłącznie stosuje się również do A; że A może w przyszłości być nieznacznie spersonalizowane w odniesieniu do B (dodając jakiś dodatkowy kod przed i/lub po wywołaniu A do B), ale nigdy na odwrót. Kiedy nie ma powodu oczekiwać takiego prymatu, jest to zła decyzja dotycząca kodowania, aby umieścić to pojęcie w swoim kodzie. Ponieważ zarówno A, jak i B nazywają wspólną prywatną metodę C, unikasz łamania symetrii.
Niektórzy ludzie nie są zadowoleni z teoretycznych argumentów i wolą pragmatyczne: na szczęście w tym przypadku teoretyczne przekłada się na pragmatyczne całkiem bezpośrednio. Ponownie, jest to kwestia przyszłej ewolucji kodu: posiadanie zarówno A, jak i B wywołuje C, pozostawia wszystkie stopnie swobody, aby wykonać małe dostosowania (dodając kod przed i/lub po wywołaniu C) do jednego, obu lub żadnego A i B. Ponieważ nie wiesz, jakie części tej elastyczności będziesz potrzebował, a jej koszt pod względem prostoty jest niewielki, podjęcie prostej i elastycznej trasy jest wysoce pragmatyczne i wskazane.
Ostatni punkt pragmatyczny (stosując się do jednej z tych opcji): za każdym razem masz wzór takiego:
def amethod(self):
return cmethod(self)
jesteś zwykle (skromnie) lepiej przeformułowującej to jako
amethod = cmethod
This unika niepotrzebnego poziomu zagnieżdżania wywołań (płaska jest lepsza niż zagnieżdżona). Tak, klasa mogłaby z pożytkiem zostać zakodowane:
class ListSubs(webapp.RequestHandler):
def _run(self):
self.response.out.write("This works even better!")
get = post = _run
Nic wielkiego, a będziesz miał byłaby powrotem do oryginalnego „zagnieżdżone” sposób, czy i kiedy trzeba zrobić, aby zastosować poprawek przed lub po wywołaniu zagnieżdżonego (od get
do _run
, itp.) lub potrzebujesz innych poprawek w debugowaniu (np. ustaw punkt przerwania w debugerze na post
, ale bez wyzwalania punktu przerwania na get
, itp.), ale ładne małe uproszczenie dla tamtych czasów, w których jest to wykonalne.
Dzięki, to nie jest lekcja, o której zapomnę od jakiegoś czasu! –