Как рефакторить класс в Java

Мне дали задание улучшить класс который указан в этом сообщении соответственно не поломать его функционал. Пока не понимаю как это сделать. Подскажите как можно улучшить данный класс? Я нашел пару тем в которых вроде можно как-то переписать switch-case операторы но пока не понимаю как это сделать. Возможно что-то можно вынести из данного класса. Вообщем буду рад если будут какие-то подсказки в этом плане и очень благодарен если будут примеры.

@Slf4j
public class MessageConverter {

private static final String SID = "SID";
private static final String FRE = "FRE";
private static final String TPL = "TPL";

private static final String DYNAMIC = "DYNAMIC";

private static final String DEFAULT_COUNTRY = "00000";

private static final int ANY_COUNTRY_MCC = 900;

private CountryMcc countryMcc;

public MessageConverter() {
    this.countryMcc = new CountryMcc();
}

public String buildEventCode(DeadLetterMessage deadLetterMessage) {

    switch (deadLetterMessage.getType()) {
        case "MMS":
        case "SMS":
        case "VOICE":
            return buildEventCode(
                    deadLetterMessage.getDirection(),
                    getSenderIdType(deadLetterMessage),
                    getServiceType(deadLetterMessage.getType()),
                    deadLetterMessage.getShortcodeType());
        case "VIBER":
        case "WECHAT":
        case "LINE":
        case "FACEBOOK":
        case "RCS":
            return buildEventCode(
                    deadLetterMessage.getDirection(),
                    getServiceType(deadLetterMessage.getType()));
        case "WHATSAPP": {
            if (TemplateBodyParser.checkBodyIsGwTemplate(deadLetterMessage.getBody())) {
                return buildTmplEventCode(
                        deadLetterMessage.getDirection(),
                        getServiceType(deadLetterMessage.getType()));
            }
            return buildEventCode(
                    deadLetterMessage.getDirection(),
                    getServiceType(deadLetterMessage.getType()));
        }
        case "PSH":
            return buildEventCode(
                    deadLetterMessage.getDirection(),
                    deadLetterMessage.getMsgDeliveryProvider(),
                    getServiceType(deadLetterMessage.getType()));
    }
    throw new RuntimeException(
            "Unexpected message type: " + deadLetterMessage.getType());
}

private String buildEventCode(String direction,
                              String senderIdType,
                              String serviceType,
                              String shortcodeAddressType) {

    String result = String.format("%s-%s-%s", getServiceType(serviceType)
            , direction, senderIdType);
    result = processFTEUCode(result, shortcodeAddressType);
    return result;
}

private String buildEventCode(
        String direction,
        String serviceType) {

    return String.format("%s-%s-%s", getServiceType(serviceType), direction, SID);
}

private String buildTmplEventCode(
        String direction,
        String serviceType) {

    return String.format("%s-%s-%s", getServiceType(serviceType), direction, TPL);
}

private String buildEventCode(
        String direction,
        String pushProvider,
        String serviceType) {

    return String.format("%s-%s-%s", getServiceType(serviceType), direction, getPushProvider(pushProvider));
}

private String getServiceType(String messageType) {
    switch (messageType) {
        case "SMS":
            return "SMS";
        case "MMS":
            return "MMS";
        case "PSH":
            return "PSH";
        case "FACEBOOK":
            return "FB";
        case "VOICE":
            return "VOC";
        case "VIBER":
            return "VIB";
        case "WECHAT":
            return "WCT";
        case "LINE":
            return "LIN";
        case "WHATSAPP":
            return "WAP";
        case "RCS":
            return "RCS";
    }
    throw new RuntimeException("Unexpected message type: " + messageType);
}

public String getSenderIdType(DeadLetterMessage deadLetterMessage) {
    switch (deadLetterMessage.getTypeId()) {
        case "PUSH":
            return "PCH";
        case "FACEBOOK":
            return "FB";
        case "WECHAT":
            return "WCT";
        case "LINE":
            return "LINE";
        case "WHATSAPP":
            return "WHB";
        case "RCS":
            return "RCS";
        case "LONGCODE":
        case "SHORTCODE":
            return getSenderIdNumberType(deadLetterMessage);
        case "TOLLFREE":
            return "TFN";

    }
    throw new RuntimeException(
            "Unexpected SenderId type: " + deadLetterMessage.getTypeId());
}

private String getSenderIdNumberType(DeadLetterMessage senderId) {
    return String.format("%C%CC", getOwnership(senderId), getAddressType(senderId));
}

private String processFTEUCode(String eventCode, String scType) {
    if (scType.equals("FTEU")) {
        if (eventCode.startsWith("SMS-MT") || eventCode.startsWith("SMS-MO")
                || eventCode.startsWith("SMS-ML") || eventCode.startsWith("SMS-SC")) {
            return eventCode.replace(eventCode.substring(eventCode.lastIndexOf("-") + 1), FRE);
        } else if (eventCode.startsWith("MMS-MT")) {
            return "SMS-MT-FRE";
        } else if (eventCode.startsWith("MMS-MO")) {
            return "SMS-MO-FRE";
        }
    }
    return eventCode;
}

private char getOwnership(DeadLetterMessage deadLetterMessage) {
    if (deadLetterMessage.getAddress().equals(DYNAMIC)) {
        return 'D';
    }
    switch (deadLetterMessage.getOwnership()) {
        case "PRIVATE":
            return 'P';
        case "SHARED":
            return 'S';
    }
    throw new RuntimeException("Unexpected SenderId ownership: "
            + deadLetterMessage.getOwnership());
}

private char getAddressType(DeadLetterMessage senderId) {
    switch (senderId.getTypeId()) {
        case "SHORTCODE":
            return 'S';
        case "LONGCODE":
            return 'L';
        default:
    }
    throw new RuntimeException("Unexpected SenderId address type: "
            + senderId.getTypeId());
}

private String getPushProvider(final String pushProvider) {
    if (pushProvider.equals("FCM")) {
        return "GCM";
    }
    return pushProvider;
}

public TransactionContextAddress getSenderIdAddr(final DeadLetterMessage deadLetterMessage) {
    TransactionContextAddress address = new TransactionContextAddress();
    address.setCountryPrefix(getMccString(deadLetterMessage.getCountry()));
    address.setAddress(deadLetterMessage.getMessageAddress().getClear());
    return address;
}

private String getMccString(String country) {
    return String.valueOf(country == null ? ANY_COUNTRY_MCC : countryMcc.getCountryCode(country));
}

public TransactionContextAddress getOtherPartyAddr(final DeadLetterMessage message) {
    TransactionContextAddress address = new TransactionContextAddress();
    address.setCountryPrefix((message.getDirection() == "MO"
            ? String.valueOf(ANY_COUNTRY_MCC) : getMccString(message.getDestinationCountry())));
    address.setAddress(message.getDirection() == "MT"
            ? message.getMessageToAddress().getClear() : message.getMessageFromAddress().getClear());
    return address;
}

public RatingTransactionRequestContext createTxnRequestContext(DeadLetterMessage deadLetterMessage, String apiId) {
    RatingTransactionRequestContext reqContext = new RatingTransactionRequestContext();
    reqContext.setApiId(Long.parseLong(apiId));
    reqContext.setEventTimestamp(LocalDateTime.now().toString());
    reqContext.setCompanyId(deadLetterMessage.getCompanyId());
    reqContext.setTransactionYearmonth(LocalDate.now().toString());
    reqContext.setSenderId(deadLetterMessage.getSenderId());
    reqContext.setGatewayTxnId(ThreadContext.get("int_trx_id"));
    return reqContext;
}

public TransactionContext getTransactionContext(DeadLetterMessage deadLetterMessage) {

    TransactionContext context = new TransactionContext();
    context.setSenderIdAddr(getSenderIdAddr(deadLetterMessage).serialize());
    context.setOtherPartyAddr(getOtherPartyAddr(deadLetterMessage).serialize());

    return context;
}

public String getCountryCode(DeadLetterMessage message) {
    if (message.getCountry() != null) {
        return message.getCountry();
    } else if (message.getDirection() == "MO" && message.getSenderId() != null && message.getCountry() != null) {
        return message.getCountry();
    } else if (message.getDirection() == "MT" && message.getDestinationCountry() != null) {
        return message.getDestinationCountry();
    } else {
        return DEFAULT_COUNTRY;
    }
}

public ChargeRequest buildChargeRequest(RatingTransactionRequestContext ratingTransactionRequestContext) {

    ChargeRequest request = new ChargeRequest();
    request.setApiId(ratingTransactionRequestContext.getApiId());
    request.setApplicationId(ratingTransactionRequestContext.getApplicationId());
    request.setInternalTxnId(ratingTransactionRequestContext.getIntTxnId());
    request.setBatchTxnId(ratingTransactionRequestContext.getBatchTxnId());
    request.setEventCode(ratingTransactionRequestContext.getEventCode());
    request.setEventDttm(ratingTransactionRequestContext.getEventTimestamp());
    request.setTxnContext(ratingTransactionRequestContext.getTransactionContext());
    request.setQuantity(ratingTransactionRequestContext.getQuantity());

    return request;
}

}


