怎样优雅地解决项目中可能存在的很多的if/else,从设计代码的角度 ,与语言无关?
如果是使用面向对象编程语言,使用了存在类似spring容器作用的框架(可通过一个字符串beanId找到其定义在xml文中实现类),就可以大展身手了。
首先要建模、抽象并拆分业务。存在很多if/else,多数情况下,肯定是很多种业务类型处理糅合在一起了,且很可能会经常新增新的业务处理,每当这时候,就不得不再加个else if(type == "xigua")等等的写法来添加新的业务代码逻辑,这样只会使代码愈加臃肿而你又无计可施。
具体简单的例子: public void haveBreakfast(String type)\t{\t\tif (type == "apple")\t\t{\t\t\t...\t\t}\t\telse if (type = "banana")\t\t{\t\t\t...\t\t}\t\telse if (type = "orange")\t\t{\t\t\t...\t\t}\t\telse if \t\t...\t}这时候即可将待重构的业务抽象为“根据type的不同去进行不同的吃水果的动作”。此时我们可以创建一个EatService接口,带有eatFruit方法,就像这样:public interface EatService{ public void eatFruit();} 【怎样优雅地解决项目中可能存在的很多的if/else,从设计代码的角度 ,与语言无关?】 然后将代码重构为面向接口编程,通过type找到EatService接口的具体实现类,进行eatFruit处理。public static void haveBreakfast(String type){ // 根据beanid到spring容器中找到具体实现类的实例 EatService eatService = getServiceByBeanid("eatFruit_" + type); eatService.eatFruit();}你看到的没错,重构之后就只有2行代码了,其它代码都按照业务类型(type)抽取到单独的处理类的eatfruit方法中,互不影响。beanid="eatFruit_apple" class=".../.../.../AppleEater"beanid="eatFruit_banana" class=".../.../.../BananaEater"beanid="eatFruit_orange" class=".../.../.../OrangeEater"...此时,我们假设需要新增一个特性业务type == "xigua"的时候,就不必修改任何原有代码,仅仅需要创建并在xml中注册一个beanid为"eatFruit_xigua"的实现类XiguaEater(要实现EatService接口),将业务逻辑放在其eatFruit方法中即可。
经过简单的重构后,好处巨大:
增强了代码的清晰性、易读性。从一团乱麻到井井有条,很明显。增强了代码的可维护性。在修改或新增特性业务时不用每次都来改haveBreakfast里面的逻辑。只需要改动其具体特性相关的那一小部分代码,降低维护成本、出错概率。增强了代码的扩展性。重构后的代码符合“开闭原则”。新增加业务特性时不需要对老代码做任何修改,优雅。
■网友
谢邀
有一本书叫做《设计模式》里面讲述了许多使代码更加优雅的思路
原本可能不好读,《Head First 设计模式》可能更加友善一些
《重构》也挺好的,但是也挺难读的,反正我读了几次都没看完
关于条件分支多的情况,如果是从上到下的多次审查可以将每次判断做成一个对象对象之间使用链式结构连接起来就像 Java Web 的 filter 那样设计
如果是层层嵌套的形式可以使用 RxJava 那样的设计将条件分歧处理扁平化
方法有各种各样针对不同的业务才能找到最合适的
■网友
楼上有几个答案都不错,我补充一点:对于平铺的if/else,除了可以用接口和多个实现类代替之外,如果你用的编程语言是Python/C#/http://VB.NET/C/C++/JavaScript之一(可惜没有Java)的话,还有一种办法就是用哈希表做一个从字符串到目标函数的映射,比如Python:
call_dict = {"orange" : handle_orange, "apple" : handle_apple, "banana" : handle_banana}
call_dict()
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 蟹爪兰叶子软塌,难复花,“根源”在这里,解决后开花一茬接一茬
- 贵州在建骨干水源工程达到465座有效解决工程性区域性缺水问题
- 长春社区开设助老餐厅探索解决老人“吃饭难”
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
