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.



ksywa:

tu wpisz cyfrę cztery: (tu wpisz cyfrę cztery: (to takie zabezpieczenie antyspamowe))

komentarze wulgarne albo co mi się nie spodobają będę kasował


powrót na stronę główną

RSS