SlideShare uma empresa Scribd logo
1 de 57
Baixar para ler offline
RUBY
Почему его стоит выучить?
Ruby
● http://ruby-lang.org
● Динамический объектно-ориентированный язык
со строгой типизацией
● И большим количеством сахара
Ruby
Динамический со строгой типизацией
● Тип задается при присваивании
● Типы не приводятся автоматически к одному типу
["test"] + "test"
TypeError: can't convert String into Array
Утиная типизация
● Важен не тип объекта, а возможность запустить метод
у него.
Пример
● 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
Объектно-ориентированный
● Все является объектом
● Даже примитивы
● Даже методы
● Даже классы
Классы
● Всего лишь специальный объект
● Объект, который создает экземпляры с
предопределенными методами и полями при помощи
специального метода.
● У каждого объекта есть свойство #class который
содержит ссылку на класс.
Пример
MyClass = Class.new(Object) do
define_method(:test) do
"Hello World!"
end
end
MyClass.new.test
MyClass.new.class
Пример с сахаром
class MySweetClass
def test
"Hello World!"
end
end
MySweetClass.new.test
MySweetClass.new.class
Про сахар
attr_accessor :url, :version, :name
def name
“My name is #{name}”
end
def url=(value)
@url = value if value[/Ahttp/]
@url
end
Про сахар
arr.any?
arr.compact!
def +(other)
..
end
result = case a
when (1..10)
"hi"
when String
"test"
end
Расширяемость
● Нельзя закрыть класс от наследования.
● Каждый объект можно расширить.
Расширяемость
class Test
def test
”test”
end
end
p (test = Test.new).test #”test”
test.instance_eval do
def test
“magic”
end
End
p test.test # magic
Расширяемость
class Test
def do_smth(param)
end
end
class Test
alias_method :do_smth, :do_smth_without_logging
def do_smth(param)
p param
do_smth_without_logging
end
end
RUBY STYLE
Ruby-style
● Писать как можно больше кода
● и как можно меньше всякой фигни
Про всякую фигню
● return
● ;
● ()
● public/private/protected
● else if
● комментарии
Ruby-style
● Писать как можно больше кода
● и как можно меньше всякой фигни
● Идти по пути наименьшего удивления
● Наименования должны выражать сущность объекта
Например
● AbstractSingletonProxyFactoryBean
Порождающие шаблоны
программирования
● Singleton
● Factory
● Prototype
● Builder
● FactoryMethod
Singleton
class A
include Singleton
end
Factory
def possible_objects
{test: Test, sweet: SweetObject}
end
def get_new_object(object)
klass = possible_objects[object]
klass.new if klass
end
Prototype
● {test: ‘for Ruby’}.clone
Ruby-style
● Писать как можно больше кода
● и как можно меньше всякой фигни
● Идти по пути наименьшего удивления
● Наименования должны выражать сущность объекта
● Всё должно быть протестировано
Тесты
require ’spec_helper’
describe Balance do
before do
Deposit.create(amount: 120)
Time.stub(:now).and_return('2010-04-02’.to_time)
Deposit.create(amount: 110)
end
its(:balance) { should == 230.0 }
it "calculates balance for selected date" do
subject.date_balance('2010-04-02’).should == 110.0
end
end
Результат
rspec % --format=documentation
Balance
calculates balance for selected date
balance
should eq 230.0
Finished in 0.01385 seconds
2 examples, 0 failures
Еще пример
● Feature: Tracking and logging external agent jobs
● We need Pantry to be able to track jobs and keep a record of
each job's 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
Ruby-style
● Писать как можно больше кода
● и как можно меньше всякой фигни
● Идти по пути наименьшего удивления
● Наименования должны выражать сущность объекта
● Всё должно быть протестировано
● Код пишется для людей
Deploy
capistrano
set :scm, :git
set :scm_verbose, true
namespace :deploy do
desc "Restart Apache"
task :restart, roles: :app, except: { no_release: true } do
run "touch #{File.join(current_path,'tmp','restart.txt')}"
end
end
Configuration managers
● Chef
● Puppet
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
RAILS & WEB FRAMEWORKS
Ruby on Rails
● Июль 2004
● MVC Framework
● ActiveRecord для работы с базой данных
● ActiveView&ActionController
● ActionMailer
● ActiveSupport
Ruby on Rails
● Простой язык
● Одинаковая структура для всех приложений
Структура
├── Gemfile
├── Gemfile.lock
├── README.rdoc
├── Rakefile
├── app
│ ├── assets
│ │ ├── images
│ │ ├── javascripts
│ │ └── stylesheets
│ ├── controllers
│ ├── helpers
│ ├── mailers
│ ├── models
│ └── views
│ └── layouts
Структура
── 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
Структура
├── lib
│ ├── assets
│ └── tasks
├── log
├── public
│ ├── 404.html
│ ├── 422.html
│ ├── 500.html
│ ├── favicon.ico
│ └── robots.txt
├── result
├── test
├── tmp
└── vendor
└── assets
├── javascripts
└── stylesheets
Ruby on Rails
● Простой язык
● Одинаковая структура для всех приложений
● Простое ORM
ActiveRecord
class User < ActiveRecord::Base
validates :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: :destroy
end
ActiveRecord
User.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”)
Ruby on Rails
● Простой язык
● Одинаковая структура для всех приложений
● Простое ORM
● Легко писать тесты
● Легко обновлять
● Очень быстро можно начать работать
● Много плюшек
● Convention over configuration
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, rubinius, diaspora,
discourse, alphagov)
Книги
И самое интересное
● Написать свою реализацию RSpec
Контакты
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370

