8

任何人都知道以更正式的方式定义重构的方法吗?

更新。

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

4

4 回答 4

3

这是一个有趣的问题,我没有考虑过。我做了一点谷歌搜索,并提出了这篇关于 AOP 重构的论文(PDF),它试图将一些数学模型应用于方面,以表明功能方面与传统方面具有相同的灵活性,但复杂性降低了。我没有阅读整篇论文,但你可能会在那里找到一些东西。

另一个有趣的想法是按照与编译器优化相同的思路来考虑重构。本质上,编译器会即时重构您的代码,尽管其目标与代码级重构不同。您必须以某种合理的方式量化代码复杂性和可读性,以展示特定重构如何影响它。提出模型可能是困难的部分。

我还发现这篇论文建立了面向对象编程的代数并推导出了一些基本规律,然后使用这些基本规则推导出更复杂的重构。

有趣的东西。希望这可以帮助。

于 2008-11-19T05:56:43.610 回答
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

转化后成立

我的符号数学生锈了,但这是一个大方向

这将是一篇很好的硕士论文,顺便说一句

于 2008-11-19T06:20:18.697 回答
2

有趣的是,大多数重构都是成对出现的:

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

应用该对的两个重构是一个空转换。

对于重构对 R, R' :

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

于 2008-11-19T07:23:05.230 回答
-2

好吧,不是直接,而是在金钱方面-我可以说是。我想不出一个方程式:)

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

于 2008-11-19T05:49:25.513 回答