Элегантный способ передачи данных в обработчик событий?
У нас есть веб-приложение на Java, где пользователь может подписаться на получение писем об определенных событиях. Они могут предоставить сообщение, которое хотели бы получить, с параметрами, которые они могут использовать, такими как %DATE%
или же %TOTAL_DOWNLOADS%
который будет заменен соответствующими значениями.
В настоящее время код, который заменяет параметры их значениями, представляет собой код для каждого конкретного события. Например, для случая, когда другой пользователь загружает ваш файл, у нас есть такой код:
handleFileDownload(){
...
if(user.notifyOnFileDownload){
String message = user.fileDownloadNotifyMessage.replaceAll("%DATE%", user.formatDate(new Date())).replaceAll("%TOTAL_DOWNLOADS%", ...);
...
sendMessage(message);
}
}
..или для личных сообщений:
handlePersonalMessage(){
...
if(user.notifyOnPersonalMessage){
String message = user.personalMessageNotifyMessage.replaceAll("%DATE%", user.formatDate(new Date())).replaceAll("%TOTAL_DOWNLOADS%", ...)
.replaceAll("%SENDER%", sendingUser.username);
...
sendMessage(message);
}
}
Наличие кода для обработки параметров в нескольких местах действительно затрудняет добавление каких-либо новых параметров или изменение способа обработки существующих, поскольку все места, которые отправляют уведомления, должны быть обновлены. Кажется, гораздо лучше идея централизовать этот код, например:
class User{
...
handleNotificationsForEvent(EventType et){
if(!subscribedToEventType(et)) return;
String message = getMessageForEventType(et);
message = message.replaceAll("%DATE%", user.formatDate(new Date())).replaceAll("%TOTAL_DOWNLOADS%", ...);
...
sendMessage(message);
}
}
так что другой код становится:
handleFileDownload(){
...
user.handleNotificationsForEvent(EventType.FILE_DOWNLOAD);
}
handlePersonalMessage(){
...
user.handleNotificationsForEvent(EventType.PERSONAL_MESSAGE);
}
Однако многие параметры являются специфическими для события, поэтому код события должен будет либо отправить необходимые данные, либо выполнить замену этих конкретных параметров самостоятельно. Например, в личных сообщениях имя отправителя и тема личного сообщения являются двумя параметрами.
Лучшее, что я могу придумать, - это создать класс для хранения данных и заполнить необходимые поля в обработчике событий:
class EventData{
public String personalMessageSender;
public String personalMessageSubject;
public String downloadedFileName;
}
handleFileDownload(){
...
EventData ed = new EventData();
ed.downloadedFileName = fileName;
user.handleNotificationsForEvent(EventType.FILE_DOWNLOAD, ed);
}
handlePersonalMessage(){
...
EventData ed = new EventData();
ed.personalMessageSender = sender;
user.handleNotificationsForEvent(EventType.PERSONAL_MESSAGE, ed);
}
.. это кажется слишком запутанным, хотя.
Как я могу централизовать обработку параметров в сообщениях уведомлений, учитывая, что мне иногда понадобятся данные, относящиеся к событию, вызывающему уведомление?