isValid
메서드가 호출되는 아래 클래스가 있습니다.단일 책임 원칙을 사용하여 방법을 작성하는 방법은 무엇입니까?
isValid
메서드에서Record
개체에서 몇 가지를 추출하려고합니다. 그리고 난 그 분야의 일부를 검증하고 있습니다. 유효하다면 일부 추가 필드가있는holder
맵을 채우고 내DataHolder
빌더 클래스를 채우고 마지막으로DataHolder
클래스를 반환합니다.- 유효하지 않은 경우 null을 반환합니다.
public class ProcessValidate extends Validate { private static final Logger logger = Logger.getInstance(ProcessValidate.class); @Override public DataHolder isValid(String processName, Record record) { Map<String, String> holder = (Map<String, String>) DataUtils.extract(record, "holder"); String deviceId = (String) DataUtils.extract(record, "deviceId"); Integer payId = (Integer) DataUtils.extract(record, "payId"); Long oldTimestamp = (Long) DataUtils.extract(record, "oldTimestamp"); Long newTimestamp = (Long) DataUtils.extract(record, "newTimestamp"); String clientId = (String) DataUtils.extract(record, "clientId"); if (isValidClientIdDeviceId(processName, deviceId, clientId) && isValidPayId(processName, payId) && isValidHolder(processName, holder)) { holder.put("isClientId", (clientId == null) ? "false" : "true"); holder.put("isDeviceId", (clientId == null) ? "true" : "false"); holder.put("abc", (clientId == null) ? deviceId : clientId); holder.put("timestamp", String.valueOf(oldTimestamp)); DataHolder dataHolder = new DataHolder.Builder(record).setClientId(clientId).setDeviceId(deviceId) .setPayId(String.valueOf(payId)).setHolder(holder).setOldTimestamp(oldTimestamp) .setNewTimestamp(newTimestamp).build(); return dataHolder; } else { return null; } } private boolean isValidHolder(String processName, Map<String, String> holder) { if (MapUtils.isEmpty(holder)) { // send metrics using processName logger.logError("invalid holder is coming."); return false; } return true; } private boolean isValidpayId(String processName, Integer payId) { if (payId == null) { // send metrics using processName logger.logError("invalid payId is coming."); return false; } return true; } private boolean isValidClientIdDeviceId(String processName, String deviceId, String clientId) { if (Strings.isNullOrEmpty(clientId) && Strings.isNullOrEmpty(deviceId)) { // send metrics using processName logger.logError("invalid clientId and deviceId is coming."); return false; } return true; } }
많은 것을하고 내
isValid
방법 : 아래
내 클래스? 여러 부분으로 나눌 수 있습니까? 아니면 그 코드를 작성하는 더 좋은 방법이 있습니까?
또한 레코드가 유효하지 않은 경우 null을 반환하는 다른 else 블록에있는 코드가 마음에 들지 않습니다. 나는 그것이 훨씬 더 나은 방법으로 쓰여질 수 있다고 확신한다.
업데이트 : 내 경우
이 내가 무엇을하고 있었는지입니다. 나는 이런 식으로 호출 오전 :
Optional<DataHolder> validatedDataHolder = processValidate.isValid(processName, record);
if (!validatedDataHolder.isPresent()) {
// log error message
}
// otherwise use DataHolder here
그래서 지금은 내가 이런 식으로해야 할 의미
boolean validatedDataHolder = processValidate.isValid(processName, record);
if (!validatedDataHolder) {
// log error message
}
// now get DataHolder like this?
Optional<DataHolder> validatedDataHolder = processValidate.getDataHolder(processName, record);
"유효하지 않은 경우 null을 반환합니다." - 읽어보십시오 : http://stackoverflow.com/questions/1274792/is-returning-null-bad-design – alfasin
* working * 코드에 대해서는 codereview.stackexchange.com이 더 좋은 장소 일 수 있습니다. – GhostCat
@GhostCat 그는 코드 검토를 요구하지 않았으며, 구현과 관련된 특정 문제를 지적하고 해결 방법을 요청했습니다. 코드 검토에 게시하는 것이 좋으며 특정 프로그래밍 문제를 다루기 때문에 여기에 게시하는 것이 좋습니다. – alfasin