Why Ruby?
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Why Ruby?

on

  • 656 views

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

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

Statistics

Views

Total Views
656
Views on SlideShare
656
Embed Views
0

Actions

Likes
1
Downloads
3
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Why Ruby? Presentation Transcript

  • 1. RUBYПочему его стоит выучить?
  • 2. Ruby● http://ruby-lang.org● Динамический объектно-ориентированный языксо строгой типизацией● И большим количеством сахара
  • 3. Ruby
  • 4. Динамический со строгой типизацией● Тип задается при присваивании● Типы не приводятся автоматически к одному типу["test"] + "test"TypeError: cant convert String into Array
  • 5. Утиная типизация● Важен не тип объекта, а возможность запустить методу него.
  • 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. Объектно-ориентированный● Все является объектом● Даже примитивы● Даже методы● Даже классы
  • 8. Классы● Всего лишь специальный объект● Объект, который создает экземпляры спредопределенными методами и полями при помощиспециального метода.● У каждого объекта есть свойство #class которыйсодержит ссылку на класс.
  • 9. ПримерMyClass = Class.new(Object) dodefine_method(:test) do"Hello World!"endendMyClass.new.testMyClass.new.class
  • 10. Пример с сахаромclass MySweetClassdef test"Hello World!"endendMySweetClass.new.testMySweetClass.new.class
  • 11. Про сахарattr_accessor :url, :version, :namedef name“My name is #{name}”enddef url=(value)@url = value if value[/Ahttp/]@urlend
  • 12. Про сахарarr.any?arr.compact!def +(other)..endresult = case awhen (1..10)"hi"when String"test"end
  • 13. Расширяемость● Нельзя закрыть класс от наследования.● Каждый объект можно расширить.
  • 14. Расширяемостьclass Testdef test”test”endendp (test = Test.new).test #”test”test.instance_eval dodef test“magic”endEndp test.test # magic
  • 15. Расширяемостьclass Testdef do_smth(param)endendclass Testalias_method :do_smth, :do_smth_without_loggingdef do_smth(param)p paramdo_smth_without_loggingendend
  • 16. RUBY STYLE
  • 17. Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни
  • 18. Про всякую фигню● return● ;● ()● public/private/protected● else if● комментарии
  • 19. Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни● Идти по пути наименьшего удивления● Наименования должны выражать сущность объекта
  • 20. Например● AbstractSingletonProxyFactoryBean
  • 21. Порождающие шаблоныпрограммирования● Singleton● Factory● Prototype● Builder● FactoryMethod
  • 22. Singletonclass Ainclude Singletonend
  • 23. Factorydef possible_objects{test: Test, sweet: SweetObject}enddef get_new_object(object)klass = possible_objects[object]klass.new if klassend
  • 24. Prototype● {test: ‘for Ruby’}.clone
  • 25. Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни● Идти по пути наименьшего удивления● Наименования должны выражать сущность объекта● Всё должно быть протестировано
  • 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. Результатrspec % --format=documentationBalancecalculates balance for selected datebalanceshould eq 230.0Finished in 0.01385 seconds2 examples, 0 failures
  • 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. Ruby-style● Писать как можно больше кода● и как можно меньше всякой фигни● Идти по пути наименьшего удивления● Наименования должны выражать сущность объекта● Всё должно быть протестировано● Код пишется для людей
  • 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. Configuration managers● Chef● Puppet
  • 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. RAILS & WEB FRAMEWORKS
  • 34. Ruby on Rails● Июль 2004● MVC Framework● ActiveRecord для работы с базой данных● ActiveView&ActionController● ActionMailer● ActiveSupport
  • 35. Ruby on Rails● Простой язык● Одинаковая структура для всех приложений
  • 36. Структура├── Gemfile├── Gemfile.lock├── README.rdoc├── Rakefile├── app│ ├── assets│ │ ├── images│ │ ├── javascripts│ │ └── stylesheets│ ├── controllers│ ├── helpers│ ├── mailers│ ├── models│ └── views│ └── layouts
  • 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. Структура├── lib│ ├── assets│ └── tasks├── log├── public│ ├── 404.html│ ├── 422.html│ ├── 500.html│ ├── favicon.ico│ └── robots.txt├── result├── test├── tmp└── vendor└── assets├── javascripts└── stylesheets
  • 39. Ruby on Rails● Простой язык● Одинаковая структура для всех приложений● Простое ORM
  • 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. 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. Ruby on Rails● Простой язык● Одинаковая структура для всех приложений● Простое ORM● Легко писать тесты● Легко обновлять● Очень быстро можно начать работать● Много плюшек● Convention over configuration
  • 43. Ruby on Rails● “Rails is omakase” DHH● Можно многое поменять
  • 44. Sinatra● Очень простой фреймворк● Использовать только то, что надо● Быстрый
  • 45. Padrino● Sinatra +● генераторы● Возможность работать с большими приложениями
  • 46. КАКИЕ БЫВАЮТ РУБИ?Различные интерпретаторы
  • 47. MRI● 1.8.7 – 2008● 1.9.3 – 2011● 2.0.0 - 2013
  • 48. Rubinius● С++ и Руби● Вышел в 2006● Последняя версия в 2011● RubySpec
  • 49. JRuby● Вышел в 2001● Последняя версия в мае 2013 с экспериментальнойподдержкой Руби 2.0● Изначально поддерживали Rails
  • 50. IronRuby● Объявлен в 2007● Последняя версия 2011
  • 51. MacRuby● Руби на ObjectiveC
  • 52. RubyMotion● Руби для iOS
  • 53. Topaz● Руби на Питоне
  • 54. Как учить?● http://tryruby.org/levels/1/challenges/0● http://railsforzombies.org/● Читать хороший код (rails, sinatra, rubinius, diaspora,discourse, alphagov)
  • 55. Книги
  • 56. И самое интересное● Написать свою реализацию RSpec
  • 57. КонтактыURL: www.acceptic.comSoftware programming services andDedicated developers teamsE-mail: info@acceptic.comTel.: +1 800 990 4370