RUBYПочему его стоит выучить?
Ruby● http://ruby-lang.org● Динамический объектно-ориентированный языксо строгой типизацией● И большим количеством сахара
Ruby
Динамический со строгой типизацией● Тип задается при присваивании● Типы не приводятся автоматически к одному типу["test"] ...
Утиная типизация● Важен не тип объекта, а возможность запустить методу него.
Пример● a = [1, 2, 3]● max = nil● If a.respond_to?(:max)● max = a.max● elsif a.respond_to?(:each)● a.each{|a| max ||= a; m...
Объектно-ориентированный● Все является объектом● Даже примитивы● Даже методы● Даже классы
Классы● Всего лишь специальный объект● Объект, который создает экземпляры спредопределенными методами и полями при помощис...
ПримерMyClass = Class.new(Object) dodefine_method(:test) do"Hello World!"endendMyClass.new.testMyClass.new.class
Пример с сахаромclass MySweetClassdef test"Hello World!"endendMySweetClass.new.testMySweetClass.new.class
Про сахарattr_accessor :url, :version, :namedef name“My name is #{name}”enddef url=(value)@url = value if value[/Ahttp/]@u...
Про сахарarr.any?arr.compact!def +(other)..endresult = case awhen (1..10)"hi"when String"test"end
Расширяемость● Нельзя закрыть класс от наследования.● Каждый объект можно расширить.
Расширяемостьclass Testdef test”test”endendp (test = Test.new).test #”test”test.instance_eval dodef test“magic”endEndp tes...
Расширяемостьclass Testdef do_smth(param)endendclass Testalias_method :do_smth, :do_smth_without_loggingdef do_smth(param)...
RUBY STYLE
Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни
Про всякую фигню● return● ;● ()● public/private/protected● else if● комментарии
Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни● Идти по пути наименьшего удивления● Наименовани...
Например● AbstractSingletonProxyFactoryBean
Порождающие шаблоныпрограммирования● Singleton● Factory● Prototype● Builder● FactoryMethod
Singletonclass Ainclude Singletonend
Factorydef possible_objects{test: Test, sweet: SweetObject}enddef get_new_object(object)klass = possible_objects[object]kl...
Prototype● {test: ‘for Ruby’}.clone
Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни● Идти по пути наименьшего удивления● Наименовани...
Тестыrequire ’spec_helper’describe Balance dobefore doDeposit.create(amount: 120)Time.stub(:now).and_return(2010-04-02’.to...
Результатrspec % --format=documentationBalancecalculates balance for selected datebalanceshould eq 230.0Finished in 0.0138...
Еще пример● Feature: Tracking and logging external agent jobs● We need Pantry to be able to track jobs and keep a record o...
Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни● Идти по пути наименьшего удивления● Наименовани...
Deploycapistranoset :scm, :gitset :scm_verbose, truenamespace :deploy dodesc "Restart Apache"task :restart, roles: :app, e...
Configuration managers● Chef● Puppet
Chef● Recipe● windows_package node[sql_server][pkg][package_name] do● source node[sql_server][pkg][url]● checksum node[sql...
RAILS & WEB FRAMEWORKS
Ruby on Rails● Июль 2004● MVC Framework● ActiveRecord для работы с базой данных● ActiveView&ActionController● ActionMailer...
Ruby on Rails● Простой язык● Одинаковая структура для всех приложений
Структура├── Gemfile├── Gemfile.lock├── README.rdoc├── Rakefile├── app│ ├── assets│ │ ├── images│ │ ├── javascripts│ │ └──...
Структура── config│ ├── application.rb│ ├── database.yml│ ├── environments│ │ ├── development.rb│ ├── initializers│ ├── lo...
Структура├── lib│ ├── assets│ └── tasks├── log├── public│ ├── 404.html│ ├── 422.html│ ├── 500.html│ ├── favicon.ico│ └── r...
Ruby on Rails● Простой язык● Одинаковая структура для всех приложений● Простое ORM
ActiveRecordclass User < ActiveRecord::Basevalidates :username,presence: true,uniqueness: { case_sensitive: false },length...
ActiveRecordUser.find(params[:id])User.find_by_username(params[:username])User.where(:username => params[:username]).first...
Ruby on Rails● Простой язык● Одинаковая структура для всех приложений● Простое ORM● Легко писать тесты● Легко обновлять● О...
Ruby on Rails● “Rails is omakase” DHH● Можно многое поменять
Sinatra● Очень простой фреймворк● Использовать только то, что надо● Быстрый
Padrino● Sinatra +● генераторы● Возможность работать с большими приложениями
КАКИЕ БЫВАЮТ РУБИ?Различные интерпретаторы
MRI● 1.8.7 – 2008● 1.9.3 – 2011● 2.0.0 - 2013
Rubinius● С++ и Руби● Вышел в 2006● Последняя версия в 2011● RubySpec
JRuby● Вышел в 2001● Последняя версия в мае 2013 с экспериментальнойподдержкой Руби 2.0● Изначально поддерживали Rails
IronRuby● Объявлен в 2007● Последняя версия 2011
MacRuby● Руби на ObjectiveC
RubyMotion● Руби для iOS
Topaz● Руби на Питоне
Как учить?● http://tryruby.org/levels/1/challenges/0● http://railsforzombies.org/● Читать хороший код (rails, sinatra, rub...
Книги
И самое интересное● Написать свою реализацию RSpec
КонтактыURL: www.acceptic.comSoftware programming services andDedicated developers teamsE-mail: info@acceptic.comTel.: +1 ...
Upcoming SlideShare
Loading in...5
×

Why Ruby?

452

Published on

Created by: Alex Slinko, Senior Ruby on Rails Developer.

Summary:

In a nutshell about one of the most object-oriented programming languages
An alternative viewpoint on development process, testing and deployment
About Ruby in the Web in whole and Rails in particular
Other Ruby interpreters

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
452
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Why Ruby?"

  1. 1. RUBYПочему его стоит выучить?
  2. 2. Ruby● http://ruby-lang.org● Динамический объектно-ориентированный языксо строгой типизацией● И большим количеством сахара
  3. 3. Ruby
  4. 4. Динамический со строгой типизацией● Тип задается при присваивании● Типы не приводятся автоматически к одному типу["test"] + "test"TypeError: cant convert String into Array
  5. 5. Утиная типизация● Важен не тип объекта, а возможность запустить методу него.
  6. 6. Пример● a = [1, 2, 3]● max = nil● If a.respond_to?(:max)● max = a.max● elsif a.respond_to?(:each)● a.each{|a| max ||= a; max = a if max < a }● end
  7. 7. Объектно-ориентированный● Все является объектом● Даже примитивы● Даже методы● Даже классы
  8. 8. Классы● Всего лишь специальный объект● Объект, который создает экземпляры спредопределенными методами и полями при помощиспециального метода.● У каждого объекта есть свойство #class которыйсодержит ссылку на класс.
  9. 9. ПримерMyClass = Class.new(Object) dodefine_method(:test) do"Hello World!"endendMyClass.new.testMyClass.new.class
  10. 10. Пример с сахаромclass MySweetClassdef test"Hello World!"endendMySweetClass.new.testMySweetClass.new.class
  11. 11. Про сахарattr_accessor :url, :version, :namedef name“My name is #{name}”enddef url=(value)@url = value if value[/Ahttp/]@urlend
  12. 12. Про сахарarr.any?arr.compact!def +(other)..endresult = case awhen (1..10)"hi"when String"test"end
  13. 13. Расширяемость● Нельзя закрыть класс от наследования.● Каждый объект можно расширить.
  14. 14. Расширяемостьclass Testdef test”test”endendp (test = Test.new).test #”test”test.instance_eval dodef test“magic”endEndp test.test # magic
  15. 15. Расширяемостьclass Testdef do_smth(param)endendclass Testalias_method :do_smth, :do_smth_without_loggingdef do_smth(param)p paramdo_smth_without_loggingendend
  16. 16. RUBY STYLE
  17. 17. Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни
  18. 18. Про всякую фигню● return● ;● ()● public/private/protected● else if● комментарии
  19. 19. Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни● Идти по пути наименьшего удивления● Наименования должны выражать сущность объекта
  20. 20. Например● AbstractSingletonProxyFactoryBean
  21. 21. Порождающие шаблоныпрограммирования● Singleton● Factory● Prototype● Builder● FactoryMethod
  22. 22. Singletonclass Ainclude Singletonend
  23. 23. Factorydef possible_objects{test: Test, sweet: SweetObject}enddef get_new_object(object)klass = possible_objects[object]klass.new if klassend
  24. 24. Prototype● {test: ‘for Ruby’}.clone
  25. 25. Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни● Идти по пути наименьшего удивления● Наименования должны выражать сущность объекта● Всё должно быть протестировано
  26. 26. Тестыrequire ’spec_helper’describe Balance dobefore doDeposit.create(amount: 120)Time.stub(:now).and_return(2010-04-02’.to_time)Deposit.create(amount: 110)endits(:balance) { should == 230.0 }it "calculates balance for selected date" dosubject.date_balance(2010-04-02’).should == 110.0endend
  27. 27. Результатrspec % --format=documentationBalancecalculates balance for selected datebalanceshould eq 230.0Finished in 0.01385 seconds2 examples, 0 failures
  28. 28. Еще пример● Feature: Tracking and logging external agent jobs● We need Pantry to be able to track jobs and keep a record ofeach jobs log output.● Background:● Given an agent job has been triggered● And the agent is about to start the job● Scenario: An agent registers a new job● When an agent has posts all the required job details● Then a response with the uri to the job should be received
  29. 29. Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни● Идти по пути наименьшего удивления● Наименования должны выражать сущность объекта● Всё должно быть протестировано● Код пишется для людей
  30. 30. Deploycapistranoset :scm, :gitset :scm_verbose, truenamespace :deploy dodesc "Restart Apache"task :restart, roles: :app, except: { no_release: true } dorun "touch #{File.join(current_path,tmp,restart.txt)}"endend
  31. 31. Configuration managers● Chef● Puppet
  32. 32. Chef● Recipe● windows_package node[sql_server][pkg][package_name] do● source node[sql_server][pkg][url]● checksum node[sql_server][pkg][checksum]● installer_type :msi● options "IACCEPTSQLNCLILICENSETERMS=#{node[sql_server][accept_eula] ? YES : NO}"● action :install● end
  33. 33. RAILS & WEB FRAMEWORKS
  34. 34. Ruby on Rails● Июль 2004● MVC Framework● ActiveRecord для работы с базой данных● ActiveView&ActionController● ActionMailer● ActiveSupport
  35. 35. Ruby on Rails● Простой язык● Одинаковая структура для всех приложений
  36. 36. Структура├── Gemfile├── Gemfile.lock├── README.rdoc├── Rakefile├── app│ ├── assets│ │ ├── images│ │ ├── javascripts│ │ └── stylesheets│ ├── controllers│ ├── helpers│ ├── mailers│ ├── models│ └── views│ └── layouts
  37. 37. Структура── config│ ├── application.rb│ ├── database.yml│ ├── environments│ │ ├── development.rb│ ├── initializers│ ├── locales│ │ └── en.yml│ └── routes.rb├── config.ru├── db│ ├── migrate│ │ └── 20130613111514_test_migration.rb│ ├── schema.rb│ └── seeds.rb
  38. 38. Структура├── lib│ ├── assets│ └── tasks├── log├── public│ ├── 404.html│ ├── 422.html│ ├── 500.html│ ├── favicon.ico│ └── robots.txt├── result├── test├── tmp└── vendor└── assets├── javascripts└── stylesheets
  39. 39. Ruby on Rails● Простой язык● Одинаковая структура для всех приложений● Простое ORM
  40. 40. ActiveRecordclass User < ActiveRecord::Basevalidates :username,presence: true,uniqueness: { case_sensitive: false },length: { minimum: 2, maximum: 30 },format: { with: USERNAME_REGEX, message: I18n.t(errors.attributes.username.invalid) }has_many :mobile_devices, dependent: :destroyend
  41. 41. ActiveRecordUser.find(params[:id])User.find_by_username(params[:username])User.where(:username => params[:username]).first@user.mobile_devices.find(params[:id])Entry.select(..).joins(:user, :transaction).order("entries.created_at DESC, entries.sequence_id”)
  42. 42. Ruby on Rails● Простой язык● Одинаковая структура для всех приложений● Простое ORM● Легко писать тесты● Легко обновлять● Очень быстро можно начать работать● Много плюшек● Convention over configuration
  43. 43. Ruby on Rails● “Rails is omakase” DHH● Можно многое поменять
  44. 44. Sinatra● Очень простой фреймворк● Использовать только то, что надо● Быстрый
  45. 45. Padrino● Sinatra +● генераторы● Возможность работать с большими приложениями
  46. 46. КАКИЕ БЫВАЮТ РУБИ?Различные интерпретаторы
  47. 47. MRI● 1.8.7 – 2008● 1.9.3 – 2011● 2.0.0 - 2013
  48. 48. Rubinius● С++ и Руби● Вышел в 2006● Последняя версия в 2011● RubySpec
  49. 49. JRuby● Вышел в 2001● Последняя версия в мае 2013 с экспериментальнойподдержкой Руби 2.0● Изначально поддерживали Rails
  50. 50. IronRuby● Объявлен в 2007● Последняя версия 2011
  51. 51. MacRuby● Руби на ObjectiveC
  52. 52. RubyMotion● Руби для iOS
  53. 53. Topaz● Руби на Питоне
  54. 54. Как учить?● http://tryruby.org/levels/1/challenges/0● http://railsforzombies.org/● Читать хороший код (rails, sinatra, rubinius, diaspora,discourse, alphagov)
  55. 55. Книги
  56. 56. И самое интересное● Написать свою реализацию RSpec
  57. 57. КонтактыURL: www.acceptic.comSoftware programming services andDedicated developers teamsE-mail: info@acceptic.comTel.: +1 800 990 4370
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×