Why Ruby?

57
RUBY Почему его стоит выучить?

description

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

Transcript of Why Ruby?

Page 1: Why Ruby?

RUBYПочему его стоит выучить?

Page 2: Why Ruby?

Ruby● http://ruby-lang.org● Динамический объектно-ориентированный язык

со строгой типизацией● И большим количеством сахара

Page 3: Why Ruby?

Ruby

Page 4: Why Ruby?

Динамический со строгой типизацией

● Тип задается при присваивании● Типы не приводятся автоматически к одному типу

["test"] + "test"TypeError: can't convert String into Array

Page 5: Why Ruby?

Утиная типизация● Важен не тип объекта, а возможность запустить метод

у него.

Page 6: Why Ruby?

Пример● 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

Page 7: Why Ruby?

Объектно-ориентированный● Все является объектом● Даже примитивы● Даже методы● Даже классы

Page 8: Why Ruby?

Классы● Всего лишь специальный объект● Объект, который создает экземпляры с

предопределенными методами и полями при помощи специального метода.

● У каждого объекта есть свойство #class который содержит ссылку на класс.

Page 9: Why Ruby?

ПримерMyClass = Class.new(Object) do define_method(:test) do "Hello World!" endend

MyClass.new.testMyClass.new.class

Page 10: Why Ruby?

Пример с сахаромclass MySweetClass def test "Hello World!" endend

MySweetClass.new.testMySweetClass.new.class

Page 11: Why Ruby?

Про сахарattr_accessor :url, :version, :namedef name “My name is #{name}” end

def url=(value) @url = value if value[/\Ahttp/] @urlend

Page 12: Why Ruby?

Про сахарarr.any?arr.compact!

def +(other) ..end

result = case awhen (1..10) "hi"when String "test"end

Page 13: Why Ruby?

Расширяемость● Нельзя закрыть класс от наследования.● Каждый объект можно расширить.

Page 14: Why Ruby?

Расширяемостьclass Test def test ”test” endendp (test = Test.new).test #”test”test.instance_eval do def test “magic” endEndp test.test # magic

Page 15: Why Ruby?

Расширяемостьclass Test def do_smth(param) endend

class Test alias_method :do_smth, :do_smth_without_logging def do_smth(param) p param do_smth_without_logging endend

Page 16: Why Ruby?

RUBY STYLE

Page 17: Why Ruby?

Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни

Page 18: Why Ruby?

Про всякую фигню● return● ;● ()● public/private/protected● else if● комментарии

Page 19: Why Ruby?

Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни● Идти по пути наименьшего удивления● Наименования должны выражать сущность объекта

Page 20: Why Ruby?

Например● AbstractSingletonProxyFactoryBean

Page 21: Why Ruby?

Порождающие шаблоны программирования● Singleton● Factory● Prototype● Builder● FactoryMethod

Page 22: Why Ruby?

Singletonclass A include Singletonend

Page 23: Why Ruby?

Factorydef possible_objects {test: Test, sweet: SweetObject}end

def get_new_object(object) klass = possible_objects[object] klass.new if klassend

Page 24: Why Ruby?

Prototype● {test: ‘for Ruby’}.clone

Page 25: Why Ruby?

Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни● Идти по пути наименьшего удивления● Наименования должны выражать сущность объекта● Всё должно быть протестировано

Page 26: Why Ruby?

Тесты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 endend

Page 27: Why Ruby?

Результатrspec % --format=documentation

Balance calculates balance for selected date balance should eq 230.0

Finished in 0.01385 seconds2 examples, 0 failures

Page 28: Why Ruby?

Еще пример● 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

Page 29: Why Ruby?

Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни● Идти по пути наименьшего удивления● Наименования должны выражать сущность объекта● Всё должно быть протестировано● Код пишется для людей

Page 30: Why Ruby?

Deploy

capistrano

set :scm, :gitset :scm_verbose, truenamespace :deploy do desc "Restart Apache" task :restart, roles: :app, except: { no_release: true } do run "touch #{File.join(current_path,'tmp','restart.txt')}" endend

Page 31: Why Ruby?

Configuration managers● Chef● Puppet

Page 32: Why Ruby?

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

Page 33: Why Ruby?

RAILS & WEB FRAMEWORKS

Page 34: Why Ruby?

Ruby on Rails● Июль 2004● MVC Framework● ActiveRecord для работы с базой данных● ActiveView&ActionController● ActionMailer● ActiveSupport

Page 35: Why Ruby?

Ruby on Rails● Простой язык● Одинаковая структура для всех приложений

Page 36: Why Ruby?

Структура├── Gemfile├── Gemfile.lock├── README.rdoc├── Rakefile├── app│ ├── assets│ │ ├── images│ │ ├── javascripts│ │ └── stylesheets│ ├── controllers│ ├── helpers│ ├── mailers│ ├── models│ └── views│ └── layouts

Page 37: Why Ruby?

Структура── 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

Page 38: Why Ruby?

Структура├── lib│ ├── assets│ └── tasks├── log├── public│ ├── 404.html│ ├── 422.html│ ├── 500.html│ ├── favicon.ico│ └── robots.txt├── result├── test├── tmp└── vendor └── assets ├── javascripts └── stylesheets

Page 39: Why Ruby?

Ruby on Rails● Простой язык● Одинаковая структура для всех приложений● Простое ORM

Page 40: Why Ruby?

ActiveRecordclass 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: :destroyend

Page 41: Why Ruby?

ActiveRecordUser.find(params[:id])User.find_by_username(params[:username])User.where(:username => params[:username])[email protected]_devices.find(params[:id])

Entry.select(..) .joins(:user, :transaction) .order("entries.created_at DESC, entries.sequence_id”)

Page 42: Why Ruby?

Ruby on Rails● Простой язык● Одинаковая структура для всех приложений● Простое ORM● Легко писать тесты● Легко обновлять● Очень быстро можно начать работать● Много плюшек● Convention over configuration

Page 43: Why Ruby?

Ruby on Rails● “Rails is omakase” DHH● Можно многое поменять

Page 44: Why Ruby?

Sinatra● Очень простой фреймворк● Использовать только то, что надо● Быстрый

Page 45: Why Ruby?

Padrino● Sinatra +

● генераторы● Возможность работать с большими приложениями

Page 46: Why Ruby?

КАКИЕ БЫВАЮТ РУБИ?Различные интерпретаторы

Page 47: Why Ruby?

MRI● 1.8.7 – 2008● 1.9.3 – 2011● 2.0.0 - 2013

Page 48: Why Ruby?

Rubinius● С++ и Руби● Вышел в 2006● Последняя версия в 2011● RubySpec

Page 49: Why Ruby?

JRuby● Вышел в 2001● Последняя версия в мае 2013 с экспериментальной

поддержкой Руби 2.0● Изначально поддерживали Rails

Page 50: Why Ruby?

IronRuby● Объявлен в 2007● Последняя версия 2011

Page 51: Why Ruby?

MacRuby● Руби на ObjectiveC

Page 52: Why Ruby?

RubyMotion● Руби для iOS

Page 53: Why Ruby?

Topaz● Руби на Питоне

Page 55: Why Ruby?

Книги

Page 56: Why Ruby?

И самое интересное● Написать свою реализацию RSpec

Page 57: Why Ruby?

Контакты

URL: www.acceptic.com

Software programming services andDedicated developers teams

E-mail: [email protected]

Tel.: +1 800 990 4370