Mais conteúdo relacionado

Mais procurados

Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
Статический анализатор кода для InterSystems Caché Object Script
Статический анализатор кода для InterSystems Caché Object ScriptСтатический анализатор кода для InterSystems Caché Object Script
Статический анализатор кода для InterSystems Caché Object ScriptInterSystems
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Andrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...corehard_by
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1Eduard Antsupov
 
async/await: собираем грабли
async/await: собираем граблиasync/await: собираем грабли
async/await: собираем граблиAndrey Chasovskikh
 

Mais procurados (7)

Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
Статический анализатор кода для InterSystems Caché Object Script
Статический анализатор кода для InterSystems Caché Object ScriptСтатический анализатор кода для InterSystems Caché Object Script
Статический анализатор кода для InterSystems Caché Object Script
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
async/await: собираем грабли
async/await: собираем граблиasync/await: собираем грабли
async/await: собираем грабли
 

Destaque

Raising The Barn: ACTion Alexandria Technology-aided Barnraising
Raising The Barn: ACTion Alexandria Technology-aided BarnraisingRaising The Barn: ACTion Alexandria Technology-aided Barnraising
Raising The Barn: ACTion Alexandria Technology-aided BarnraisingACTion Alexandria
 
presentacion famoso
presentacion famosopresentacion famoso
presentacion famoso15ines
 
Tdd and BDD
Tdd and BDDTdd and BDD
Tdd and BDDAcceptic
 
Edith piaf (1)
Edith piaf (1)Edith piaf (1)
Edith piaf (1)mbusta1961
 
PresentacióN1
PresentacióN1PresentacióN1
PresentacióN193javier93
 
Incoming projects process flow
Incoming projects process flowIncoming projects process flow
Incoming projects process flowAcceptic
 

Destaque (8)

Raising The Barn: ACTion Alexandria Technology-aided Barnraising
Raising The Barn: ACTion Alexandria Technology-aided BarnraisingRaising The Barn: ACTion Alexandria Technology-aided Barnraising
Raising The Barn: ACTion Alexandria Technology-aided Barnraising
 
presentacion famoso
presentacion famosopresentacion famoso
presentacion famoso
 
Edith piaf lecciones de amor
Edith piaf lecciones de amorEdith piaf lecciones de amor
Edith piaf lecciones de amor
 
Tdd and BDD
Tdd and BDDTdd and BDD
Tdd and BDD
 
Edith piaf (1)
Edith piaf (1)Edith piaf (1)
Edith piaf (1)
 
PresentacióN1
PresentacióN1PresentacióN1
PresentacióN1
 
Edith Piaff
Edith PiaffEdith Piaff
Edith Piaff
 
Incoming projects process flow
Incoming projects process flowIncoming projects process flow
Incoming projects process flow
 

Semelhante a Why Ruby?

Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in railssergeymoiseev
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bashkuchinskaya
 
Intelligent или сделай мне красиво
Intelligent или сделай мне красивоIntelligent или сделай мне красиво
Intelligent или сделай мне красивоArtem Malyshev
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
javascript
javascriptjavascript
javascriptsovest
 
javascript_part1
javascript_part1javascript_part1
javascript_part1sovest
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Кирилл Толкачёв
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...corehard_by
 
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серыйVladislav Morgun
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Глава 3: примитивные типы и операции с ними в Java
Глава 3: примитивные типы и операции с ними в JavaГлава 3: примитивные типы и операции с ними в Java
Глава 3: примитивные типы и операции с ними в Javametaform
 
CodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo
 

Semelhante a Why Ruby? (20)

Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in rails
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bash
 
Intelligent или сделай мне красиво
Intelligent или сделай мне красивоIntelligent или сделай мне красиво
Intelligent или сделай мне красиво
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
javascript
javascriptjavascript
javascript
 
javascript_part1
javascript_part1javascript_part1
javascript_part1
 
PowerShell
PowerShellPowerShell
PowerShell
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Batch processing on RoR
Batch processing on RoRBatch processing on RoR
Batch processing on RoR
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
 
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Глава 3: примитивные типы и операции с ними в Java
Глава 3: примитивные типы и операции с ними в JavaГлава 3: примитивные типы и операции с ними в Java
Глава 3: примитивные типы и операции с ними в Java
 
CodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали Групон
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 

Why Ruby?