2011-08-23 6 views
8

Obecnie eksperymentuję z Ruby i Railsami i trafiłem na kilka rozdziałów w samouczkach i książkach na temat metaprogramowania. Wiele osób wspomina, że ​​jest istotnym składnikiem Rubiego, ale tak naprawdę nie zagłębia się w szczegóły. To tak, jakby metaprogramowanie było ostateczną granicą dla programistów Ruby. Pochodzę z tła .NET, staram się zrozumieć, dlaczego jest podobno tak przydatne.Dlaczego ważne jest, aby nauczyć się metaprogramowania i eigenclasses w Ruby?

  • Jakie korzyści daje korzystanie z metaprogramowania?
  • Co to jest eigenclass i jak różni się od singletonu?
  • W jakich sytuacjach często używa się metaprogramowania?
  • Jakie są konsekwencje etyczne związane z używaniem kodu do modyfikowania zachowania innego kodu, zwłaszcza kodu, który nie jest twoim własnym?

Odpowiedz

16
  • Jakie korzyści są zdobyte podczas korzystania metaprogramowanie?

    Można utworzyć bardziej wyraziste API niż bez niego (np ActiveRecord wykorzystuje metaprogramowanie definiować metody dostępowe oparte na nazwy kolumn tabeli, musisz więc można pisać takie rzeczy jak person.age zamiast coś podobnego person.read_attribute("age"), gdzie person stanowi obiekt aktywny rekord i tabela people ma kolumnę o nazwie age) i można wykonać pewne czynności przy znacznie mniejszym kodzie niż w przeciwnym razie.

  • Co to jest eigenclass i jak różni się od singletonu?

    Pojęcia "eigenclass" i "klasa singleton" są używane zamiennie w kontekście ruby.

  • W jakich sytuacjach często używa się metaprogramowania?

    W sytuacjach, w których w przeciwnym razie miałbyś dużo kodu płyty kotła lub podczas tworzenia DSL.

    Przykład przypadku użycia 1:

    Zamiast pisać coś kod boiler-talerz tak:

    class Foo 
        def bar 
        @bar 
        end 
    
        def bar=(b) 
        @bar = b 
        end 
    
        def baz 
        @baz 
        end 
    
        def baz=(b) 
        @baz = b 
        end 
    end 
    

    Można napisać wiele krótszy kod stosując metodę METAPROGRAMOWANIE attr_accessor, która automatycznie określa getter i metody setter z nazwami na podstawie argumentów dajesz go:

    class Foo 
        attr_accessor :foo, :bar 
    end 
    

    Jeśli attr_accessor nie ALR eady istnieje w standardowej biblioteki, można go zdefiniować siebie tak (aby dać wyobrażenie co metaprogramowanie Ruby wygląda):

    class Module 
        def attr_accessor(*variable_names) 
        variable_names.each do |variable_name| 
         define_method(variable_name) do 
         instance_variable_get("@#{ variable_name }") 
         end 
    
         define_method("#{ variable_name }=") do |value| 
         instance_variable_set("@#{ variable_name }", value) 
         end 
        end 
        end 
    

    koniec

  • Co etyczne implikacje są tam około używając kodu do modyfikować zachowanie innego kodu, zwłaszcza kodu, który nie jest twoim własnym?

    Brak.

+1

+1 Bardzo podoba mi się przykład 'attr_accessor', ponieważ pokazuje ważną zaletę silnych możliwości metaprogramowania: metaprogramowanie utrzymuje prosty język. 'attr_accessor' może z łatwością być oddzielną konstrukcją językową w innym języku (powiązane: właściwości w C# itd.). W Ruby jest to po prostu inna metoda. –

+0

Dobra odpowiedź. Chociaż prawdą jest, że klasa eigenclass i singleton oznaczają to samo w Ruby, to jest teraz preferowanym terminem, na co wskazuje istnienie metod "singleton_class", "singleton_methods" i "define_singleton_method". –

4

Jest czas i miejsce na metaprogramowanie. Myślę, że jest to mocno wspomniane w książkach Ruby, ponieważ ludzie lubią pokazywać, co potrafi Ruby, czego nie potrafią robić inne języki.

Metaprogramowanie to jak brak znajomości japońskiego słowa "burger" lub "zupa z makaronem", ale znając japońskiego "ten jeden proszę" ("kore o kudasai"), i będąc w stanie wskazać przedmiot na menu. Pozwala to na większą elastyczność, ale potrzebujesz więcej kontekstu, aby dokładnie wiedzieć, co się robi.

Jeśli tworzysz ActiveRecord, który pozwala na wykonanie find_by_foo, to metaprogramowanie ma sens.

Jeśli piszesz bibliotekę testowania mutacji, taką jak zombie-chaser, lub aplikację do testowania charakterystyki, która testuje różne implementacje Rubiego, takie jak Small Eigen Collider, wówczas metaprogramowanie ma sens.

Jednak, jeśli piszesz aplikację, to zazwyczaj nie powinieneś być metaprogramingiem, a jedynie programowaniem. Na przykład, jeśli używasz aplikacji instance_variable_set, jest to raczej zapach kodu niż wskazówka, jak bardzo jesteś biegły.

Podobne pytania, które warto przeczytać, to: https://stackoverflow.com/questions/1236191/what-will-i-learn-from-metaprogramming-ruby i Ruby metaprogramming online tutorial i Metaprogramming how much is too much?.

Naprawdę polecam książkę "Metaprograming Ruby", ponieważ nie tylko uczy ona metaprogramowania, ale także jak działa Ruby.

+0

+1 dla japońskiego przykładu. Po prostu perfekcyjnie! – rubish

Powiązane problemy