Какой шаблон проектирования подходит лучше всего, чтобы избежать нескольких параметров в методе - PullRequest
0 голосов
/ 24 января 2020

У меня есть следующий класс:

public class SomeAssebler {

    private EnrichedRequest assembleBasicEnrichedRequest(BasicRequest request) {
        EnrichedRequest enrichedRequest = new EnrichedRequest();
        if (request != null) {
            enrichedRequest.setId(request.getId());
            enrichedRequest.setDate(request.getDate());
            enrichedRequest.setParam(request.getParam());
        }
        return enrichedRequest;
    }

    private static EnrichedRequest assembleGeoDataEnrichedRequest(EnrichedRequest request, GeoData geoData) {
        EnrichedRequest geoEnrichedRequest = Optional.ofNullable(request).orElse(new EnrichedRequest());
        if (geoData != null) {
            geoEnrichedRequest.setCity(geoData.getCity());
            geoEnrichedRequest.setCountryCode(geoData.getCountryCode());
        }
        return geoEnrichedRequest;
    }

    private static EnrichedRequest assembleUserAgentEnrichedRequest(EnrichedRequest request, UserAgentData userAgentData) {
        EnrichedRequest userAgentEnrichedRequest = Optional.ofNullable(request).orElse(new EnrichedRequest());
        if (userAgentData != null) {
            userAgentEnrichedRequest.setBrowser(userAgentData.getBrowserCode());
            userAgentEnrichedRequest.setOperatingSystem(userAgentData.getOsCode());
            userAgentEnrichedRequest.setManufacturer(userAgentData.getBrand());
        }
    }

    public static EnrichedRequest assembleEnrichedRequest(BasicRequest request, GeoData geoData, UserAgentData userAgentData) {
        EnrichedRequest enrichedRequest = assembleBasicEnrichedRequest(request);
        enrichedRequest = assembleGeoDataEnrichedRequest(enrichedRequest, geoData);
        enrichedRequest = assembleUserAgentEnrichedRequest(enrichedRequest, userAgentData);
        return enrichedRequest;
    }
}

Затем вызывается в разных преобразователях: В GeoDataTransformer

new KeyValue<>(key, assembleEnrichedRequest(basicRequest, geoData, null))

В UserAgentTransformer:

new KeyValue<>(key, assembleEnrichedRequest(enrichedRequest, null, userAgent))

Если в будущем будет добавлено больше «обогащений», это может стать очень уродливым. У кого-нибудь есть идея, как я могу разработать это лучше? Я думаю о шаблоне проектирования Builder, но не уверен.

1 Ответ

0 голосов
/ 24 января 2020

Вы можете использовать Builder Pattern, но вам нужно внести пару изменений в ваш код.

Вы можете проверить по этой ссылке , которая объясняет, как вы будете использовать шаблон построителя и что он решает. Вы можете попробовать что-то в этом роде. Существует множество способов создания класса Builder.

public static class EnrichedRequestBuilder() {
    private EnrichedRequest enrichedRequest:
    private BasicRequest basicRequest:
    private GeoData geoData;
    private UserAgentData userAgentData;

    public EnrichedRequestBuilder enrichedRequest(EnrichedRequest e) {
        this.enrichedRequest = e;
        return this;
    }

    public EnrichedRequestBuilder basicRequest(BasicRequest e) {
        this.basicRequest = e;
        return this;
    }

    public EnrichedRequestBuilder build() {
        return new EnrichedRequestBuilder(this);
    }


}

new EnrichedRequestBuilder().basicRequest(b).enrichedRequest(e).build();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...