Я использую php
для создания страницы USSD. Я уже делал это раньше, и это была довольно сложная работа с ограниченными возможностями; в основном один огромный файл с оператором switch для всех возможных состояний, в которых может находиться пользователь сотового телефона (который затем сохраняется в БД и извлекается при следующем запросе USSD) – сортировка состояний.
На этот раз у меня есть немного больше времени и хотелось бы использовать что-то более профессиональное . Существуют ли какие-либо шаблоны проектирования или лучшие практики, которые я могу использовать для такого рода сценариев?
Хорошо, поэтому поиск чего-то специфичного 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()) ]);
Это ограниченное решение, характерное для моего прецедента, я считаю, что его можно расширить, чтобы обслуживать другие ситуации. Я хотел бы услышать, как все остальные решают эту проблему