Ruby: Beauty and the Beast Александр Дымо IT-клуб Николаева www.acunote.com
О чем речь? Опыт разработки на Ruby (+Rails) веб-приложения Acunote  www.acunote.com разрабатывается с 2006-го года
29 000 строк кода
45 500 строк тестов
~12000 зарегистрированных организаций
О чем речь? Язык Ruby Что понравилось
Что не понравилось
Интересные особенности Ruby Runtime Что с ним так и не так
Garbage Collection Инструменты Редакторы и IDE
Тестирование
Профилировка и производительность
Деплоймент Какой Ruby выбрать?
Язык Ruby: Что понравилось Меньше кода – больше кислорода! ~3-4 разработчика * ~5 лет = 29k строк???
Язык Ruby: Что понравилось Меньше кода – больше кислорода! 400 строк на Ruby == 6000 на C++
Язык Ruby: Что понравилось Уж больно хорошо все выглядит! module  SearchLanguage class  Parser class  ParseError < StandardError;  end def  self. parse (text) parser = Parser. new parser. parse (text) end private : def  parse_search_query parse_and_expression end def  parse_and_expression match_spaces node = ExpressionNode. new (:and) return  node  if  empty_buffer? node. expressions  << parse_or_expression while  match_AND  and  !empty_buffer?  and  !end_of_subexpression? node. expressions  << parse_or_expression end node end end end
Язык Ruby: Что понравилось Методы с ! и ? [1,2,3] . include?   2 &quot;foo bar&quot; . gsub ( &quot;o&quot; ,  &quot;a&quot; ) &quot;foo bar&quot; . gsub! ( &quot;o&quot; ,  &quot;a&quot; )
Язык Ruby: Что понравилось Методы с ! и ? class  Foo def  transform! #... end def  transformed? #... end end
Язык Ruby: Что понравилось Элегантный подход к getters/setters class  Foo attr_accessor :foo end class  Foo def  foo @foo end def  foo=(value) @foo = value end end f = Foo.new f.foo = 2 # f.foo=(2) puts f.foo
Язык Ruby: Что понравилось Блоки def  do_smth(&block) puts yield(10) puts yield(20) end do_smth { |value| value + 5 } >  15 >  25
Язык Ruby: Что понравилось Возможность встроиться куда угодно class  Time def  humanize strftime(&quot;%a %b %d, %Y %H:%M&quot;) end end puts  Time.now.humanize > Thu Apr 21, 2011 13:37 ...мы дополнили 28 различных классов
Язык Ruby: Что понравилось Возможность встроиться куда угодно class  BigDecimal alias_method  :eq_without_boolean_comparison, :== def  eq_with_boolean_comparison(other) if  [FalseClass, TrueClass].include? other.class return  false end eq_without_boolean_comparison(other) end alias_method  :==, :eq_with_boolean_comparison end
Язык Ruby: Что понравилось Правильный способ встраивания/расширения class  Foo def  do_smth puts  &quot;Hello World&quot; end end class  Foo def  do_smth_with_decoration puts  &quot;--------------&quot; do_smth_without_decoration puts  &quot;--------------&quot; end end f = Foo.new f.do_smth >  -------------- >  Hello World >  --------------
Язык Ruby: Что понравилось Возможность переписать все что угодно class  Foo { private: void  doSmth() { std::cout  <<  &quot;Hello World&quot; } }; ... class  Foo def  doSmth puts  &quot;Hi&quot; end end f = Foo.new f.doSmth >  Hi
О чем речь? Язык Ruby Что понравилось
Что не понравилось
Интересные особенности Ruby Runtime Что с ним так и не так
Garbage Collection  Инструменты Редакторы и IDE
Тестирование
Профилировка и производительность
Деплоймент Какой Ruby выбрать?
Язык Ruby: Что не понравилось Perl'измы в синтаксисе x = false or true puts x  #???
Язык Ruby: Что не понравилось Perl'измы в синтаксисе x = false or true (x = false) or true puts x >  false
Язык Ruby: Что не понравилось Perl'измы в синтаксисе x = false || true x = (false || true) puts x >  true
Язык Ruby: Что не понравилось Perl'измы в синтаксисе x = 2  if  false or true puts x > ?
Язык Ruby: Что не понравилось Perl'измы в синтаксисе x = 2  if  false or true x = 2  if  (false or true) puts x > 2
Язык Ruby: Что не понравилось Python'измы в синтаксисе class  Foo attr_accessor  :x def  do_smth x = 10 end end f = Foo.new f.x >  nil #WTF?
Язык Ruby: Что не понравилось Python'измы в синтаксисе class  Foo attr_accessor  :x def  do_smth self. x = 10 end end f = Foo.new f.x >  10
Язык Ruby: Что не понравилось Переменные экземпляров классов class  Foo attr_accessor  :x def  initialize @x  = 10 #или self.x  = 10 y =  @x #или y = x end end
О чем речь? Язык Ruby Что понравилось
Что не понравилось
Интересные особенности Ruby Runtime Что с ним так и не так
Garbage Collection Инструменты Редакторы и IDE
Тестирование
Профилировка и производительность
Деплоймент Какой Ruby выбрать?
Язык Ruby: Интересные особенности Модули: пространства имен  или решение проблемы множественного наследования module  ActiveRecord module  ConnectionAdapters class  MysqlAdapter def  execute #... end end end end module  ActiveRecord module  Validations def  valid? errors.empty? end end class  Base include  Validations end end
Язык Ruby: Интересные особенности Блоки: передача функций в другие функции  или предусловия/постусловия def  calculate(&algorithm) yield (2, 2) end result = calculate  do  |x,y| x + y end def  calculate(&expression) return  unless can_calculate? result =  yield result.good?  ?  result  :  nil end result = calculate  do 2+2 end
Язык Ruby: Интересные особенности method_missing class  GoldenFish def  method_missing(name, *args, &block) if  name == :make_me_rich puts &quot;here you go: $1 000 000&quot; else puts &quot;you want too much!&quot; end end end fish = GoldenFish.new fish.make_me_rich >  here you go: $1 000 000 fish.make_my_old_wife_a_supermodel > you want too much!
Язык Ruby: Интересные особенности Ассоциации в Rails: реализация с method_missing class  User has_many :roles end user = User.find(:first) #метод ассоциации user.roles.find(:all, :conditions => &quot;name = 'Admin'&quot;) #метод массива user.roles.map { |role| role.name }
Язык Ruby: Интересные особенности Ассоциации в Rails: реализация с method_missing class  AssociationProxy def  reload @target = [1,2,3]  #just for an example end def  method_missing(method, *args, &block) if  @target.respond_to? method @target.send(method, *args, &block) else raise  NoMethodError end end end end p = AssociationProxy.new p.reload #вызываем свой метод p << 3 #вызываем метод класса Array (у @target)
О чем речь? Язык Ruby Что понравилось
Что не понравилось
Интересные особенности Ruby Runtime Что с ним так и не так
Garbage Collection Инструменты Редакторы и IDE
Тестирование
Профилировка и производительность
Деплоймент Какой Ruby выбрать?
Ruby Runtime: Что с ним так и не так
Ruby Runtime: Что с ним так и не так Ruby – это красиво, удобно, мощно... но где же подвох?
Ruby Runtime: Что с ним так и не так Ruby – это   медленно !
Ruby Runtime: Что с ним так и не так Ruby – это   очень  медленно !
Ruby Runtime: Что с ним так и не так Апрель 2008 Май 2008 Июнь 2008 Июль 2008 Время обслуживания запроса, % Худший случай: O(n a ) В среднем: O(log n)
О чем речь? Язык Ruby Что понравилось
Что не понравилось
Интересные особенности Ruby Runtime Что с ним так и не так
Garbage Collection Инструменты Редакторы и IDE
Тестирование
Профилировка и производительность
Деплоймент Какой Ruby выбрать?
Ruby Runtime: Garbage Collection Сборка мусора – самое плохое  что может произойти с вашим Ruby кодом!

Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast

Editor's Notes

  • #3 scrum, Тим Евграшин
  • #5 5-7 строк в день на человека
  • #7 однострочные декларации необязательный return читабельность знакомый синтаксис (нет культурного шока) символы