Marek Osvald 2011, v1.1
, Rasmus Lerdorf momentálně ve verzi 5.3.5, chystá se verze 6 není nikde kompletně definován → pouze jediný interpret, napsán v C (pod Windows navíc pouze 32bitový)
„Based on my limited experience [...] all the PHP code I’ve seen in that experience has been messy, unmaintainable crap. Spaghetti SQL wrapped in spaghetti PHP wrapped in spaghetti HTML, replicated in slightly-varying form in dozens of places.“ – Tim Bray (Google)
Hlavní argumenty proti PHP podivné licence (různě licencované moduly) cílená pomalost (Zend Accelerator) 3 zcela nekompatibilní verze (4.3, 4.4, 5.0) špatná podpora znakových sad špatná rekurze nekonzistentní ▪ pojmenování funkcí (spojené × oddělené × camelCase, 2 × to) ▪ pořadí argumentů ▪ návratové hodnoty (string)"false" == (int)0 → true neobjektové frameworky (CakePHP, Symphony,...)
1995, まつもとゆきひろ (Yukihiro Matsumoto) momentálně ve verzi , chystá se verze 2.0 vlastnosti VHLL - Very High-Level Language skriptovací objektově orientovaný dynamicky typovaný (duck typing) reflektivní automatická správa paměti (garbage collector)
NON-DUCK TYPING (JAVA) public class Duck implements Bird { void walk() { } void quack() { } } public void foo(Duck duck) { duck.walk(); duck.quack(); } DUCK TYPING (RUBY) class Duck < Bird def walk end def quack end def foo(duck) duck.walk() duck.quack() end
oficiální interpret (MRI) napsán v C existují i jiné YARV – C (pro verzi 2.0) JRuby – Java Rubinius – C++ IronRuby – C#/.NET MacRuby – Objective-C HotRuby - JavaScript
vychází z Perlu a Pythonu v určitých ohledech se podobá Smalltalku a dalším jazykům přebírá i některé prvky funkcionálního paradigmatu plně objektově orientovaný 3.times() do puts(‘Hooray!\n‘) end balíčkovací nástroj RubyGems (správa knihovních balíků)
2004, David Heinemeier Hansson momentálně ve verzi framework pro webové aplikace napsaný v Ruby skládá se z několika základních knihoven (ActiveRecord, ActionPack, ActiveSupport, ActionMailer,...)
vlastnosti modulární návrh (i základní knihovny lze z frameworku vynechat) MVC architektura nezávislost na konkrétní DB (drivery) migrace (verzování DB) automatické routování (i bez mod_rewrite ) navrženo pro agilní metodiky, obzvláště TDD (Test Driven Development) úzká integrace s verzovacím nástrojem Git
... <?php $connection = mysql_connect($server, $login, $pass); mysql_select_db($database); $result = mysql_fetch_array(„SELECT * FROM users WHERE id=$id“); mysql_close($connection); ?>
MVC Model – datová logika (připojení k DB, SQL, validace dat,...) View – prezentační logika (kde v HTML se mají získaná data vypsat) Controller – aplikační logika (co se má načíst z DB, ověření uživatele ze session,...)
mapování adresy na příslušný controller a akci root :to => „users#index“ match ‚/profile/:id‘ :to => „users#show“
class User < ActiveRecord::Base end User.all() # SELECT * FROM users User.find(1) # SELECT * FROM users WHERE id=1 User.find_by_name(‚Jan Novak‘) # SELECT * FROM users WHERE name=‚Jan Novak‘ User.count() # SELECT count(*) FROM users AS count
class User < ActiveRecord::Base belongs_to :user_group has_many :projects validate :name, :presence => true :uniqueness => true :length => end pepa = User.find_by_name(‚Josef Novák‘) pepovy_projekty = pepa.projects() pepova_skupina = pepa.user_group()
class UsersController < ApplicationController def index = User.all() end def show = User.find(params[:id]) end def = flash[:notice] = „Uzivatel uspesne smazan“ redirect_to ‚index‘ end
...
hierarchické skládání layoutů aplikace ▪ /app/views/layouts/application.html.erb controlleru ▪ /app/views/layouts/users.html.erb stránky ▪ /app/views/users/index.html.erb
3 implicitní prostředí development – znovunačítání veškerého kódu (pomalé, ale dobrá reakce na změny) test – rozšíření debugovacích informací production – pro ostrý provoz, zrychlené další uživatelsky definovaná prostření
skvělý ladící nástroj načte celé vaše prostředí z Rails do řádkového interpretu Ruby velice rychle umožní odhalit problém na aplikační nebo datové vrstvě existují rozšíření i pro prezentační vrstvu (Webrat)
základní testovací jednotka Test::Unit (poslední dobou se od ní spíše ustupuje) Rspec require ‚user‘ describe „User“ it „shouldn‘t allow a user without name to be saved" do user = User.new(:name => nil, : => user.save.should be_false end
Hal Furton: Ruby – kompendium znalostí pro začátečníky i profesionály The Ruby Way 2nd Edition Zoner Press/Addison Wesley
Steven Holzner: Začínáme programovat v Ruby on Rails Beginning Ruby on Rails Computer Press/Wrox
Ruby Rails