Общекомандный шаблон и шаблон Отправки Команды в Python

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

Позволяют нам принять, у Вас есть сетка с фиксированным шагом 256x256 системы в каждой плоскости и 16 плоскостях во вселенной. Каждая плоскость имеет до 512 торговых станций и до 8 ссылок на другие плоскости. Все торговые станции и ссылки находятся на фиксированной позиции. Ваше начальное значение семени должно быть, по крайней мере, 2^76 для кодирования всех возможных вселенных. Добавьте еще некоторые объекты (планеты, поставки...), и число растет экспоненциально.

Редактирование: это немного меньше, если Вы не позволяете больше чем одну торговую станцию или ссылку в каждой системе. Я использовал бы некоторое постоянное хранение, возможно, встроенная база данных как Firebird или sqlite. Случайно я в настоящее время разрабатываю такую игру.

23
задан legesh 29 September 2009 в 19:23
поделиться

4 ответа

Простейший шаблон команды уже встроен в Python, просто используйте вызываемый:

def greet(who):
    print "Hello %s" % who

greet_command = lambda: greet("World")
# pass the callable around, and invoke it later
greet_command()

Шаблон команды как шаблон объектно-ориентированного проектирования имеет больше смысла, если ваши команды должны иметь возможность делать больше чем просто быть вызванным. Обычный вариант использования - это когда вам нужно иметь возможность отменить / повторить свои действия. Тогда командный класс - хороший способ объединить действия вперед и назад. Например:

class MoveFileCommand(object):
    def __init__(self, src, dest):
        self.src = src
        self.dest = dest
        os.rename(self.src, self.dest)
    def undo(self):
        os.rename(self.dest, self.src)

undo_stack = []
undo_stack.append(MoveFileCommand('foo.txt', 'bar.txt'))
undo_stack.append(MoveFileCommand('bar.txt', 'baz.txt'))
# foo.txt is now renamed to baz.txt
undo_stack.pop().undo() # Now it's bar.txt
undo_stack.pop().undo() # and back to foo.txt
57
ответ дан 29 November 2019 в 01:01
поделиться

Провел поиск и нашел это . Похоже, он выполняет свою работу по инкапсуляции действия.

def demo(a,b,c):
    print 'a:',a
    print 'b:',b
    print 'c:',c

class Command:
    def __init__(self, cmd, *args):
        self._cmd=cmd
        self._args=args

    def __call__(self, *args):
       return apply(self._cmd, self._args+args)


cmd=Command(dir,__builtins__)
print cmd()

cmd=Command(demo,1,2)
cmd(3)
4
ответ дан 29 November 2019 в 01:01
поделиться

Да, вы кое-что упускаете: шаблон команды необходим только в языках, которые не имеют указателей на функции (или функций как объекты первого класса), например Java. В языках с функциями-как-объектами вы можете использовать саму функцию; нет необходимости иметь отдельный командный объект (который тогда должен иметь метод doit).

В примере, который вы могли бы процитировать, вызов getattr () дает вам «командный объект» (т.е. связанный метод); добавление скобок после "вызова" (т.е. вызова) объекта команды.

3
ответ дан 29 November 2019 в 01:01
поделиться

Если я правильно помню группу из четырех человек, шаблон команды касается таких команд, как «Файл - Сохранить», а не таких команд, как «svn commit», для чего подходит ваш код.

Мартин предполагает, что шаблон Command не нужен, потому что его место занимают функции как объекты первого класса, но шаблон Command богаче, чем просто doit () , например, также undo () , is_enabled () и т. Д.

3
ответ дан 29 November 2019 в 01:01
поделиться
Другие вопросы по тегам:

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