সাইক্লোমেটিক জটিলতা কমাতে এই পদ্ধতিটি কীভাবে করবেন তা নিশ্চিত নন। সোনার ১৩ টি রিপোর্ট করেছে এবং 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;
}
}
আপডেট 1
আমি সোনার লোককে সন্তুষ্ট করতে এখানে পরামর্শের মিশ্রণ নিয়ে বসতি স্থাপন করব। অবশ্যই উন্নতি এবং সরলীকরণের জন্য জায়গা।
পেয়ারা Function
এখানে কেবল একটি অযাচিত অনুষ্ঠান। বর্তমান অবস্থা সম্পর্কে প্রশ্ন আপডেট করতে চেয়েছিলেন। এখানে কিছুই চূড়ান্ত নয়। আপনার চিন্তা Pালা দয়া করে ..
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;
}
}
}
আপডেট 2
যদিও আমি আমার আপডেট যুক্ত করেছি, তবে এটি কেবল সময়ের মূল্য মাত্র। সোনার এখন যেহেতু অভিযোগ করে না সেহেতু আমি এগিয়ে যাচ্ছি। খুব বেশি চিন্তা করবেন না এবং আমি ম্যাটঞ্জ উত্তরটি গ্রহণ করি কারণ এটি যাওয়ার উপায় এবং যারা এই প্রশ্নটির দিকে ঝাঁপিয়ে পড়ে তাদের পক্ষে কোনও খারাপ উদাহরণ স্থাপন করতে চাই না। নীচের লাইন - সোনার (বা হাফ বেকড প্রজেক্ট ম্যানেজার) স্বার্থের জন্য ওভার ইঞ্জিনিয়ারকে সিসির বিরুদ্ধে অভিযোগ করবেন না। প্রকল্পের জন্য কেবল এক পয়সা মূল্যবান জিনিসই করুন। সবাইকে ধন্যবাদ.
ExtractBlah
ক্লাসগুলি কীভাবে সংজ্ঞায়িত করা হয়? এগুলি কিছু লাইব্রেরি বা হোমব্রু থেকে এসেছে?
private static Dictionary<string,Func<string,long>> _mappingStringToParser;
আমি আপনার জন্য ব্যায়াম হিসাবে বাকীটি ছেড়ে দেব (বা এই মুহুর্তে আমার চেয়ে বেশি সময় ব্যয়কারী)। মোনাডিক পার্সারগুলির সাথে আপনার কোনও পরিচিতি থাকলে সেখানে একটি ক্লিনার এপিআই পাওয়া যাবে তবে আমি এখনই সেখানে যাব না