Справка по дизайну: настраиваемое поведение на основе ввода - PullRequest
0 голосов
/ 24 марта 2011

Я работаю в Python, но это общий вопрос дизайна, поэтому приветствуются общие ответы. Я объясню контекст не как часть вопроса, а как пример:

У меня есть скрипт, который получает файл CSV, он использует поля в этом файле для автоматических телефонных звонков. Поля представляют имена, которые нужно произнести, даты, которые нужно произнести, и номера телефонов, по которым нужно позвонить. Например, введите «555-555-4321, Боб, Джилл, 3/30/2011», можно позвонить по номеру 555-555-4321 и доставить роботизированное сообщение «Боб, не забудьте, что день рождения Джиллс в следующую среду, через неделю. "

Мой вопрос: какие шаблоны проектирования будут полезны для настройки этой системы? Более конкретно, я хотел бы указать, какой формат используют строки ввода, и некоторые способы генерации голосового сообщения. Некоторые поля, такие как «Боб», могут быть такими же простыми, как «говорить на поле». Другие поля, такие как дата, требуют некоторого преобразования для того, чтобы о них говорили (например, как «30.03.2011» становится «следующей средой»). Я также хотел бы иметь различные форматы строк, например, ввод, такой как «555-555-4321, Боб, 6: 00», может звонить Бобу каждый день в 6:00 и говорить «проснись!»

Моя цель - иметь веб-интерфейс, который позволяет определять и настраивать эти типы вещей. Я знаю, как решить эти проблемы, взломав мой исходный код, но взлом исходного кода далек от простого и удобного интерфейса.

1 Ответ

1 голос
/ 24 марта 2011

Я сейчас решаю связанную, но не идентичную проблему.

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

Итак, для вашего примера "555-555-4321, Боб, Джилл, 3/30/2011",

import csv
def phoneNumber(number):
    ...
def userName(name):
    ...
def targetDate(datestring):
    ...
control = [phoneNumber, userName, userName, targetDate]
with open("csvFile", "r") as inFile:
    reader = csv.reader(inFile)
    for row in reader:
        for op, item in zip(control, row):
            op(item)

Я отмечаю, что это работает только в том случае, если файл CSV имеет постоянную интерпретацию для каждого элемента, но если он имеет интерпретацию вариантов, тогда файл CSV является неправильным методом хранения. Я также отмечаю, что вам понадобится какой-то другой объект управления для генерации остальной части предложения; это оставлено в качестве упражнения для читателя. :)

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

edit: И, принимая к сведению ваше приложение об использовании веб-интерфейса для настройки, это будет простой способ предоставить новый контрольный список.

...