Uploaded on

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
383
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
3
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

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