ruby for .net developers
DESCRIPTION
Introduction to Ruby for .NET developers.Learn and compareTRANSCRIPT
By Max Titovmaxtitov.me
Ninja Software Operations
Ruby for .NETDevelopers VS FOR
Objective: learn and compare
▶ What is Ruby? ▶ Ruby basics▶ Ruby specialties▶ Ruby ecosystem▶ So why Ruby?▶ How to get started?
What is Ruby?
Creator
"I wanted a scripting language that was more powerful than Perl, and more object-oriented than Python. That's why I decided to design my own language.”
Yukihiro (Matz) Matsumoto
Facts
▶ First “Hello World” in 1995 (.NET 2002, C# 2001)
▶ Ruby is opensource▶ Inspired by: Perl, Smalltalk, Lisp, Python …▶ Philosophy: Designed for programmer
productivity and fun.
Ruby Basics
First taste of Ruby codeclass Apple NAME = "Apple" attr_accessor :size, :color
def initialize size @size = size end
def taste puts "Sweet #{@color} #{NAME} of size #{size}" endend
apple = Apple.new 'big'apple.color = 'red' apple.taste # Sweet red Apple of size big
I know, feels like
Similarities
▶ Large standard library (Not so big as .NET Framework but feels enough)
▶ The are classes, methods, variables, properties.
▶ Access control modifiers▶ Closures (Lambdas)▶ Exceptions▶ Garbage collector
Ruby is Dynamic
▶ No need to declare variables
var = "Ruby is Dynamic"var.class #Stringvar = 1var.class #Fixnum
Ruby is Strong Typed
▶ Like in .NET there is no type juggling.You need to convert between types.
a = "1"b = 2a + b #TypeError: can`t convert Fixnum into Stringa.to_i + b # 3
Everything is an Object
▶ All classes are drived from base class named Class
▶ Unlike .NET there is no structs
Everything is an Object
▶ So even primitive Types are an objects
10.times {puts "I am sexy and I know it!"}# I am sexy and I know it!# I am sexy and I know it!# I am sexy and I know it!# I am sexy and I know it!# I am sexy and I know it!# ....(10 times)....
Everything is an Object
▶ Operators are simply object methods.
class Fixnum < Integer def + numeric # sum code endend
Ruby is Flexible
▶ Core Ruby code could be easy altered.
class Numeric def toSquare self * self endend
2.toSquare # 4
Ruby is Concise
▶ Properties could be defined in old school way
class Person #getter def name @name end
#setter def name= name @name = name endend
Ruby is Concise
▶ Or in more convenient style
class Person #getter and setter, for several properties attr_accessor :name , :nickname
#getter attr_reader :gender
#setter attr_writer :ageend
Some questions to you
▶ Constants, start from capital or not?▶ Field names, prefixed with underscore or
not?▶ How many coding guide lines is there
actually?▶ Microsoft Framework Design Guidelines▶ IDesign C# coding standards▶ Your company coding standard▶ Your own coding standard. (Professional
choice)
Ruby is Strict
▶ Autocracy took over the Ruby community.
Ruby is Strict
Ruby syntaxes mostly dictates naming conventions:
▶ localVariable▶ @instanceVariable▶ @@classVariable▶ $globalVariable▶ Constant ▶ ClassName▶ method_name
Ruby is Strict
▶ 95% of ruby developers use same code style.
▶ Other 5% are a new comers, that will adept code conventions soon.
Forever alone in the world of naming conventions.
So in Ruby world you don’t feel like:
And Ruby Is Forgiving
▶ Parenthesis are optional▶ No need in semicolon at the end of
each line
Ruby specialties
Duck typing
What really makes object an object?How can I recognize that object is a
Duck?
Duck typing
Behavior
Duck typing
▶ Definition: When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck. (Wikipedia)
So, is it a duck?
Swim? YesCan Quack? Yes
Is it a duck?Definitely!
And this?
Swim? YesCan Quack? Yes. Kind of strange, but still it make quack like sound
Is it a duck?Looks like!
How, about this?
Swim? Badly, but yes. Can Quack? Yeah, make Plenty of sounds but, can quack also.
Is it a duck?Sort of weird duck, but still yes!
Or, probably this?
Swim? YepCan quack? Can make weird quacksounds.
Is it duck?Trying very hard
Duck Typing
▶ So, everything that could respond to several criteria's that makes us believethat object is a duck, can be recognized as a duck.
▶ But what that means from programmer perspective and how to implement it?
What is told you there is no abstract classes and interfaces?
But there is Modules and Mixins!
▶ Modules define pieces of reusable code that couldn’t be instantiated.
▶ Modules provides a namespace functionality and prevent name clashes
Namespaces in Rubymodule System module Windows module Forms module MessageBox def MessageBox.Show message puts message
end end end endend
include System::Windows::FormsMessageBox.Show 'Namespacing in ruby’
Modules and Mixins
▶ Modules could be “mixed in” to any class that satisfy conventions described in documentation (Should quack and swim like a duck).
▶ In .net Mixins using ReMix http://remix.codeplex.com/
Lets see how it works by implementing Enumerable
In .NET we usually do this
▶ We need to implement two interfaces▶ IEnumerable▶ IEnumerator
In .NET we usually do thisclass People : IEnumerable{
IEnumerator GetEnumerator(){
return (IEnumerator) new PeopleEnumerator();}
}
public class PeopleEnumerator : IEnumerator{
public Person Current;public void Reset();public bool MoveNext();
}
public class Person{}
How it’s done in Ruby
▶ From Enumerable module documentation:The Enumerable mixin provides collection classes with several traversal and searching methods, and with the ability to sort. The client class must provide a method “each”, which yields successive members of the collection.
How it’s done in Ruby
class MyCollection include Enumerable def each #yields result endend
That was easy!
But static typing and interfaces make me safe!
Really?
In Ruby world developers used to write unit tests for this
Document and organize their code better
# The <code>Enumerable</code> mixin provides collection classes with# several traversal and searching methods, and with the ability to# sort. The class must provide a method <code>each</code>, which# yields successive members of the collection. If# <code>Enumerable#max</code>, <code>#min</code>, or# <code>#sort</code> is used, the objects in the collection must also# implement a meaningful <code><=></code> operator, as these methods# rely on an ordering between members of the collection.module Enumerable # enum.to_a -> array # enum.entries -> array
# Returns an array containing the items in <i>enum</i>. # # (1..7).to_a #=> [1, 2, 3, 4, 5, 6, 7] # { 'a'=>1, 'b'=>2, 'c'=>3 }.to_a #=> [["a", 1], ["b", 2], #
["c", 3]] def to_a() #This is a stub, used for indexing end
Closures in Ruby
▶ Closures in Ruby called Blocks
names = ["Max", "Alex", "Dima"].map do |name| name.downcaseendputs names# max# alex# dima
Ruby metaprogramming
▶ Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do part of the work at compile time that would otherwise be done at runtime. (Wikipedia)
▶ Keep programs DRY – Don’t repeat yourself.
Where is example?
In all cinemas of your town Next time “Ruby
metaprogramming”
Ruby Ecosystem
Frameworks
Ruby
▶ Ruby on Rails, Merb
▶ Sinatra▶ Radiant,
Mephisto
.NET
▶ ASP.NET MVC, FunuMVC
▶ Nancy ▶ Umbraco,
DotNetNuke
Tools
Ruby
▶ Any TextEditor (RubyMine IDE)
▶ Rake▶ Gems ▶ Gems and
Bundler ▶ TestUnit,
minitest▶ Cucumber,
RSpec, Shoulda
.NET
▶ Visual Studio, MonoDevelop
▶ MSBuild, NAnt▶ Dll’s▶ NuGet▶ MSUnit, NUnit … ▶ NSpec, SpecFlow
So Why Ruby?
So Why Ruby?
▶ All hot stuff is here ▶ Benefits of interpreted language▶ Quick prototyping with Rails▶ It’s fun and it’s going to make your
better!▶ And definitely it will sabotage what
you believe in.
Feel more Rubier now? I hope so
Ruby tutorial 101
Interactive Ruby tutorial:▶ http://tryruby.org/
Online course:▶ http://www.coursera.org/course/saas/
Books
▶Programming Ruby (Pick Axe book)By Thomas D., Fowler C., Hunt A.
▶Design Patterns In RubyBy Russ Olsen
▶Search Google for: Learn Ruby
Follow the ruby side we have
cookies
Yep, we really do!
Questions?Ruby for .NET developers
By Max TitovGet presentation: www.maxtitov.me
Get in touch: [email protected]: eolexe