यह निश्चित नहीं है कि साइक्लोमैटिक जटिलता को कम करने के लिए इस पद्धति के बारे में कैसे जाना जाए। सोनार की रिपोर्ट 13 जबकि 10 की उम्मीद है। मुझे यकीन है कि इस पद्धति को छोड़ने में कोई बुराई नहीं है, हालांकि, यह सिर्फ मुझे चुनौती दे रहा है कि सोनार के शासन का पालन कैसे किया जाए। किसी भी विचार की बहुत सराहना की जाएगी।
public static long parseTimeValue(String sValue) {
if (sValue == null) {
return 0;
}
try {
long millis;
if (sValue.endsWith("S")) {
millis = new ExtractSecond(sValue).invoke();
} else if (sValue.endsWith("ms")) {
millis = new ExtractMillisecond(sValue).invoke();
} else if (sValue.endsWith("s")) {
millis = new ExtractInSecond(sValue).invoke();
} else if (sValue.endsWith("m")) {
millis = new ExtractInMinute(sValue).invoke();
} else if (sValue.endsWith("H") || sValue.endsWith("h")) {
millis = new ExtractHour(sValue).invoke();
} else if (sValue.endsWith("d")) {
millis = new ExtractDay(sValue).invoke();
} else if (sValue.endsWith("w")) {
millis = new ExtractWeek(sValue).invoke();
} else {
millis = Long.parseLong(sValue);
}
return millis;
} catch (NumberFormatException e) {
LOGGER.warn("Number format exception", e);
}
return 0;
}
सभी एक्सट्रैक्टएक्सएक्सएक्स तरीकों को static
आंतरिक वर्गों के रूप में परिभाषित किया गया है । उदाहरण के लिए, जैसे नीचे एक -
private static class ExtractHour {
private String sValue;
public ExtractHour(String sValue) {
this.sValue = sValue;
}
public long invoke() {
long millis;
millis = (long) (Double.parseDouble(sValue.substring(0, sValue.length() - 1)) * 60 * 60 * 1000);
return millis;
}
}
अद्यतन १
मैं सोनार आदमी को संतुष्ट करने के लिए यहां सुझावों के मिश्रण के साथ बसने जा रहा हूं। निश्चित रूप से सुधार और सरलीकरण के लिए जगह।
अमरूद Function
यहाँ एक अवांछित समारोह है। वर्तमान स्थिति के बारे में प्रश्न को अद्यतन करना चाहता था। यहां कुछ भी अंतिम नहीं है। कृपया अपने विचार डालें ..
public class DurationParse {
private static final Logger LOGGER = LoggerFactory.getLogger(DurationParse.class);
private static final Map<String, Function<String, Long>> MULTIPLIERS;
private static final Pattern STRING_REGEX = Pattern.compile("^(\\d+)\\s*(\\w+)");
static {
MULTIPLIERS = new HashMap<>(7);
MULTIPLIERS.put("S", new Function<String, Long>() {
@Nullable
@Override
public Long apply(@Nullable String input) {
return new ExtractSecond(input).invoke();
}
});
MULTIPLIERS.put("s", new Function<String, Long>() {
@Nullable
@Override
public Long apply(@Nullable String input) {
return new ExtractInSecond(input).invoke();
}
});
MULTIPLIERS.put("ms", new Function<String, Long>() {
@Nullable
@Override
public Long apply(@Nullable String input) {
return new ExtractMillisecond(input).invoke();
}
});
MULTIPLIERS.put("m", new Function<String, Long>() {
@Nullable
@Override
public Long apply(@Nullable String input) {
return new ExtractInMinute(input).invoke();
}
});
MULTIPLIERS.put("H", new Function<String, Long>() {
@Nullable
@Override
public Long apply(@Nullable String input) {
return new ExtractHour(input).invoke();
}
});
MULTIPLIERS.put("d", new Function<String, Long>() {
@Nullable
@Override
public Long apply(@Nullable String input) {
return new ExtractDay(input).invoke();
}
});
MULTIPLIERS.put("w", new Function<String, Long>() {
@Nullable
@Override
public Long apply(@Nullable String input) {
return new ExtractWeek(input).invoke();
}
});
}
public static long parseTimeValue(String sValue) {
if (isNullOrEmpty(sValue)) {
return 0;
}
Matcher matcher = STRING_REGEX.matcher(sValue.trim());
if (!matcher.matches()) {
LOGGER.warn(String.format("%s is invalid duration, assuming 0ms", sValue));
return 0;
}
if (MULTIPLIERS.get(matcher.group(2)) == null) {
LOGGER.warn(String.format("%s is invalid configuration, assuming 0ms", sValue));
return 0;
}
return MULTIPLIERS.get(matcher.group(2)).apply(matcher.group(1));
}
private static class ExtractSecond {
private String sValue;
public ExtractSecond(String sValue) {
this.sValue = sValue;
}
public long invoke() {
long millis;
millis = Long.parseLong(sValue);
return millis;
}
}
private static class ExtractMillisecond {
private String sValue;
public ExtractMillisecond(String sValue) {
this.sValue = sValue;
}
public long invoke() {
long millis;
millis = (long) (Double.parseDouble(sValue));
return millis;
}
}
private static class ExtractInSecond {
private String sValue;
public ExtractInSecond(String sValue) {
this.sValue = sValue;
}
public long invoke() {
long millis;
millis = (long) (Double.parseDouble(sValue) * 1000);
return millis;
}
}
private static class ExtractInMinute {
private String sValue;
public ExtractInMinute(String sValue) {
this.sValue = sValue;
}
public long invoke() {
long millis;
millis = (long) (Double.parseDouble(sValue) * 60 * 1000);
return millis;
}
}
private static class ExtractHour {
private String sValue;
public ExtractHour(String sValue) {
this.sValue = sValue;
}
public long invoke() {
long millis;
millis = (long) (Double.parseDouble(sValue) * 60 * 60 * 1000);
return millis;
}
}
private static class ExtractDay {
private String sValue;
public ExtractDay(String sValue) {
this.sValue = sValue;
}
public long invoke() {
long millis;
millis = (long) (Double.parseDouble(sValue) * 24 * 60 * 60 * 1000);
return millis;
}
}
private static class ExtractWeek {
private String sValue;
public ExtractWeek(String sValue) {
this.sValue = sValue;
}
public long invoke() {
long millis;
millis = (long) (Double.parseDouble(sValue) * 7 * 24 * 60 * 60 * 1000);
return millis;
}
}
}
अद्यतन २
हालाँकि मैंने अपना अपडेट जोड़ा है, यह केवल उस समय के लायक है। मैं आगे बढ़ने जा रही हूं क्योंकि सोनार अब शिकायत नहीं करती। ज्यादा चिंता मत करो और मैं मैट्नज़ उत्तर को स्वीकार कर रहा हूं क्योंकि यह जाने का रास्ता है और इस प्रश्न पर धक्के खाने वालों के लिए एक बुरा उदाहरण स्थापित नहीं करना चाहता। निचला रेखा - सोनार (या हाफ बेक्ड प्रोजेक्ट मैनेजर) की खातिर इंजीनियर से सीसी के बारे में शिकायत नहीं करते। बस क्या परियोजना के लिए एक पैसा लायक है। सभी को धन्यवाद।
ExtractBlah
कक्षाएं कैसे परिभाषित की जाती हैं? ये कुछ लाइब्रेरी या होमब्रे से हैं?
private static Dictionary<string,Func<string,long>> _mappingStringToParser;
मैं आपके लिए एक अभ्यास के रूप में आराम को छोड़ दूंगा (या अभी की तुलना में अधिक खाली समय के साथ कोई व्यक्ति)। वहाँ एक क्लीनर एपीआई पाया जा सकता है अगर आप monadic parsers के साथ कोई परिचित है, लेकिन मैं अभी वहाँ नहीं जाऊँगा ..