Ответы (1 шт):

Автор решения: Дмитрий Алексеенко
private String getServiceType(String messageType) {
    switch (messageType) {
        case "SMS":
            return "SMS";
        case "MMS":
            return "MMS";
        case "PSH":
            return "PSH";
        case "FACEBOOK":
            return "FB";
        case "VOICE":
            return "VOC";
        case "VIBER":
            return "VIB";
        case "WECHAT":
            return "WCT";
        case "LINE":
            return "LIN";
        case "WHATSAPP":
            return "WAP";
        case "RCS":
            return "RCS";
    }
    throw new RuntimeException("Unexpected message type: " + messageType);
}

Я бы заменил данный участок кода что то тип

private String getServiceType(String messageType) {
    return MessageType.getType(messageType).toString();
} 

То есть получается нам нужно будет реализовать enum в котором будут храниться необходимые нам значения.

Так же вызывает много вопросов данный участой кода

public String getCountryCode(DeadLetterMessage message) {
    if (message.getCountry() != null) {
        return message.getCountry();
    } else if (message.getDirection() == "MO" && message.getSenderId() != null && message.getCountry() != null) {
        return message.getCountry();
    } else if (message.getDirection() == "MT" && message.getDestinationCountry() != null) {
        return message.getDestinationCountry();
    } else {
        return DEFAULT_COUNTRY;
    }
}

Мы никогда не попадём сюда

else if (message.getDirection() == "MO" && message.getSenderId() != null && message.getCountry() != null) {
            return message.getCountry();
        }

Имеет задаться вопросом а нужно ли?

Так же интересно message.getDirection() == "MO" я так понимаю message.getDirection(); вернёт String, а значит лучше сделать наверно так

message.getDirection().contains(String);
→ Ссылка