我有一个简单的
java方法,它根据从RGB转换的HSB值返回颜色.它工作(需要一些调整),但我使用一系列其他if和嵌套if语句来返回我想要的数据.我听说过HashMaps和String Factories更好,但我看不出它们如何使用远程数据.是否有更好的解决方案适用于这样的远程数据?
片段:
public static String getColorName() { getHSB(rgb); if(hsbH >= 45 && hsbH < 75) { if(hsbS > 0 && hsbS < 45 && hsbB > 70){ return "White/Off White"; } else if(hsbS > 0 && hsbS < 45 && hsbB < 10) { return "Dark Yellow"; } else { return "Yellow"; } } else if(hsbH >= 15 && hsbH < 45) { if(hsbS > 0 && hsbS < 45 && hsbB > 70){ return "White/Off White"; } else if(hsbS > 0 && hsbS < 45 && hsbB < 10) { return "Dark Orange"; } else { return "Orange"; } ...
解决方法
仔细看,代码中有很多重复和非常明显的结构!这是我提出的,据我所知,大部分工作是在我最喜欢的IDE中使用自动重构完成的:
public static String getColorName() { getHSB(rgb); if (hsbH < 15) return colorName(hsbB,hsbS,"Red"); if (hsbH < 45) return colorName(hsbB,"Orange"); if (hsbH < 75) return colorName(hsbB,"Yellow"); //... } private static String colorName(int hsbB,int hsbS,String color) { final boolean smallSaturation = hsbS > 0 && hsbS < 45; if (smallSaturation) { if (hsbB > 70) return "White/Off White"; if (hsbB < 10) return "Dark " + color; } return color; }
如果你使用Sean Patrick Floyd的使用TreeMap的建议,这段代码会更简单(我可以帮助自己):
public static String getColorName(final int hsbH,final int hsbB,final int hsbS) { NavigableMap<Integer,String> colorRanges = new TreeMap<Integer,String>(); colorRanges.put(0,"Red"); colorRanges.put(15,"Orange"); colorRanges.put(75,"Yellow"); //... return colorName(hsbB,colorRanges.floorEntry(hsbH).getValue()); }
请注意,colorRanges范围应定义一次并重复使用.
冒险在这里被投票是一个很好的方式,你可以使用Scala和简单的DSL写字面:
implicit def toIntBetween(x: Int) = new { def between(left: Int) = new { def and(right: Int) = { x >= left && x < right } } } def getColorName = { if(hsbH between 45 and 75) { //... } }
如果(hsbH介于45和75之间)构造实际转换为:
if(toIntBetween(hsbH).between(45).and(75))