2009.10.23 20:01
method chaining przez składnię
Chcę, żeby w jakimś języku były dwa zapisy na wywołanie metody: zapis obiekt->metoda zwracający to, co zwróciła metoda, i zapis obiekt.metoda zwracający obiekt, na którym wywołaliśmy metodę. Wtedy sama składnia pozwalałaby robić method chaining na obiektach dowolnych klas, niezależnie od tego, co zwracają odpowiednie metody.
komentarze:
2009.10.24 01:36 Daniel
W Clojure jest! Tylko trochę inaczej się nazywa.
(.metoda obiekt) lub (. obiekt metoda)
;; odpowiada Javowemu obiekt.metoda()
(doto obiekt (.metoda1) (.metoda2) (.metoda3)
;; odpowiednik w Javie: obiekt.metoda1(); obiekt.metoda2(); obiekt.metoda3();
(-> obiekt .metoda1 .metoda2 .metoda3)
;; odpowiada: obiekt.metoda1().metoda2().metoda3()
Przy czym notacje -> i doto działają również dla funkcji Clojure\'owych, nie tylko dla metod.
2009.10.24 01:42 Piotrek
No to ładnie.
2009.10.24 12:04 jfedor
W Pythonie można sobie zrobić np. coś takiego:
class ChainWrapper(object):
def __init__(self, wrapped):
self.wrapped = wrapped
def __getattr__(self, name):
real = getattr(self.wrapped, name)
def my_call(*args, **kwargs):
real(*args, **kwargs)
return self.wrapped
if callable(real):
return my_call
else:
return real
I potem:
ChainWrapper(obiekt).metoda1().metoda2()
Co nie jest może bardzo śliczne. Myślałem, żeby przez analogię do andand w Rubym zrobić, żeby się dało:
obiekt.chain().metoda1().metoda2()
ale chyba nie da się monkey patchować typu object.
2009.10.24 12:06 jfedor
Domyślenie się jakie były wcięcia zostawiam jako ćwiczenie dla czytelnika (można też użyć view source w przeglądarce).
2009.10.24 12:22 Piotrek
Dodałem "pre" do twojego przykładu, wcięcia już widać. Eh, przydałoby się textile czy coś dodać do tego bloga.
2009.10.24 12:28 jfedor
return self, nie self.wrapped powinno być oczywiście.
A w ogóle dobrze by było, żeby zawołanie opakowanej metody dostawało opakowany obiekt jako self, a teraz to nie wiem co dostaje.
2009.10.25 12:24 Daniel
Głosuję za Markdown.
powrót na stronę główną
RSS