当前位置:  开发笔记 > 程序员 > 正文

我们应该总是支持多态性而不是枚举吗?

如何解决《我们应该总是支持多态性而不是枚举吗?》经验,为你挑选了4个好方法。

看完之后:清洁代码会谈 - 继承,多态和测试

我检查了我的代码并注意到一些switch语句可以重构为多态,但我也注意到我只使用带枚举的switch语句.这是否意味着枚举在OO设计中是"邪恶的",应该用多态性消除?



1> Konrad Rudol..:

首先,Java实际上有很多可以多态使用的枚举.我不是Java程序员,所以其他人当然可以给出一个很好的例子(我不能).此外,考虑到多态性通常只是矫枉过正.我也刚刚看过这个话题,这很棒,但它只提供指导方针,没有银弹.

所有陈述都可以被替换,这尤其正确switch.状态机实际上是一个很有意义的情况.我在解析时经常使用状态机.当然,这可以通过设计模式和类多态来完成.但是它有更多(更多)代码,它执行相同的工作,只是更慢,它不是更容易阅读,它只是在一个地方需要的解决方案,没有任何代码回收.在这里使用子类只是没有优势.

然后,这是一个例外.通常,子类化通常是支持它的语言的更好解决方案.

编辑:我注意到这可能会引起争议.当然,有很多很好的解决方案可以封装解析,从正则表达式到解析器生成器框架(如Antlr).除了微不足道的情况之外,这些都是更好的解决方案.但是,我使用低级代码(显然不是Java)工作很多,不支持正则表达式,解析器生成器也会产生开销.



2> Charlie Mart..:

这不是枚举是邪恶的,它是转换语句.在C++常见问题解答书中对此进行了长时间的讨论,但要点是:除了有限的区域 - 例如对来自设备上的寄存器的数据的解释 - 一个大的开关梳子表明你'重新使用数据来区分子类型.取而代之的是,您应该只使用子类型,获得编译器的帮助以保持其正确,并且还意味着当您(不可避免地)更改案例集时,编译器将自动添加新案例.



3> recursive..:
class Sunday extends DayOfWeek {}
class Monday extends DayOfWeek {}
class Tuesday extends DayOfWeek {}
class Wednesday extends DayOfWeek {}
class Thursday extends DayOfWeek {}
class Friday extends DayOfWeek {}
class Saturday extends DayOfWeek {}

枚举很好.



4> Paul Nathan..:

我毫不犹豫地称之为邪恶.这是一个"你想要设计多么沉重"的问题.

在某些方面,枚举/开关很好.设置类层次结构是问题所不总是需要的开销.但案例陈述中的代码越多,可能性就越大,是的,也许你应该朝着更重的方向前进.

我的经验是几年前我为一堂课写的编译器.我的室友与我同班,我们以两种截然不同的方式接近它.我采取了重型OO方法,充满了多态性.他使用枚举和工会采取了重C方法.他的代码是我的LOC大小的1/2,他的代码更快编译,他的代码工作.他的代码很灵活,因为它没有过度设计.这对我来说在软件设计方面是一个宝贵的教训.


是的,你必须创建一个新类,但核心代码逻辑应该是相同的数量,否则你做错了.
推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有