Как рефакторить класс в 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);