在本文中,“外部”表示“用户可观察”。如果是应用程序,则用户可能是人类;如果是公共API,则用户可能是其他程序。
因此,如果将方法M从类A移到类B,并且这两个类都位于应用程序内部,并且由于更改,没有用户可以观察到应用程序行为的任何变化,那么您可以正确地称其为重构。
如果OTOH,某些其他更高级别的子系统/组件由于更改而改变了其行为或损坏,则实际上(通常)是用户(或至少是系统管理员检查日志)可以观察到的。或者,如果您的类是公共API的一部分,则可能存在第三方代码,这取决于M是A类而不是B的一部分。因此,从严格意义上讲,这两种情况都不是重构的。
我倾向于将任何代码返工称为重构,这是不正确的。
确实,这是重构成为时尚的可悲但可预期的结果。多年来,开发人员一直在以特殊的方式进行代码返工,而且学习一个新的流行词当然比分析和改变根深蒂固的习惯要容易得多。
那么,改变外部行为的返工正确的词是什么?
我称之为重新设计。
更新资料
关于接口的很多有趣的答案,但是不会通过方法重构来改变接口吗?
什么啊 具体的类,是的。但是,这些类是否以任何方式对外界直接可见?如果没有-因为他们是你的程序中,而不是外部接口(API / GUI)的一部分程序 -没有任何变化作出有外部各方观察到的(除非变化中断的东西,当然)。
我觉得还有一个更深层的问题:特定类本身是否作为独立实体存在?在大多数情况下,答案是否定的:该类仅作为较大的组件,类和对象的生态系统的一部分存在,没有它,就无法实例化和/或不可用。该生态系统不仅包括其(直接/间接)依赖性,还包括依赖于它的其他类/对象。这是因为,如果没有这些更高级别的类,与我们的类相关联的责任对于系统的用户可能是无意义的/无用的。
例如,在我们涉及汽车租赁的项目中, Charge
类。该类本身对系统的用户没有用,因为出租站的代理和客户不能单独承担很多费用:他们作为一个整体处理租赁协议合同(包括许多不同的费用) 。用户最关心的是这些费用的总和,他们最终将要支付;代理商对选择的不同合同选项,租赁时间长度,车辆种类,保险套餐,额外物品等感兴趣,这些(通过复杂的业务规则)决定了要收取的费用以及如何计算最终付款在这些之外。国家代表/业务分析师会关注特定的业务规则,它们的协同作用和影响(对公司收入等)。
最近,我重构了该类,重命名了其大多数字段和方法(以遵循标准Java命名约定,而我们的前辈完全忽略了该约定)。我还计划进一步重构更换String
和char
更适当的领域enum
和boolean
类型。所有这些肯定会改变类的界面,但是(如果我做得对,我的应用程序的用户将看不到)。尽管他们肯定知道收费的概念,但他们都不关心单个收费的表示方式。我可以选择一百个不代表任何领域概念的类作为示例,因此对于最终用户在概念上甚至是不可见的,但是我认为选择一个在概念级别上至少具有某些可见性的示例更为有趣。这很好地表明了类接口(最多)只是领域概念的表示,而不是真实的*。可以更改表示形式而不会影响概念。用户只拥有并理解该概念;在概念和表示之间进行映射是我们的任务。
* 并且我们可以轻松地添加一个类,我们的类表示的域模型本身只是某些“真实事物”的近似表示...