Metaprogramowanie dla początkujących

Metaprogramowanie dla początkujących

Po dwóch miesiącach pracy w Three of Coins jako młodsza programistka postanowiłam podzielić się z uczestnikami/czkami WRUGa moją przygodą w cudownym świecie metaprogramowania.

039602d3cb2cf1d8029667b8e833d11c?s=128

Marta Paciorkowska

September 12, 2013
Tweet

Transcript

  1. Metaprogramowanie dla początkujących

  2. Dobry wieczór! Marta Paciorkowska junior software engineer @ Three of

    Coins twitter: a_meba github: xamebax
  3. Mówię do ciebie, jeśli: • Dopiero zaczynasz • Zacząłeś/zaczęłaś tak

    dawno, że nie pamiętasz, jak to było • Masz techniczne wykształcenie... albo nie.
  4. Please bear with me http://www.redbubble.com/people/teresab/

  5. Metaprogramowanie?

  6. None
  7. Czy na pewno robisz to dobrze?

  8. http://propartnyc.com

  9. A gdyby tak gotowanie = kodowanie? Jak wyglądałby twój idealny

    posiłek? Weź ulubione składniki...
  10. None
  11. Skutek?

  12. None
  13. Odpowiednia ilość meta...

  14. http://fauxcheese.blogspot.com

  15. http://edanastole.ru

  16. Pierwsze starcie: możesz otwierać klasy i redefiniować metody!!!11one

  17. None
  18. Drugie starcie:

  19. http://www.redbubble.com/people/teresab/

  20. Meandry dziedziczenia: https://github.com/3ofcoins/vendorificator https://github.com/3ofcoins/tinyconfig

  21. class TinyConfig < BasicObject # większość klasy pominięta def load(glob)

    glob = ::File.join(::File.dirname(::Kernel.caller.first), glob) load_helper(glob) end def bulk_load caller_path = ::Kernel.caller.first.sub(/(:\d+)?(:in .*)?$/, '') directory_name = ::File.join( ::File.dirname(caller_path), ::File.basename(caller_path, ".rb")) bulk_glob = ::File.join(directory_name, "*.rb") load_helper(bulk_glob) end end
  22. module Vendorificator class Config #większość klasy pominięta def read_file(filename) pathname

    = Pathname.new(filename).cleanpath.expand_path @configuration[:vendorfile_path] = pathname @configuration[:root_dir] = if pathname.basename.to_s == 'vendor.rb' && pathname.dirname.basename.to_s == 'config' pathname.dirname.dirname else pathname.dirname end instance_eval(IO.read(filename), filename, 1) end end end
  23. module Vendorificator class Config < TinyConfig #większość klasy pominięta def

    read_file(filename) pathname = Pathname.new(filename).cleanpath.expand_path @configuration[:vendorfile_path] = pathname @configuration[:root_dir] = if pathname.basename.to_s == 'vendor.rb' && pathname.dirname.basename.to_s == 'config' pathname.dirname.dirname else pathname.dirname end instance_eval(IO.read(filename), filename, 1) end end end
  24. $ rake spec mkdir -p tmp Run options: --seed 12619

    # Running: .EEEEEEEEEEEEEEEEEEEEEEEEEE..EEEEEEEEEEEEEEEEEEE 1) Error: Vendorificator::Config#test_0001_allows to set and get values: SystemStackError: stack level too deep /path/to/repo/lib/config.rb:77 48 runs, 16 assertions, 0 failures, 45 errors, 0 skips rake aborted!
  25. module Vendorificator class Config #większość klasy pominięta def method_missing(method_symbol, *args,

    &block) if modules.keys.include? method_symbol modules[method_symbol].new(environment, args.delete_at(0).to_s, *args, &block) else super end end end end
  26. None
  27. method_missing <3

  28. def method_missing(meth, *args, &block) #this is were the magic happens

    end + Unikamy niespodzianek (...w teorii) + definiujemy metody na bieżąco... - ...ale po kryjomu
  29. Refactoring <3 metaprogramowanie yield twoim przyjacielem... prawda? def a_method(a, b)

    a + yield(a, b) end a_method(1, 2) {|x, y| (x + y) * 3 } # => 10 define_method hurtowo tworzy metody, oszczędzając miejsce
  30. pry Wpisz w konsoli: $ gem install pry Lub dodaj

    gem 'pry' do Gemfile $ bundle install Chcesz się gdzieś zatrzymać? Dodaj do kodu: require 'pry' ; binding.pry
  31. Problemy dla osoby początkującej Alicja w krainie debuggingu, po złej

    stronie lustra Rubiowa czarna magia może przytłaczać Czy metaprogramowanie to lenistwo? Komu mogę ufać?
  32. Szanse dla osoby początkującej Ćwiczę umysł Ambitne => motywujące Lepsze

    zrozumienie mechanizmów działania języka Przyspieszony kurs myślenia w Ruby... Pisanie aplikacji webowych nigdy nie było prostsze!
  33. Warto: • Eloquent Ruby, Russ Olsen: http://eloquentruby.com/ • Metaprogramming Ruby:

    Program Like the Ruby Pros, Paolo Perrotta • Confident Ruby, Avdi Grimm: http://confidentruby.com/ • Thoughtbot: http://robots.thoughtbot.com/ • Ruby Rogues: http://rubyrogues.com/
  34. Dziękuję! Pytania?