Your SlideShare is downloading. ×
0
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Why Ruby?
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Why Ruby?

440

Published 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

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

No Downloads
Views
Total Views
440
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
4
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

×