Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Паттерны проектирования в Ruby: Шаблонный способ

Anna | 20.06.2014 | нет комментариев

В то время как область разработки софта растет, мы разработчики непрерывно пытаемся ухватиться за новейшие спецтехнологии. К счастью, ремесло написания поддерживаемого кода языко-самостоятельно и в этой серии постов мы сфокусируемся на сильном комплекте нерушимых инструментов: паттернах проектирования.

Я настроятельно рекомендую книгу Russ Olsen — Design Patterns in Ruby. Наш цикл постов будет черпать воодушевление оттуда и будет чем-то как бы короткой выжимки. Таким образом, если вам понравится то что вы читаете (а я верю на это!), книга будет хорошим продолжением.

Мы разглядим разные паттерны проектирования и обучимся их использовать. Сегодняшняя тема — Шаблоный способ, примитивный паттерн проектирования.

1-й день стройки

Положительные инструменты

Просто говоря, паттерны проектирования это инструменты, которые потомогают нам конструировать софт. Тем не менее, так же как и всякие инструменты, мы обязаны уметь предпочесть верный для всякой определенной задачи. Мы безусловно можем забивать шуруп молотком, но скорее каждого повредим доски, применение шуруповерта будет больше целесообразно. Раньше чем применять один из бесчисленных образцов проектирования, дюже значимо вникнуть в загвоздку, которую вы пытаетесь решить.

Неправильным является применение паттерна проектирования для решения задачи для которой он не предуготовлен. Другими словами, считается дурным тоном применение паттерна для задачи, которая для решения не требует вышеупомянутого паттерна проектирования.

Давайте-ка возведем несколько стен

Сегодня наш прораб сказал нам возвести несколько стен. Все стены идентичных размеров и сделаны из одного материала (для данного конструкторского плана прораб дал нам дюже примитивный комплект требований).

# Чертежи стены (Wall)
require 'minitest/autorun'

describe Wall do
  let(:wall) { Wall.new }

  it 'should state its dimensions' do
    wall.dimensions.must_equal 'I am 30ft. long and 20ft. wide!'
  end

  it 'should be made from brick' do
    wall.made_from.must_equal 'I am made from brick!'
  end
end

Какой отличный руководитель, он дал нам чертежи! Сейчас дело за малым, давайте возведем стену:

class Wall
  def dimensions
    'I am 30ft. long and 20ft. wide!'
  end

  def made_from
    'I am made from brick!'
  end
end

Отменно! Наши тесты проходят, все радостны и мы наконец идём кушать!

Молоток либо Гвоздомет?

Когда мы возвратились, прораб сказал что нам необходимо огромнее стен. “Вот жеж торта кусок”, сказали мы, припоминая как легко было строить стену (Wall).

“Не так стремительно, ребятки”, поторопился возразить прораб. У нас есть новые чертежи с новыми требованиями к стенам.

# Чертежи кирпичной стены (BrickWall)
describe BrickWall do
  let(:brick_wall) { BrickWall.new }

  it 'should state its dimensions' do
    brick_wall.dimensions.must_equal 'I am 30ft. long and 20ft. wide!'
  end

  it 'should be made from brick' do
    brick_wall.made_from.must_equal 'I am made from brick!'
  end
end

# Чертежи бетонной стены (ConcreteWall)
describe ConcreteWall do
  let(:concrete_wall) { ConcreteWall.new }

  it 'should state its dimensions' do
    concrete_wall.dimensions.must_equal 'I am 30ft. long and 20ft. wide!'
  end

  it 'should be made from concrete' do
    concrete_wall.made_from.must_equal 'I am made from concrete!'
  end
end

# Чертежи деревянной стены (WoodWall)
describe WoodWall do
  let(:wood_wall) { WoodWall.new }

  it 'should state its dimensions' do
    wood_wall.dimensions.must_equal 'I am 10ft. long and 20ft. wide!'
  end

  it 'should be made from wood' do
    wood_wall.made_from.must_equal 'I am made from wood!'
  end
end

Хм… Несколько идей промелькнуло у нас в головах. Мы можем следовать тезисам класса стены (Wall) и определить всякий способ с захардкодженной выходной строкой для классов BrickWallConcreteWall иWoodWall. Схоже идейка то недурная, но мы обязаны будем хардкодить всякий инстансный способ. Что если для дома необходима будет дюжина различных т

 

Источник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB