Вопрос по ruby, oop – Шаблон проектирования Composite of Commands

3

У кого-нибудь есть хороший пример в Ruby использования Composite of Commands? Это гибрид шаблонов проектирования, о котором я упоминал в различной литературе по шаблонам проектирования, который звучит довольно мощно, но не смог найти ни одного интересного варианта использования или кода.

Хм, решение в поисках проблемы, а? ;) maerics
@maerics - основываясь на своем ответе, вы явно шутили, но на самом деле хорошо иметь «решение в поисках проблемы»;if 1) это хорошее решение и 2) вы, вероятно, столкнетесь с проблемой. Который в основном то, о чем проектируют образцы. Nathan Long
Этот блог озаглавленDesign Patterns in Ruby - Composite, Iterator, Command (Part 2) имеет код для этих шаблонов отдельно. maerics
Хорошая точка зрения. Возможно, цитата может спровоцировать некоторые инновации: «Для выявления проблем на самом деле требуется столько же творчества, сколько и для поиска решений. Есть много способов взглянуть на любую проблему, и осознание проблемы часто является первым шагом к творческому решению. Перефразируя Джона Дьюи, изобретателя десятичной системы Дьюи, правильно определенная проблема частично решена. Таким образом, начало инноваций не должно начинаться с поиска идеального решения, а скорее с поиска правильной проблемы. & Quot; Eric Steen

Ваш Ответ

2   ответа
3

Вдохновленный общей идеей ипримеры реализации шаблонов в этом блогеВот пример того, как это может выглядеть:

class CompositeCommand
  def initialize(description, command, undo)
    @description=description; @command=command; @undo=undo
    @children = []
  end
  def add_child(child); @children << child; self; end
  def execute
    @command.call() if @command && @command.is_a?(Proc)
    @children.each {|child| child.execute}
  end
  def undo
    @children.reverse.each {|child| child.undo}
    @undo.call() if @undo && @undo.is_a?(Proc)
  end
end

И пример использования с помощью приложения программы установки программного обеспечения:

class CreateFiles < CompositeCommand
  def initialize(name)
    cmd = Proc.new { puts "OK: #{name} files created" }
    undo = Proc.new { puts "OK: #{name} files removed" }
    super("Creating #{name} Files", cmd, undo)
  end
end

class SoftwareInstaller
  def initialize; @commands=[]; end
  def add_command(cmd); @commands << cmd; self; end
  def install; @commands.each(&:execute); self; end
  def uninstall; @commands.reverse.each(&:undo); self end
end

installer = SoftwareInstaller.new
installer.add_command(
  CreateFiles.new('Binary').add_child(
    CreateFiles.new('Library')).add_child(
    CreateFiles.new('Executable')))
installer.add_command(
  CreateFiles.new('Settings').add_child(
    CreateFiles.new('Configuration')).add_child(
    CreateFiles.new('Preferences')).add_child(
    CreateFiles.new('Help')))
installer.install # => Runs all commands recursively
installer.uninstall
1

Я сам пытаюсь понять эту модель и обдумываю, что можно смоделировать таким образом.

Основная идея шаблона Composite - это ситуации, когда элементы и коллекции необходимо обрабатывать, в некоторых отношениях, одинаково. Коллекции могут содержать смесь предметов и вложенных коллекций, вложенных так глубоко, как вам нравится.

Некоторые идеи у меня есть (заимствование некоторых изШаблоны проектирования в рубине а такжеРубин под микроскопом):

A filesystem

Вы можете запросить файл для его размера, и он возвращает простое значение. Вы также можете запросить папку для ее размера, и она возвращает сумму размеров своих файлов и подпапок. Подпапки, конечно, возвращают сумму своих файлов и подпапок.

Аналогично, файлы и папки можно перемещать, переименовывать, удалять, создавать резервные копии, сжимать и т. Д.

A system command

Командный объект может иметьrun метод. Этот метод может работать, выполняя любое количество подкоманд, которые имеют подкоманды и т. Д. Он может возвращать true, если все его подкоманды возвращают true, и может сообщать статистику на основе своих дочерних элементов & apos; статистика (истекшее время, измененные файлы и т. д.).

A company hierarchy

Отдельные лица, команды, подразделения и целые компании могут рассматриваться как имеющие зарплату, приносящие доход, выполняющие единицы работы и т. Д.

A military unit

В игре у солдата может быть статистика защиты и нападения, ему может быть приказано перейти в локацию, атаковать базу и т. Д. Полки и дивизии могут рассматриваться одинаково.

Weight or monetary value

Вес грузовика, полного коробок, включает вес каждой коробки. Вес каждой коробки включает вес каждого из ее предметов, их частей и т. Д.

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

GUI elements

Окно может состоять из кадров, которые состоят из кадров, которые состоят из кадров. Любой элемент может быть позиционирован, затенен, сфокусирован, скрыт и т. Д.

Expressions in a programming language

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

В качестве простого примера, первый шаг в поиске значения((4 + 8) * 2)) + 9 чтобы найти значение4 + 8.

Похожие вопросы