Mais conteúdo relacionado Semelhante a Why ruby (20) Why ruby1. Защо Ruby и Rails ?
Радослав Станков
Ruby on Rails семинар – Варненски свободен университет 2010
7. Ruby on Rails
Ruby on Rails е framework
за уеб приложения.
Неготово мото е:
“Web development doesn’t hurt”
8. Ruby
Създаден от японеца Юкихиро
Мацумото „Мац“.
Първата публична версия излиза
през 1995.
Версия 2.0 се очакава да излезе за
Коледа / не се казва коя /
10. private $_products = null;
public function getProducts($categoryId){
if ($this->_products === null){
$this->_products = Product::where(array(
'category_id' => $categoryId
));
}
return $this->products;
}
19. 5.times { puts "Ruby is cool!" }
5.times do
puts "Ruby is cool!"
end
21. [1,2,3,4].each { |value| puts value }
# => [1, 2, 3, 4]
[1,2,3,4].map { |value| value * value }
# => [1, 4, 9, 16]
[1,2,3,4].reduce { |a, b| a + b }
# => 10
23. class Person
attr_accessor :fist_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def full_name
"#{first_name} + #{last_name}"
end
end
me = Person.new("Radoslav", "Stankov")
puts me.full_name # Radoslav Stankov
24. class Person
attr_accessor :fist_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def full_name
first_name + " " + last_name
end
end
me = Person.new("Radoslav", "Stankov")
puts me.full_name # Radoslav Stankov
25. class Person
attr_accessor :fist_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def full_name
first_name + " " + last_name
end
end
me = Person.new("Radoslav", "Stankov")
puts me.full_name # Radoslav Stankov
26. class Person
attr_accessor :fist_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def full_name
first_name + " " + last_name
end
end
me = Person.new("Radoslav", "Stankov")
puts me.full_name # Radoslav Stankov
27. class Person
attr_accessor :fist_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def full_name
first_name + " " + last_name
end
end
me = Person.new("Radoslav", "Stankov")
puts me.full_name # Radoslav Stankov
28. class Person
def +(other_person)
# ...
end
end
person1 + person2
29. class Array
def first
self[0]
end
def second
self[1]
end
end
array = [1, 2, 3, 4]
array.first # 1
array.second # 2
32. Ruby
• димично определяне на типа данните
• модули
• отворени класове
• блокове
• анонимни функции
• всяка операция връща резултат
• всичко е изпълним код
• изчистен синтаксис
• мета програмиране
• промяна на обектите по време на изпълнение
• вградени регулярни изрази
36. Ruby on Rails
Разработен от David
Heinemeier Hansson от 37
Signals.
Първата публична версия е
излиза през юли 2004.
Текущата стабилна версия
е 3.0.3
67. Model
class Task < ActiveRecord::Base
belongs_to :user
has_many :comments
validates_presence_of :user, :text
validates_inclusion_of :status, :in => ["opened", "completed"]
attr_readonly :user_id
def editable?
status == "opened"
end
end
68. Model
class Task < ActiveRecord::Base
belongs_to :user
has_many :comments
validates_presence_of :user, :text
validates_inclusion_of :status, :in => ["opened", "completed"]
attr_readonly :user_id
def editable?
status == "opened"
end
end
69. Model
class Task < ActiveRecord::Base
belongs_to :user
has_many :comments
validates_presence_of :user, :text
validates_inclusion_of :status, :in => ["opened", "completed"]
attr_readonly :user_id
def editable?
status == "opened"
end
end
70. Model
class Task < ActiveRecord::Base
belongs_to :user
has_many :comments
validates_presence_of :user, :text
validates_inclusion_of :status, :in => ["opened", "completed"]
attr_readonly :user_id
def editable?
status == "opened"
end
end
71. Model
class Task < ActiveRecord::Base
belongs_to :user
has_many :comments
validates_presence_of :user, :text
validates_inclusion_of :status, :in => ["opened", "completed"]
attr_readonly :user_id
def editable?
status == "opened"
end
end
72. Controller
class TasksController < ApplicationController
def index
@tasks = Tasks.where(:status => "opened")
end
def show
@task = Task.find(params[:id])
end
def create
@task = current_user.tasks.build(params[:task])
if @task.save
redirect_to tasks_path
else
render :partial => "new"
end
end
end
73. Controller
class TasksController < ApplicationController
def index
@tasks = Tasks.where(:status => "opened")
end
def show
@task = Task.find(params[:id])
end
def create
@task = current_user.tasks.build(params[:task])
if @task.save
redirect_to tasks_path
else
render :partial => "new"
end
end
end
74. Controller
class TasksController < ApplicationController
def index
@tasks = Tasks.where(:status => "opened")
end
def show
@task = Task.find(params[:id])
end
def create
@task = current_user.tasks.build(params[:task])
if @task.save
redirect_to tasks_path
else
render :partial => "new"
end
end
end
75. Controller
class TasksController < ApplicationController
def index
@tasks = Tasks.where(:status => "opened")
end
def show
@task = Task.find(params[:id])
end
def create
@task = current_user.tasks.build(params[:task])
if @task.save
redirect_to tasks_path
else
render :partial => "new"
end
end
end
76. View
<%= form_for task do |form| %>
<%= render 'shared/error_messages', :target => form.object %>
<p>
<%= form.label :text %>
<%= form.text_area :text %>
</p>
<p>
<%= form.label :status %>
<%= form.select :status, Task.statuses %>
</p>
<div class="buttons">
<%= form.submit %> |
<% link_to "Cancel", task_path %>
</div>
<% end %>
80. Test Driven Development
1 Добавя се тест
... за несъществуващ код
2 Пише се код
... колкото само тестът да мине
3 Правят се подобрения
... подобрява се качеството на кода
81. Test Driven Development
1 Добавя се тест
... за несъществуващ код
2 Пише се код
... колкото само тестът да мине
3 Правят се подобрения
... подобрява се качеството на кода
82. describe Task do
it { should belong_to(:user) }
it { should have_many(:notes) }
it { should validate_presence_of(:user) }
it { should validate_presence_of(:text) }
describe "#editable?" do
it "returns true if task status is 'opened'" do
Task.new(:status => "opened").should be_editable
end
it "returns false if task status is 'rejected'" do
Task.new(:status => "rejected").should_not be_editable
end
it "returns false if task status is 'completed" do
Task.new(:status => "completed").should_not be_editable
end
end
end
83. Тесване на Controller
describe TasksController do
describe "GET 'show'" do
before { Task.should_recive(:find).with("1").and_return task }
before { get :show, :id => "1" }
it { should assign_to(:task).with(task) }
it { should render_temlate("show") }
end
end
84. Тестване на View
describe "tasks/show.html.erb" do
before do
assign :task, mock_model(Task, {
:id => 1,
:text => "task text"
})
render
end
it "renders task text" do
rendered.should contain("task text")
end
it "renders link for editing task" do
rendered.should have_selector('a[href="/tasks/1/edit"]')
end
end
Notas do Editor \n \n \n \n \n Ruby &#x435; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x43F;&#x440;&#x435;&#x442;&#x438;&#x440;&#x443;&#x435;&#x43C;, &#x438;&#x43D;&#x442;&#x435;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x432;&#x435;&#x43D;, &#x43E;&#x431;&#x435;&#x43A;&#x442;&#x43D;&#x43E;-&#x43E;&#x440;&#x438;&#x435;&#x43D;&#x442;&#x438;&#x440;&#x430;&#x43D; &#x435;&#x437;&#x438;&#x43A; &#x437;&#x430; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x438;&#x440;&#x430;&#x43D;&#x435;. &#x422;&#x43E;&#x439; &#x43A;&#x43E;&#x43C;&#x431;&#x438;&#x43D;&#x438;&#x440;&#x430; &#x447;&#x435;&#x440;&#x442;&#x438; &#x43E;&#x442; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x434;&#x440;&#x443;&#x433;&#x438; &#x435;&#x437;&#x438;&#x446;&#x438;, &#x441;&#x440;&#x435;&#x434; &#x43A;&#x43E;&#x438;&#x442;&#x43E; Smalltalk, Perl, Lisp &#x438; Python.\n\n &#x422;&#x43E;&#x439; &#x435; framework &#x437;&#x430; &#x443;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;. &#x427;&#x438;&#x44F;&#x442;&#x43E; &#x446;&#x435;&#x43B; &#x435; &#x434;&#x430; &#x443;&#x43B;&#x435;&#x441;&#x43D;&#x438; &#x438; &#x443;&#x441;&#x43A;&#x43E;&#x440;&#x438; &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430; &#x43D;&#x430; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x432;&#x430;&#x43D;&#x435; &#x43D;&#x430; &#x443;&#x435;&#x431; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;.\n\n &#x422;&#x43E;&#x439; &#x435; &#x441;&#x44A;&#x437;&#x434;&#x430;&#x434;&#x435;&#x43D; &#x43E;&#x442; &#x44F;&#x43F;&#x43E;&#x43D;&#x435;&#x446;&#x430; &#x42E;&#x43A;&#x438;&#x445;&#x438;&#x440;&#x43E; &#x41C;&#x430;&#x446;&#x443;&#x43C;&#x43E;&#x442;&#x43E; &#x201E;&#x41C;&#x430;&#x446;&#x201C;. &#x41A;&#x430;&#x442;&#x43E; &#x43F;&#x440;&#x435;&#x437; 1995 &#x438;&#x437;&#x43B;&#x438;&#x437;&#x430; &#x43F;&#x44A;&#x440;&#x432;&#x430;&#x442;&#x430; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44F; &#x43D;&#x430; &#x435;&#x437;&#x438;&#x43A;&#x430;. &#xA0;&#x41C;&#x43E;&#x442;&#x43E;&#x442;&#x43E; &#x43D;&#x430; &#x435;&#x437;&#x438;&#x43A;&#x430; &#x435; &#xA0;&#x201E;&#x41E;&#x43F;&#x442;&#x438;&#x43C;&#x438;&#x437;&#x438;&#x440;&#x430;&#x43D; &#x437;&#x430; &#x449;&#x430;&#x441;&#x442;&#x438;&#x435;&#x442;&#x43E; &#x43D;&#x430; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x438;&#x441;&#x442;&#x430;&#x201D;\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n &#x421;&#x442;&#x440;&#x435;&#x43C;&#x435;&#x436;&#x44A;&#x442; &#x43D;&#x430; Ruby &#x435; &#x434;&#x430; &#x441;&#x43B;&#x435;&#x434;&#x432;&#x430; &#x43F;&#x440;&#x438;&#x43D;&#x446;&#x438;&#x43F;&#x430; &#x43D;&#x430; &#x43D;&#x430;&#x439;-&#x43C;&#x430;&#x43B;&#x43A;&#x430; &#x438;&#x437;&#x43D;&#x435;&#x43D;&#x430;&#x434;&#x430;. &#x422;&#x43E;&#x432;&#x430; &#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x432;&#x430;, &#x447;&#x435; &#x43F;&#x43E;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x435;&#x442;&#x43E; &#x43D;&#x430; &#x435;&#x437;&#x438;&#x43A;&#x430; &#x442;&#x440;&#x44F;&#x431;&#x432;&#x430; &#x434;&#x430; &#x435; &#x438;&#x43D;&#x442;&#x443;&#x438;&#x442;&#x438;&#x432;&#x43D;&#x43E; &#x438; &#x442;&#x43E;&#x439; &#x434;&#x430; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x438; &#x442;&#x430;&#x43A;&#x430;, &#x43A;&#x430;&#x43A;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x438;&#x441;&#x442;&#x44A;&#x442; &#x431;&#x438; &#x43E;&#x447;&#x430;&#x43A;&#x432;&#x430;&#x43B;.\nRuby &#x435; &#x43E;&#x431;&#x435;&#x43A;&#x442;&#x43D;&#x43E;-&#x43E;&#x440;&#x438;&#x435;&#x43D;&#x442;&#x438;&#x440;&#x430;&#x43D;: &#x432;&#x441;&#x435;&#x43A;&#x438; &#x442;&#x438;&#x43F; &#x434;&#x430;&#x43D;&#x43D;&#x438; &#x435; &#x43E;&#x431;&#x435;&#x43A;&#x442;, &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x43D;&#x43E; &#x43A;&#x43B;&#x430;&#x441;&#x43E;&#x432;&#x435;, &#x447;&#x438;&#x441;&#x43B;&#x430;, &#x431;&#x443;&#x43B;&#x435;&#x432;&#x438; &#x441;&#x442;&#x43E;&#x439;&#x43D;&#x43E;&#x441;&#x442;&#x438;, &#x43A;&#x43E;&#x438;&#x442;&#x43E; &#x432; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x434;&#x440;&#x443;&#x433;&#x438; &#x435;&#x437;&#x438;&#x446;&#x438; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x442; &#x43A;&#x430;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x43C;&#x438;&#x442;&#x438;&#x432;&#x438;, &#x430; &#x43D;&#x435; &#x43A;&#x430;&#x442;&#x43E; &#x440;&#x435;&#x430;&#x43B;&#x43D;&#x438; &#x43E;&#x431;&#x435;&#x43A;&#x442;&#x438;.\n\n&#x41D;&#x44F;&#x43A;&#x43E;&#x438; &#x43E;&#x442; &#x43D;&#x430;&#x439;-&#x432;&#x430;&#x436;&#x43D;&#x438;&#x442;&#x435; &#x445;&#x430;&#x440;&#x430;&#x43A;&#x442;&#x435;&#x440;&#x438;&#x441;&#x442;&#x438;&#x43A;&#x438; &#x43D;&#x430; &#x435;&#x437;&#x438;&#x43A;&#x430; &#x441;&#x430;: \n&#x434;&#x438;&#x43C;&#x438;&#x447;&#x43D;&#x43E; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x43D;&#x435; &#x43D;&#x430; &#x442;&#x438;&#x43F;&#x430; &#x434;&#x430;&#x43D;&#x43D;&#x438;&#x442;&#x435;\n&#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x438; - &#x201C;&#x432;&#x44A;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442; &#x435;&#x434;&#x438;&#x43D; &#x43C;&#x43E;&#x434;&#x443;&#x43B; &#x434;&#x430; &#x441;&#x435; &#x432;&#x433;&#x440;&#x430;&#x436;&#x434;&#x430; &#x432; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x43A;&#x43B;&#x430;&#x441;&#x43E;&#x432;&#x435;, &#x43A;&#x430;&#x442;&#x43E; &#x442;&#x430;&#x43A;&#x430; &#x441;&#x435; &#x43F;&#x43E;&#x441;&#x442;&#x438;&#x433;&#x430; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43E; &#x43D;&#x430;&#x441;&#x43B;&#x435;&#x434;&#x44F;&#x432;&#x430;&#x43D;&#x435;&#x201D;\n&#x43E;&#x442;&#x432;&#x43E;&#x440;&#x435;&#x43D;&#x438; &#x43A;&#x43B;&#x430;&#x441;&#x43E;&#x432;&#x435; - &#x201C;&#x43A;&#x44A;&#x43C; &#x432;&#x441;&#x435;&#x43A;&#x438; &#x43A;&#x43B;&#x430;&#x441; &#x43C;&#x43E;&#x433;&#x430;&#x442; &#x434;&#x430; &#x441;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44F;&#x442; &#x43D;&#x43E;&#x432;&#x438; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x438; &#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x438; &#x43F;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x435; &#x43D;&#x430; &#x438;&#x437;&#x43F;&#x44A;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x430;&#x442;&#x430;&#x201D;\n&#x431;&#x43B;&#x43E;&#x43A;&#x43E;&#x432;&#x435;\n&#x430;&#x43D;&#x43E;&#x43D;&#x438;&#x43C;&#x43D;&#x438; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438;\n&#x432;&#x441;&#x44F;&#x43A;&#x430; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x432;&#x440;&#x44A;&#x449;&#x430; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x442;&#x430;&#x442;\n&#x432;&#x441;&#x438;&#x447;&#x43A;&#x43E; &#x435; &#x438;&#x437;&#x43F;&#x44A;&#x43B;&#x43D;&#x438;&#x43C; &#x43A;&#x43E;&#x434; - &#x201C;&#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x43D;&#x43E; &#x438; &#x442;&#x435;&#x43B;&#x430;&#x442;&#x430; &#x43D;&#x430; &#x43A;&#x43B;&#x430;&#x441;&#x43E;&#x432;&#x435;&#x442;&#x435; &#x432; &#x43A;&#x43E;&#x439;&#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435; &#x438;&#x43C;&#x430; &#x446;&#x438;&#x43A;&#x43B;&#x438;, &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x43D;&#x438; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x442;&#x43E;&#x440;&#x438; &#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x201D;\n&#x438;&#x437;&#x447;&#x438;&#x441;&#x442;&#x435;&#x43D; &#x441;&#x438;&#x43D;&#x442;&#x430;&#x43A;&#x441;&#x438;&#x441; - &#x201C;&#x43D;&#x435; &#x435; &#x437;&#x430;&#x434;&#x44A;&#x43B;&#x436;&#x438;&#x442;&#x435;&#x43B;&#x43D;&#x43E;, &#x434;&#x430; &#x441;&#x435; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x44F;&#x442; &#x441;&#x43A;&#x43E;&#x431;&#x438;, &#x442;&#x43E;&#x447;&#x43A;&#x430; &#x438; &#x437;&#x430;&#x43F;&#x435;&#x442;&#x430;&#x44F; &#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x201D;\n&#x43C;&#x435;&#x442;&#x430; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x438;&#x440;&#x430;&#x43D;&#x435;\n&#xA0;\n\n \n \n &#x420;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x435;&#x43D; &#x43E;&#x442; David Heinemeier Hansson &#x43E;&#x442; 37 Signals. &#x41A;&#x430;&#x442;&#x43E; &#x435; Rails &#x435; &#x431;&#x438;&#x43B; &#x438;&#x437;&#x432;&#x43B;&#x435;&#x447;&#x435;&#x43D; &#x43E;&#x442; &#x442;&#x44F;&#x445;&#x43D;&#x43E;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; Basecamp. &#x412; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x43A;&#x430;&#x442;&#x430; &#x43D;&#x430; Rails &#x441;&#x430; &#x443;&#x447;&#x430;&#x441;&#x442;&#x432;&#x430;&#x43B;&#x438; &#x43D;&#x430;&#x434; 1500 &#x447;&#x43E;&#x432;&#x435;&#x43A;&#x430; &#x43A;&#x44A;&#x43C; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442;&#x430;.\n\n \n \n \n \n \n \n \n \n Rails &#x438;&#x437;&#x43F;&#x43E;&#x43B;&#x437;&#x432;&#x430; Model-View-Controller &#x430;&#x440;&#x445;&#x438;&#x442;&#x435;&#x43A;&#x442;&#x443;&#x440;&#x430;. &#x427;&#x438;&#x44F;&#x442;&#x43E; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x430; &#x446;&#x435;&#x43B; &#x435; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x44F;&#x43D;&#x435;&#x442;&#x43E; &#x43D;&#x430; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x430;&#x442;&#x430; &#x43E;&#x442; &#x43F;&#x43E;&#x442;&#x440;&#x435;&#x431;&#x438;&#x442;&#x435;&#x43B;&#x441;&#x43A;&#x438;&#x44F; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;. &#x41F;&#x43E; &#x442;&#x43E;&#x437;&#x438; &#x43D;&#x430;&#x447;&#x438;&#x43D; &#x43A;&#x43E;&#x434;&#x430; &#x435; &#x43F;&#x43E;-&#x43B;&#x435;&#x441;&#x435;&#x43D; &#x437;&#x430; &#x442;&#x435;&#x441;&#x442;&#x432;&#x430;&#x43D;&#x435;, &#x43F;&#x43E;&#x434;&#x434;&#x440;&#x44A;&#x436;&#x43A;&#x430; &#x438; &#x431;&#x44A;&#x434;&#x435;&#x449;&#x430; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;.\nModel - &#x201C;&#x43E;&#x431;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x432;&#x430; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x430;&#x442;&#x430; &#x438; &#x438;&#x43D;&#x444;&#x440;&#x430;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x443;&#x440;&#x430;&#x442;&#x430; &#x43D;&#x430; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;&#x442;&#x43E;. &#x41A;&#x430;&#x442;&#x43E; &#x43D;&#x430;&#x439;-&#x447;&#x435;&#x441;&#x442;&#x43E; &#x441;&#x435; &#x438;&#x437;&#x43F;&#x43E;&#x43B;&#x437;&#x432;&#x430;&#x442; ActiveRecord &#x43E;&#x431;&#x435;&#x43A;&#x442;&#x438;, &#x447;&#x440;&#x435;&#x437; &#x43A;&#x43E;&#x438;&#x442;&#x43E; &#x441;&#x435; &#x432;&#x437;&#x430;&#x438;&#x43C;&#x43E;&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x430; &#x441; &#x431;&#x430;&#x437;&#x430;&#x442;&#x430; &#x43E;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x438;. &#x412; Rails &#xA0;&#x43F;&#x43E;&#x447;&#x442;&#x438; &#x43D;&#x438;&#x43A;&#x43E;&#x433;&#x430; &#x43D;&#x435; &#x441;&#x435; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x438; &#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43D;&#x43E; &#x441; &#x431;&#x430;&#x437;&#x430;&#x442;&#x430; &#x43E;&#x442; &#x434;&#x430;&#x43D;&#x438; &#x438; &#x441; sql &#x43A;&#x43E;&#x434;, &#x430; &#x441;&#x435; &#x43C;&#x438;&#x43D;&#x430;&#x432;&#x430; &#x43F;&#x440;&#x435;&#x437; ActiveRecord &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x435;&#x201D;\nView - &#x201C;&#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x432;&#x430; &#x43F;&#x43E;&#x442;&#x440;&#x435;&#x431;&#x438;&#x442;&#x435;&#x43B;&#x441;&#x43A;&#x438;&#x44F; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;. &#x422;&#x43E;&#x432;&#x430; &#x43D;&#x430;&#x439;-&#x447;&#x435;&#x441;&#x442;&#x43E; &#x435; HTML &#x43A;&#x43E;&#x434;&#x430;&#x201D;.\nController - &#x201C;&#x441;&#x432;&#x44A;&#x440;&#x437;&#x432;&#x430; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x435; &#x438; &#x438;&#x437;&#x433;&#x43B;&#x435;&#x434;&#x438;&#x442;&#x435; &#x438; &#x432;&#x440;&#x44A;&#x449;&#x430; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x442;&#x430;&#x442; &#x43D;&#x430; &#x43F;&#x43E;&#x442;&#x440;&#x435;&#x431;&#x438;&#x442;&#x435;&#x43B;&#x44F;&#x201D;.\n&#xA0;\n\n &#x41A;&#x430;&#x43A; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x438; &#x435;&#x434;&#x43D;&#x43E; Rails &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;? \n&#x41F;&#x440;&#x438; &#x43F;&#x440;&#x438;&#x441;&#x442;&#x438;&#x433;&#x430;&#x43D;&#x435; &#x43D;&#x430; &#x437;&#x430;&#x43F;&#x438;&#x442;&#x432;&#x430;&#x43D;&#x435; &#x43E;&#x442; browser-&#x430;. &#xA0;&#x41F;&#x44A;&#x440;&#x432;&#x43E; &#x441;&#x435; &#x43C;&#x438;&#x43D;&#x430;&#x432;&#x430; &#x43F;&#x440;&#x435;&#x437; Routing &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x430;&#x442;&#x430;, &#x43A;&#x43E;&#x44F;&#x442;&#x43E; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;, &#x43A;&#x43E;&#x439; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x435;&#x440; &#x435; &#x43E;&#x442;&#x433;&#x43E;&#x432;&#x43E;&#x440;&#x435;&#x43D; &#x437;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;&#x442;&#x430; &#x43D;&#x430; &#x437;&#x430;&#x43F;&#x438;&#x442;&#x432;&#x430;&#x43D;&#x435;&#x442;&#x43E;. &#x421;&#x43B;&#x435;&#x434; &#x442;&#x43E;&#x432;&#x430; &#x441;&#x44A;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x435;&#x440; &#x432;&#x437;&#x430;&#x438;&#x43C;&#x43E;&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x430; &#x441; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x435;.\n&#x41A;&#x43E;&#x438;&#x442;&#x43E; &#x441;&#x430; &#x43D;&#x430;&#x439;-&#x447;&#x435;&#x441;&#x442;&#x43E; &#x441;&#x430; ActiveRecord &#x43E;&#x431;&#x435;&#x43A;&#x442;&#x438;, &#x43A;&#x43E;&#x438;&#x442;&#x43E; &#x441;&#x438; &#x432;&#x437;&#x430;&#x438;&#x43C;&#x43E;&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x430;&#x442; &#x441; &#x431;&#x430;&#x437;&#x430;&#x442;&#x430; &#x43E;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x438;. \n&#x421;&#x43B;&#x435;&#x434; &#x442;&#x43E;&#x432;&#x430; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x435;&#x440;&#x430; &#x43F;&#x440;&#x435;&#x434;&#x430;&#x432;&#x430; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x435; &#x43D;&#x430; View Layer-a, &#x43A;&#x43E;&#x439;&#x442;&#x43E; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x430; &#x438; &#x438;&#x437;&#x43F;&#x440;&#x430;&#x449;&#x430; &#x43E;&#x442;&#x433;&#x43E;&#x432;&#x43E;&#x440; &#x43D;&#x430; &#x431;&#x440;&#x430;&#x443;&#x437;&#x44A;&#x440;&#x430;. &#x41A;&#x430;&#x442;&#x43E; &#x442;&#x43E;&#x437;&#x438; &#x43E;&#x442;&#x433;&#x43E;&#x432;&#x43E;&#x440; &#x43C;&#x43E;&#x436;&#x435; &#x434;&#x430; &#x435; html, xml, json, JavaScript &#x438;&#x43B;&#x438; &#x434;&#x440;&#x443;&#x433; &#x43A;&#x43E;&#x434;.\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Taskar e &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x435;&#x43D; &#x447;&#x440;&#x435;&#x437; &#xA0;&#x422;est Driven Development &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x43B;&#x43E;&#x433;&#x438;&#x44F;&#x442;&#x430;, &#x447;&#x438;&#x44F;&#x442;&#x43E; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x430; &#x438;&#x434;&#x435;&#x44F; &#x435; &#x434;&#x430; &#x441;&#x435; &#x43F;&#x438;&#x448;&#x435; &#x43A;&#x43E;&#x434; &#x432; 3 &#x441;&#x442;&#x44A;&#x43F;&#x43A;&#x438;:\n&#x41F;&#x44A;&#x440;&#x432;&#x43E; &#x441;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44F; &#x442;&#x435;&#x441;&#x442;, &#x437;&#x430; &#x432;&#x441;&#x435; &#x43E;&#x449;&#x435; &#x43D;&#x435; &#x441;&#x44A;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x432;&#x430;&#x449; &#x43A;&#x43E;&#x434;. &#x41A;&#x43E;&#x439;&#x442;&#x43E; &#x442;&#x440;&#x44F;&#x431;&#x432;&#x430; &#x434;&#x430; &#x441;&#x435; &#x43C;&#x430;&#x440;&#x43A;&#x438;&#x440;&#x430; &#x43A;&#x430;&#x442;&#x43E; &#x43D;&#x435; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x435;&#x43D;\n&#x421;&#x43B;&#x435;&#x434; &#x442;&#x43E;&#x432;&#x430; &#x441;&#x435; &#x43F;&#x438;&#x448;&#x435; &#x432;&#x44A;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x439;-&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x438;&#x44F; &#x43A;&#x43E;&#x434;, &#x441; &#x43A;&#x43E;&#x439;&#x442;&#x43E; &#x442;&#x435;&#x441;&#x442;&#x430; &#x43C;&#x438;&#x43D;&#x430;&#x432;&#x430; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E;.\n&#x41D;&#x430;&#x43A;&#x440;&#x430;&#x44F; &#x441;&#x435; &#x43F;&#x440;&#x430;&#x432;&#x44F;&#x442; &#x43F;&#x43E;&#x434;&#x43E;&#x431;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E; &#x43A;&#x43E;&#x434;&#x430;, &#x438;&#x437;&#x447;&#x438;&#x441;&#x442;&#x432;&#x430;&#x442; &#x441;&#x435; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x435;&#x43D;&#x438;&#x44F;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44F;&#x442; &#x441;&#x435; &#x43D;&#x43E;&#x432;&#x438; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;&#x435; &#x438; &#x434;&#x440;&#x443;&#x433;&#x438;.\n\n&#x41A;&#x430;&#x442;&#x43E; &#x442;&#x435;&#x437;&#x438; 3 &#x441;&#x442;&#x44A;&#x43F;&#x43A;&#x438; &#x441;&#x435; &#x43F;&#x43E;&#x432;&#x442;&#x430;&#x440;&#x44F;&#x442; &#x43D;&#x435;&#x43F;&#x440;&#x435;&#x43A;&#x44A;&#x441;&#x43D;&#x430;&#x442;&#x43E; &#x432; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x430; &#x43D;&#x430; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;. &#x41A;&#x430;&#x442;&#x43E; &#x446;&#x44F;&#x43B;&#x43E; &#x442;&#x43E;&#x437;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43D;&#x430; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430; &#x433;&#x430;&#x440;&#x430;&#x43D;&#x442;&#x438;&#x440;&#x430; &#x447;&#x435; 100% &#x43E;&#x442; &#x43A;&#x43E;&#x434;&#x430; &#x449;&#x435; &#x435; &#x43F;&#x43E;&#x43A;&#x440;&#x438;&#x442; &#x441; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x43D;&#x438; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;&#x435;. &#x41A;&#x43E;&#x435;&#x442;&#x43E; &#x433;&#x43E; &#x43F;&#x440;&#x430;&#x432;&#x438; &#x43B;&#x435;&#x441;&#x435;&#x43D; &#x437;&#x430; &#x43F;&#x43E;&#x434;&#x434;&#x440;&#x44A;&#x436;&#x43A;&#x430; &#x438; &#x441; &#x43F;&#x43E;--&#x434;&#x43E;&#x431;&#x44A;&#x440; &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;. &#xA0;&#x422;&#x43E;&#x432;&#x430; &#x43E;&#x449;&#x435; &#x441;&#x435; &#x43D;&#x430;&#x440;&#x438;&#x447;&#x430; Red-Green-Blue &#x43D;&#x430;&#x447;&#x438;&#x43D; &#x43D;&#x430; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;.\n&#xA0;\n\n Taskar e &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x435;&#x43D; &#x447;&#x440;&#x435;&#x437; &#xA0;&#x422;est Driven Development &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x43B;&#x43E;&#x433;&#x438;&#x44F;&#x442;&#x430;, &#x447;&#x438;&#x44F;&#x442;&#x43E; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x430; &#x438;&#x434;&#x435;&#x44F; &#x435; &#x434;&#x430; &#x441;&#x435; &#x43F;&#x438;&#x448;&#x435; &#x43A;&#x43E;&#x434; &#x432; 3 &#x441;&#x442;&#x44A;&#x43F;&#x43A;&#x438;:\n&#x41F;&#x44A;&#x440;&#x432;&#x43E; &#x441;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44F; &#x442;&#x435;&#x441;&#x442;, &#x437;&#x430; &#x432;&#x441;&#x435; &#x43E;&#x449;&#x435; &#x43D;&#x435; &#x441;&#x44A;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x432;&#x430;&#x449; &#x43A;&#x43E;&#x434;. &#x41A;&#x43E;&#x439;&#x442;&#x43E; &#x442;&#x440;&#x44F;&#x431;&#x432;&#x430; &#x434;&#x430; &#x441;&#x435; &#x43C;&#x430;&#x440;&#x43A;&#x438;&#x440;&#x430; &#x43A;&#x430;&#x442;&#x43E; &#x43D;&#x435; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x435;&#x43D;\n&#x421;&#x43B;&#x435;&#x434; &#x442;&#x43E;&#x432;&#x430; &#x441;&#x435; &#x43F;&#x438;&#x448;&#x435; &#x432;&#x44A;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x439;-&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x438;&#x44F; &#x43A;&#x43E;&#x434;, &#x441; &#x43A;&#x43E;&#x439;&#x442;&#x43E; &#x442;&#x435;&#x441;&#x442;&#x430; &#x43C;&#x438;&#x43D;&#x430;&#x432;&#x430; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E;.\n&#x41D;&#x430;&#x43A;&#x440;&#x430;&#x44F; &#x441;&#x435; &#x43F;&#x440;&#x430;&#x432;&#x44F;&#x442; &#x43F;&#x43E;&#x434;&#x43E;&#x431;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E; &#x43A;&#x43E;&#x434;&#x430;, &#x438;&#x437;&#x447;&#x438;&#x441;&#x442;&#x432;&#x430;&#x442; &#x441;&#x435; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x435;&#x43D;&#x438;&#x44F;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44F;&#x442; &#x441;&#x435; &#x43D;&#x43E;&#x432;&#x438; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;&#x435; &#x438; &#x434;&#x440;&#x443;&#x433;&#x438;.\n\n&#x41A;&#x430;&#x442;&#x43E; &#x442;&#x435;&#x437;&#x438; 3 &#x441;&#x442;&#x44A;&#x43F;&#x43A;&#x438; &#x441;&#x435; &#x43F;&#x43E;&#x432;&#x442;&#x430;&#x440;&#x44F;&#x442; &#x43D;&#x435;&#x43F;&#x440;&#x435;&#x43A;&#x44A;&#x441;&#x43D;&#x430;&#x442;&#x43E; &#x432; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x430; &#x43D;&#x430; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;. &#x41A;&#x430;&#x442;&#x43E; &#x446;&#x44F;&#x43B;&#x43E; &#x442;&#x43E;&#x437;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43D;&#x430; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430; &#x433;&#x430;&#x440;&#x430;&#x43D;&#x442;&#x438;&#x440;&#x430; &#x447;&#x435; 100% &#x43E;&#x442; &#x43A;&#x43E;&#x434;&#x430; &#x449;&#x435; &#x435; &#x43F;&#x43E;&#x43A;&#x440;&#x438;&#x442; &#x441; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x43D;&#x438; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;&#x435;. &#x41A;&#x43E;&#x435;&#x442;&#x43E; &#x433;&#x43E; &#x43F;&#x440;&#x430;&#x432;&#x438; &#x43B;&#x435;&#x441;&#x435;&#x43D; &#x437;&#x430; &#x43F;&#x43E;&#x434;&#x434;&#x440;&#x44A;&#x436;&#x43A;&#x430; &#x438; &#x441; &#x43F;&#x43E;--&#x434;&#x43E;&#x431;&#x44A;&#x440; &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;. &#xA0;&#x422;&#x43E;&#x432;&#x430; &#x43E;&#x449;&#x435; &#x441;&#x435; &#x43D;&#x430;&#x440;&#x438;&#x447;&#x430; Red-Green-Blue &#x43D;&#x430;&#x447;&#x438;&#x43D; &#x43D;&#x430; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;.\n&#xA0;\n\n Taskar e &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x435;&#x43D; &#x447;&#x440;&#x435;&#x437; &#xA0;&#x422;est Driven Development &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x43B;&#x43E;&#x433;&#x438;&#x44F;&#x442;&#x430;, &#x447;&#x438;&#x44F;&#x442;&#x43E; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x430; &#x438;&#x434;&#x435;&#x44F; &#x435; &#x434;&#x430; &#x441;&#x435; &#x43F;&#x438;&#x448;&#x435; &#x43A;&#x43E;&#x434; &#x432; 3 &#x441;&#x442;&#x44A;&#x43F;&#x43A;&#x438;:\n&#x41F;&#x44A;&#x440;&#x432;&#x43E; &#x441;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44F; &#x442;&#x435;&#x441;&#x442;, &#x437;&#x430; &#x432;&#x441;&#x435; &#x43E;&#x449;&#x435; &#x43D;&#x435; &#x441;&#x44A;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x432;&#x430;&#x449; &#x43A;&#x43E;&#x434;. &#x41A;&#x43E;&#x439;&#x442;&#x43E; &#x442;&#x440;&#x44F;&#x431;&#x432;&#x430; &#x434;&#x430; &#x441;&#x435; &#x43C;&#x430;&#x440;&#x43A;&#x438;&#x440;&#x430; &#x43A;&#x430;&#x442;&#x43E; &#x43D;&#x435; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x435;&#x43D;\n&#x421;&#x43B;&#x435;&#x434; &#x442;&#x43E;&#x432;&#x430; &#x441;&#x435; &#x43F;&#x438;&#x448;&#x435; &#x432;&#x44A;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x439;-&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x438;&#x44F; &#x43A;&#x43E;&#x434;, &#x441; &#x43A;&#x43E;&#x439;&#x442;&#x43E; &#x442;&#x435;&#x441;&#x442;&#x430; &#x43C;&#x438;&#x43D;&#x430;&#x432;&#x430; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E;.\n&#x41D;&#x430;&#x43A;&#x440;&#x430;&#x44F; &#x441;&#x435; &#x43F;&#x440;&#x430;&#x432;&#x44F;&#x442; &#x43F;&#x43E;&#x434;&#x43E;&#x431;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E; &#x43A;&#x43E;&#x434;&#x430;, &#x438;&#x437;&#x447;&#x438;&#x441;&#x442;&#x432;&#x430;&#x442; &#x441;&#x435; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x435;&#x43D;&#x438;&#x44F;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44F;&#x442; &#x441;&#x435; &#x43D;&#x43E;&#x432;&#x438; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;&#x435; &#x438; &#x434;&#x440;&#x443;&#x433;&#x438;.\n\n&#x41A;&#x430;&#x442;&#x43E; &#x442;&#x435;&#x437;&#x438; 3 &#x441;&#x442;&#x44A;&#x43F;&#x43A;&#x438; &#x441;&#x435; &#x43F;&#x43E;&#x432;&#x442;&#x430;&#x440;&#x44F;&#x442; &#x43D;&#x435;&#x43F;&#x440;&#x435;&#x43A;&#x44A;&#x441;&#x43D;&#x430;&#x442;&#x43E; &#x432; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x430; &#x43D;&#x430; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;. &#x41A;&#x430;&#x442;&#x43E; &#x446;&#x44F;&#x43B;&#x43E; &#x442;&#x43E;&#x437;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43D;&#x430; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430; &#x433;&#x430;&#x440;&#x430;&#x43D;&#x442;&#x438;&#x440;&#x430; &#x447;&#x435; 100% &#x43E;&#x442; &#x43A;&#x43E;&#x434;&#x430; &#x449;&#x435; &#x435; &#x43F;&#x43E;&#x43A;&#x440;&#x438;&#x442; &#x441; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x43D;&#x438; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;&#x435;. &#x41A;&#x43E;&#x435;&#x442;&#x43E; &#x433;&#x43E; &#x43F;&#x440;&#x430;&#x432;&#x438; &#x43B;&#x435;&#x441;&#x435;&#x43D; &#x437;&#x430; &#x43F;&#x43E;&#x434;&#x434;&#x440;&#x44A;&#x436;&#x43A;&#x430; &#x438; &#x441; &#x43F;&#x43E;--&#x434;&#x43E;&#x431;&#x44A;&#x440; &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;. &#xA0;&#x422;&#x43E;&#x432;&#x430; &#x43E;&#x449;&#x435; &#x441;&#x435; &#x43D;&#x430;&#x440;&#x438;&#x447;&#x430; Red-Green-Blue &#x43D;&#x430;&#x447;&#x438;&#x43D; &#x43D;&#x430; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;.\n&#xA0;\n\n Taskar e &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x435;&#x43D; &#x447;&#x440;&#x435;&#x437; &#xA0;&#x422;est Driven Development &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x43B;&#x43E;&#x433;&#x438;&#x44F;&#x442;&#x430;, &#x447;&#x438;&#x44F;&#x442;&#x43E; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x430; &#x438;&#x434;&#x435;&#x44F; &#x435; &#x434;&#x430; &#x441;&#x435; &#x43F;&#x438;&#x448;&#x435; &#x43A;&#x43E;&#x434; &#x432; 3 &#x441;&#x442;&#x44A;&#x43F;&#x43A;&#x438;:\n&#x41F;&#x44A;&#x440;&#x432;&#x43E; &#x441;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44F; &#x442;&#x435;&#x441;&#x442;, &#x437;&#x430; &#x432;&#x441;&#x435; &#x43E;&#x449;&#x435; &#x43D;&#x435; &#x441;&#x44A;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x432;&#x430;&#x449; &#x43A;&#x43E;&#x434;. &#x41A;&#x43E;&#x439;&#x442;&#x43E; &#x442;&#x440;&#x44F;&#x431;&#x432;&#x430; &#x434;&#x430; &#x441;&#x435; &#x43C;&#x430;&#x440;&#x43A;&#x438;&#x440;&#x430; &#x43A;&#x430;&#x442;&#x43E; &#x43D;&#x435; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x435;&#x43D;\n&#x421;&#x43B;&#x435;&#x434; &#x442;&#x43E;&#x432;&#x430; &#x441;&#x435; &#x43F;&#x438;&#x448;&#x435; &#x432;&#x44A;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x439;-&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x438;&#x44F; &#x43A;&#x43E;&#x434;, &#x441; &#x43A;&#x43E;&#x439;&#x442;&#x43E; &#x442;&#x435;&#x441;&#x442;&#x430; &#x43C;&#x438;&#x43D;&#x430;&#x432;&#x430; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E;.\n&#x41D;&#x430;&#x43A;&#x440;&#x430;&#x44F; &#x441;&#x435; &#x43F;&#x440;&#x430;&#x432;&#x44F;&#x442; &#x43F;&#x43E;&#x434;&#x43E;&#x431;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E; &#x43A;&#x43E;&#x434;&#x430;, &#x438;&#x437;&#x447;&#x438;&#x441;&#x442;&#x432;&#x430;&#x442; &#x441;&#x435; &#x43F;&#x43E;&#x432;&#x442;&#x43E;&#x440;&#x435;&#x43D;&#x438;&#x44F;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44F;&#x442; &#x441;&#x435; &#x43D;&#x43E;&#x432;&#x438; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;&#x435; &#x438; &#x434;&#x440;&#x443;&#x433;&#x438;.\n\n&#x41A;&#x430;&#x442;&#x43E; &#x442;&#x435;&#x437;&#x438; 3 &#x441;&#x442;&#x44A;&#x43F;&#x43A;&#x438; &#x441;&#x435; &#x43F;&#x43E;&#x432;&#x442;&#x430;&#x440;&#x44F;&#x442; &#x43D;&#x435;&#x43F;&#x440;&#x435;&#x43A;&#x44A;&#x441;&#x43D;&#x430;&#x442;&#x43E; &#x432; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x430; &#x43D;&#x430; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;. &#x41A;&#x430;&#x442;&#x43E; &#x446;&#x44F;&#x43B;&#x43E; &#x442;&#x43E;&#x437;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x43D;&#x430; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430; &#x433;&#x430;&#x440;&#x430;&#x43D;&#x442;&#x438;&#x440;&#x430; &#x447;&#x435; 100% &#x43E;&#x442; &#x43A;&#x43E;&#x434;&#x430; &#x449;&#x435; &#x435; &#x43F;&#x43E;&#x43A;&#x440;&#x438;&#x442; &#x441; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x43D;&#x438; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;&#x435;. &#x41A;&#x43E;&#x435;&#x442;&#x43E; &#x433;&#x43E; &#x43F;&#x440;&#x430;&#x432;&#x438; &#x43B;&#x435;&#x441;&#x435;&#x43D; &#x437;&#x430; &#x43F;&#x43E;&#x434;&#x434;&#x440;&#x44A;&#x436;&#x43A;&#x430; &#x438; &#x441; &#x43F;&#x43E;--&#x434;&#x43E;&#x431;&#x44A;&#x440; &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;. &#xA0;&#x422;&#x43E;&#x432;&#x430; &#x43E;&#x449;&#x435; &#x441;&#x435; &#x43D;&#x430;&#x440;&#x438;&#x447;&#x430; Red-Green-Blue &#x43D;&#x430;&#x447;&#x438;&#x43D; &#x43D;&#x430; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;.\n&#xA0;\n\n \n \n \n \n \n