私は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