Элегантный способ передачи данных в обработчик событий?

У нас есть веб-приложение на 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);
}

.. это кажется слишком запутанным, хотя.

Как я могу централизовать обработку параметров в сообщениях уведомлений, учитывая, что мне иногда понадобятся данные, относящиеся к событию, вызывающему уведомление?

0 ответов

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