我有过程性Perl代码(大约500行长),我想将其重写为面向对象的等效代码(以过程性的方式,它慢慢变得一团糟)。如果有人感兴趣,我可以在这里张贴代码(有一些简单的评论)。
将过程重写为面向对象等效的最佳实践是什么?
在您的过程Perl代码中,我想象您的函数依赖于许多全局状态:访问全局变量或一次接收数十个参数。OOP允许您将状态封装在对象中,并且方法(在对象上定义的函数)可以访问对象中包含的所有状态。
如果你有很多函数操作相同的全局变量,创建一个包含这些变量的类,并将这些函数移到这个类中。这样,你的数据就不会受到全局作用域的影响,你不再需要声明你在使用全局变量,也不需要使用带有大量参数的函数签名。
OOP实际上只是传递程序状态的一种更简洁的方式,从而产生更好的代码,更容易推理(而不是带有大量全局副作用的过程代码)。方法不需要你定义一个庞大的参数列表,因为它正在处理的对象的实例(包括它的所有状态)是作为参数传递给底层方法的。
class Person { ... }
p = Person(...)
print p.to_string()
在上面,p
实际上是to_string()
的一个参数,只是在典型的OOP语法中,它被传递到函数调用的左侧。
类似的代码在C中是这样的:
struct Person { ... };
char* to_string(struct Person);
struct Person p = { ... };
printf(to_string(p));
OOP主要关注保持局部状态(而不是全局状态)以及通过将相关行为分组到对象中来实现功能的模块化。考虑到这个问题的广泛性,我建议你首先考虑你的对象(什么是主要数据/什么是主要领域对象),然后把你的过程函数分解成这些对象的方法。