论坛首页 Java企业应用论坛

用enum代替if.这个设计大家怎么看

浏览 29662 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-10-08   最后修改:2012-10-08
bubiaiyou 写道
抛出异常的爱 写道
bubiaiyou 写道
dohkoos 写道
纯粹就是没事找事,看到大家说if不好,就想着方地把if去掉,有这必要吗?有这个必要吗?

编程思想的重要一方面就是把过多的if去掉,
具有良好编程习惯的人不会频繁用到if的

哪个大仙说过的?


理论都懂,我没有说你完全不用if
不过你可以全部都用if,
适当的看情况而已,各有各的好坏,

减少了if就减少了复杂度同样功能 的 代码 就便宜了.?
0 请登录后投票
   发表时间:2012-10-08  
可读性差了不少,而且没看出有什么好处
0 请登录后投票
   发表时间:2012-10-08  
看了这么多人发表反对意见又仔细看了一遍你的代码

你用for代替了以前的if,确实是一点好处都没有,还不如把if 改成 if else,照样每次请求判断了3次

你要是想简化,可以用map,也可以用工厂方法,将不同的方法提出来做个接口
getInstance(type)返回你方法的不同调用,这样才对

你现在这个确实是没有一点优化
0 请登录后投票
   发表时间:2012-10-08  
congjl2002 写道
看了这么多人发表反对意见又仔细看了一遍你的代码

你用for代替了以前的if,确实是一点好处都没有,还不如把if 改成 if else,照样每次请求判断了3次

你要是想简化,可以用map,也可以用工厂方法,将不同的方法提出来做个接口
getInstance(type)返回你方法的不同调用,这样才对

你现在这个确实是没有一点优化



判断几次根本无所谓吧。不差那点性能。楼主这样改,好处是扩展时work方法不用修改了。符合ocp原则。
不过循环确实不优雅,比较好的作法是能够通过type生成实例,之前几位都讲了。
0 请登录后投票
   发表时间:2012-10-08  
slertname 写道

判断几次根本无所谓吧。不差那点性能。楼主这样改,好处是扩展时work方法不用修改了。符合ocp原则。
不过循环确实不优雅,比较好的作法是能够通过type生成实例,之前几位都讲了。


work不用修改的代价是修改枚举类
0 请登录后投票
   发表时间:2012-10-08  
lzxz1234 写道
slertname 写道

判断几次根本无所谓吧。不差那点性能。楼主这样改,好处是扩展时work方法不用修改了。符合ocp原则。
不过循环确实不优雅,比较好的作法是能够通过type生成实例,之前几位都讲了。


work不用修改的代价是修改枚举类

既然楼主提到重构,就要做些提高的的事情

现在改完的情况是代码可读性降低,同时并没有提升性能。判断几次是无所谓,但是如果这么想,每人请求一次多判断2次,10万人请求效果就明显了,每个部分都这样浪费机器的资源,整个系统也不会稳定
0 请登录后投票
   发表时间:2012-10-08  

   public class HandleSomething  {
	
	//Map 可以替换为你的Context
	protected void work(int entryType, long userId, Map context) {
		context.put("type", Flow.getInstance(entryType).handle(userId, context));
	}

	enum Flow {
		VIP_ENTRY_FLOW(1) {
			public int handle(long userId, Map context) {
				return 0;
			}
		},
		INDEX_ENTRY_FLOW(2) {
			public int handle(long userId, Map context) {
				return 0;
			}
		},
		OTHERS_ENTRY_FLOW(3) {
			public int handle(long userId, Map context) {
				return 0;
			}
		};

		private final int tag;

		Flow(int tag) {
			this.tag = tag;
		}

		public int getTag() {
			return tag;
		}

		public static Flow getInstance(int tag) {
			try{
				//实现算法规则.   自己写.   无副作用.
				return Flow.values()[tag-1];
			}catch (Exception e) {
				return Flow.OTHERS_ENTRY_FLOW;
			}
		}

		public abstract int handle(long userId, Map context);
	}
}



不知道这种写法 你中意不?
0 请登录后投票
   发表时间:2012-10-08  
lzxz1234 写道
slertname 写道

判断几次根本无所谓吧。不差那点性能。楼主这样改,好处是扩展时work方法不用修改了。符合ocp原则。
不过循环确实不优雅,比较好的作法是能够通过type生成实例,之前几位都讲了。


work不用修改的代价是修改枚举类

ocp又不是ccp, 修改枚举类难道不是open for extension吗?
0 请登录后投票
   发表时间:2012-10-08  
xiaoyu211940 写道

   public class HandleSomething  {
	
	//Map 可以替换为你的Context
	protected void work(int entryType, long userId, Map context) {
		context.put("type", Flow.getInstance(entryType).handle(userId, context));
	}

	enum Flow {
		VIP_ENTRY_FLOW(1) {
			public int handle(long userId, Map context) {
				return 0;
			}
		},
		INDEX_ENTRY_FLOW(2) {
			public int handle(long userId, Map context) {
				return 0;
			}
		},
		OTHERS_ENTRY_FLOW(3) {
			public int handle(long userId, Map context) {
				return 0;
			}
		};

		private final int tag;

		Flow(int tag) {
			this.tag = tag;
		}

		public int getTag() {
			return tag;
		}

		public static Flow getInstance(int tag) {
			try{
				//实现算法规则.   自己写.   无副作用.
				return Flow.values()[tag-1];
			}catch (Exception e) {
				return Flow.OTHERS_ENTRY_FLOW;
			}
		}

		public abstract int handle(long userId, Map context);
	}
}



不知道这种写法 你中意不?


0 请登录后投票
   发表时间:2012-10-08  
抛出异常的爱 写道


1.这代码最大的问题在于contex的管理。。。。
太分散了。
但你引入的东西没有解决这个问题



我个人觉得,这个其实是代码的重点,if判断在这个类中,因为其简单,并且易于管理,存在的风险其实并不大。重点在于context的管理,在同一个类中的分散管理,将其再次分散到了其他的类中,在参数继续多样话以后,对其管理和可读性都存在越来越多的风险。

再次表现一下对“抛出异常的爱”的尊敬啊。。。。呵呵!!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics