在我也曾在我的一个项目中看到并进行过处理之后,我将尝试针对此类用法给出答案。
代码可读性
首先,考虑到代码的可读性很重要,这种做法与之相反。有人读了一段代码,我们只说它有一个功能doSomething(Employee e)
。这不再可读,因为由于Employee
不同程序包中存在10个不同的类,您将必须首先借助import声明来查找输入的真正含义。
但是,这是一个高级视图,我们似乎经常会出现随机的名称冲突,没人在乎甚至找不到,因为其含义可以从其余代码以及您所处的程序包中得出。所以甚至可以争论在本地,这没有问题,因为当然,如果您Employee
在hr
软件包中看到,则必须知道我们正在谈论员工的HR视图。
但是,一旦离开这些程序包,事情就会崩溃。一旦您在不同的模块/程序包/等中工作并且需要与员工一起工作,如果您不能完全限定其类型,则已经在牺牲可读性。此外,拥有10个不同的Employee
类别意味着您的IDE的自动完成功能将不再起作用,您必须手动选择员工类型。
代码重复
由于这些类彼此之间的本质相关性,由于大量重复,您的代码势必会恶化。在大多数情况下,每个类都必须具有员工姓名或标识号之类的东西。即使每个类都添加了自己的视图,但如果它们不共享底层的员工数据,那么您最终将获得大量无用但昂贵的代码。
代码复杂度
您可能会问什么如此复杂?毕竟,每个类都可以使它尽可能简单。真正成为问题的是如何传播更改。在功能相当合理的软件中,您可能可以更改员工数据-并且您希望将其反映到任何地方。假设一位女士刚刚结婚,您必须将她从改名X
为Y
因为那个。在所有地方都很难做到这一点,但是当您拥有所有这些不同的类时,就更难了。根据您的其他设计选择,这很可能意味着每个类都必须实现自己的侦听器或将其通知更改的类-基本上,这将转化为要处理的类数的一个因素。 。当然,更多的代码重复,以及更少的代码可读性,..诸如此类的因素在复杂性分析中可能会被忽略,但是当应用于代码库的大小时,它们确实很烦人。
代码通讯
除了上述与代码选择有关的代码复杂性问题之外,您还降低了高级设计的清晰度,并失去了与领域专家进行正确沟通的能力。在讨论体系结构,设计或需求时,您将不再有空发表类似的简单声明given an employee, you can do ...
。开发人员将不再知道此时的employee
真正含义。虽然领域专家当然会知道。大家都这样做。有点。但是就软件而言,通信变得不那么容易了。
如何摆脱这个问题
在意识到这一点之后,如果您的团队同意这是一个足以解决的大问题,那么您将必须找到一种解决之道。通常,您不能要求经理让整个团队休假一周,以便他们清除垃圾。因此,从本质上讲,您将必须找到一种可以一次消除一部分此类的方法。最重要的部分是与整个团队一起确定Employee
真正的含义。难道不是所有的个人属性整合到一个神的员工。更多地考虑核心员工,最重要的是,决定该Employee
班级将驻留在哪里。
如果您进行代码审查,那么特别容易确保问题至少不会进一步加剧,即,当每个人都想Employee
再次添加另一个时,将他们停在正轨上。还请注意,新子系统必须遵守协议Employee
,并且不允许访问旧版本。
根据您的编程语言,您可能还想标记一些最终将被淘汰的类,例如@Deprecated
帮助您的团队立即意识到他们正在使用需要更改的内容。
至于摆脱过时的员工类别,您可以为每个案例决定如何最好地消除它,或者只是就一个通用模式达成共识。您可以添加类名并将其包装在真正的雇员周围,还可以使用模式(想到的装饰器或适配器)或or或or。
长话短说:从技术上讲,这种“做法”是合理的,但是却充满了隐性成本,这些隐性成本只会在以后发生。虽然您可能无法立即解决该问题,但可以立即开始处理其有害影响。