2

我看到这个关于 C# 的问题我想要一个 PHP 的答案。我有一些旧代码有 4 页的 foreach 循环和条件,这使得它难以阅读和遵循。我怎样才能使这个更面向对象?我正在考虑使用 SPL 函数,但还不完全了解其中涉及的内容。

4

5 回答 5

3

这段代码可能会被显着清理,并在不涉及 SPL 的情况下向 OO 方向推得更远。

仅当您想在 foreach() 等语言结构、count() 等内置函数或数组访问函数(运算符 [] 和 key()、next() 等函数)中更改正常对象行为时,才需要 SPL .

清理建议:

  • 如果在代码中多次(超过 1 或 2 次)执行相同的操作,请将其分解为一个函数。如果要对数组中的所有元素执行此操作,请考虑使用array_walk。如果由于某种原因不适合遍历数组,请使用循环:)
  • 如果您有多个语义连接数据的实例,这些数据比键:值对更复杂,并且具有关联的操作,请考虑将其包装在一个类中。但是一个正式记录的协会。数组可能也适合您。取决于您的风格和数据类型。这里重要的是处理数据的方法的结构和文档。你是否把它作为一个班级并不重要。
  • 完成上述步骤后,将新编写的函数和对象分解为单独的包含文件。我倾向于把大部分东西都包在一个班级里,所以我主要有一个班级公关。文件。但是一些帮助类与主类共享一个文件,等等。你会感觉到它。

于 2008-10-16T22:48:48.903 回答
2

如果我是你,我会从编写测试代码开始。

如果您可以构建一组完全描述您正在重构的功能的测试用例,您可以继续并安全地重写您的代码,因为它仍然可以工作。

PHPUnit可能是一个很好的起点。

于 2008-10-17T10:18:48.903 回答
0

慢慢开始。一次重构它。

如果您要循环大量数组,请查看数组函数,如array_maparray_walk和朋友。这更像是一种功能重构,而不是 OO 重构,但它会带你走得很远。 如果进行更多的 OO 是有意义的,那么您将拥有一些功能,然后您可以根据需要将它们推送到适当的类中。

于 2008-10-16T22:21:42.750 回答
0

来自 Johnathan 和 gnud 的一些好建议。不必太担心 SPL,了解更多关于重构的信息,并了解哪些重构工具可用于 PHP

另外,我不能推荐足够的阅读《有效地使用旧代码》

替代文字

当然还有规范的重构书

替代文字 http://ecx.images-amazon.com/images/I/519XT0DER6L._SL500_BO2,204,203,200_AA219_PIsitb-sticker-dp-arrow,TopRight,-24,-23_SH20_OU01_.jpg

PHP 是一门难以清除代码异味的语言,但只要有一点毅力,就可以做到!你会感谢自己每天必须查看你的代码库。

于 2008-10-17T04:37:46.687 回答
0

如果我对您的理解正确,您的 foreach 循环(等等)嵌套了 4 页深,您想知道您听说过的这个 OO 事情是否可以提供帮助。

您当然应该继续重构您的代码以减少嵌套级别并提高可读性,但不要将其与面向对象混淆。

OO 是一种结构化代码的方法,将数据结构的定义放在操作这些数据结构的代码旁边。虽然它的主要目标之一是通过提供复杂性的封装来提高可读性,但 OO 并不是实现这一目标的唯一方法。

如果您还不了解 OO 的概念,您可能会发现重构代码以将内部循环内的代码分离为单独的函数更容易,这些函数(希望)每个函数都有一个单一的简单任务。

不要误会我的意思;我是 OO 的倡导者,尤其是作为一种为开发人员提供更高层次的概念以更有效地讨论设计的技术。OO 非常值得学习。

但是,不要因为缺乏 OO 知识而阻止您将内部代码拉出循环并将它们放入单一用途的函数中。

(如果我误解了您的 OO 知识水平,我深表歉意。)

于 2008-10-17T10:41:00.323 回答