“重构”是否有正式的定义?

8

有人知道更正式地定义重构的方法吗?

更新。

重构是一对 R = (pre; T),其中 pre 是程序必须满足的前提条件,T 是程序转换。


重新开放并点赞 - 这是一个非常好的问题。 - Steven A. Lowe
这有什么冒犯的呢?一个非常好的问题。 - tvanfosson
合理的转换包括它们自己的前提条件,因此在这种描述中似乎是多余的。 - Ira Baxter
4个回答

3
这是一个有趣的问题,我之前没有考虑过。我进行了一些谷歌搜索,找到了这篇关于AOP重构的论文paper(PDF),试图将一些数学建模应用于方面来展示函数方面与传统方面具有相同的灵活性,但复杂度降低了。我没有读完整篇论文,但你可能会在那里找到一些内容。
另一个有趣的想法是将重构视为编译器优化的同类。实质上,编译器会即时地对您的代码进行重构,尽管目标不同于代码级重构。您必须以合理的方式量化代码复杂性和可读性,以演示特定重构如何影响它。设计模型可能是困难的部分。
我还发现了这篇paper,它建立了一个OO编程代数,并推导出一些基本规律,然后使用这些基本规律推导出更复杂的重构。
有趣的东西。希望这可以帮到你。

2

有趣的是,大部分重构都是成对出现的:

  • 添加参数-删除参数
  • 提取类/方法-内联类/方法
  • 上移字段/方法-下移字段/方法
  • 将双向关联改为单向-将单向关联改为双向
  • ...

应用一对重构操作是一个空转换。

对于一对重构 R, R':

R'(R(代码)) = 代码


2

重构是一系列保持正确性的变换,但是重构可能会导致比原来更加通用的代码

因此,我们不能仅仅断言对程序P进行重构变换T之前和之后具有相同属性R,而是应该确保重构后的程序P'至少等价于R的属性R'

given program P implies R
refactoring transformation T(P) produces P'
where (P' implies R') and (R' is equivalent to or subsumes R')

我们还可以断言输入和输出保持相同或等效。但是,按照您的例子,也许我们想将重构转换T定义为4元组P,I,O,R,其中P是原始程序,I是输入和/或前置条件,O是输出和/或后置条件,R是转换后的程序,然后使用时间逻辑断言(?):
P:I -> O

转换之前的保持

T(P) -> R

定义了转换,以及
R:I -> O

变换后仍然成立

我对符号数学有点生疏,但这是一个大致的方向。

顺便说一句,这会是一个不错的硕士论文题目。


不。重构步骤可能会改变程序的语义。 考虑从函数调用中删除一个参数。 - Ira Baxter
是的 - 我指的是程序P的输入和输出,而不是P中的单个函数。当然,如果一个输入没有被使用,你可以将其删除,但如果它没有被使用,那么程序的实际(而不是形式上的)语义仍然保持不变;-) - Steven A. Lowe

-2

嗯,直接来说不是,但从金钱角度来看 - 我可以说是的。我无法给出一个方程式 :)

写得好的代码,没有复杂性(这可能是由于重构)可以节省时间/精力,从而节省金钱。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接