Предложение шаблона дизайна для 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())
]);
Это ограниченное решение, характерное для моего варианта использования, я считаю, что оно может быть расширено для удовлетворения других ситуаций. Я хотел бы услышать, как все остальные решают эту проблему