Предложение шаблона дизайна для ussd

Я использую php создать USSD-страницу. Я делал это раньше, и это была довольно ограниченная по времени хакерская работа; в основном один огромный файл с оператором switch для всех возможных состояний, в которых может находиться пользователь мобильного телефона (который затем сохраняется в БД и извлекается при следующем USSD-запросе) - своего рода конечный автомат.

На этот раз у меня есть немного больше времени, и я хотел бы использовать что-то более профессиональное. Есть ли какие-либо шаблоны проектирования или лучшие практики, которые я могу использовать для такого сценария?

2 ответа

Решение

Итак, поиск чего-то конкретного USSD был ошибкой. Просто заменить USSD с state machine дал мне ответы, которые я искал.

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

interface Node {
    render(),
    process(input)
}

Узлы подразделяются на узлы выбора и ввода.

выбор

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

class Selection extends Node {
    Node[] children;
    string title;
    render() {
         // create a ussd menu here appending title to 
         // menu items based on this.children
    }
    process(input) {
        // get input and select from children node
        // call its render method
    }
}

вход

Узлы ввода собирают фактические данные от пользователей (например, имена, номер ваучера и т. Д.) И выполняют обработку, например, выполняют запрос к базе данных или вызывают удаленный API, а затем представляют пользователю ответ.

class Input extends Node {
    string title;
    string instruction;
    Handler handler;

    render() {
         // show title and/or instruction to user 
    }

    process(input) {
        // validate input and then pass to this.handler
    }
}

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

interface Handler {
    handle()
}

Резольвер

Теперь с этим вы создаете класс Resolver, который обрабатывает информацию о сеансе ussd и все http-содержимое (если вы получаете запросы ussd через http). Resolver также пересекает дерево на основе пользовательского ввода, чтобы собрать ответственный узел, а затем либо вызывает его метод визуализации, либо обрабатывает метод. Ваше дерево выглядит примерно так

new Selection('Main Menu (title)', [
    new Selection('My account', [...]),
    new Input('Recharge', 'Enter voucher number', new RechargeHandler())
]);

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

Другие вопросы по тегам