10

我正在创建一个 PHP 文件,它执行 2 个 mysql 数据库调用,脚本的其余部分是用于 file_exists 和其他简单变量之类的 if 语句。到目前为止,我在这个文件中有大约 2000 行代码。

如果陈述为真,是否包含一个单独的文件是更好的做法?还是直接在 if 语句本身中输入代码?

它们是 PHP 应该遵守的单个文件的最大代码行数吗?

4

8 回答 8

11

我想说不应该有任何与你的 php 文件中的行数有关的性能问题,它可以像你需要的一样大。

现在,对于模式和最佳实践,我想说你必须自己判断,我看到了许多组织良好的数千行文件和许多实际上很小且难以阅读的文件。我的建议是:

  • 判断源代码的可读性,总是把它组织好。
  • 如果您的文件同时执行以下两种操作,那么在某种程度上进行逻辑分离非常重要:繁重的数据库访问、写入、修改、html 呈现、ajax 等等。您可能想要分离事物或使用面向对象的方法。
  • 始终在逻辑分离和代码之间寻找平衡。很多 10 行文件不应该是凌乱或特别整洁的
于 2009-12-28T02:44:09.860 回答
3

从计算机的角度来看,单个文件中的 2000 行代码并不是很糟糕,但在大多数情况下可能是可以避免的,看看MVC 设计模式,它将帮助您更好地组织代码。

另外,请记住,包含(很多)文件会减慢代码的执行速度。

于 2009-12-28T02:39:14.623 回答
2

您可能想阅读Bob Martin 的 Clean Code 之类的书。以下是该书中的一些要点:

  • 一个类应该有一个职责
  • 一个函数应该做一件事并且做好

使用 PHP,如果您不使用 Class 方法;你会遇到重复问题。帮自己一个忙,做一些关于这个主题的阅读;它将为您节省更多的扩展和维护时间。

于 2009-12-28T02:42:58.500 回答
2

行数并不是一个很好的性能指标。确保您的代码组织有效,分为逻辑类或块,并且不要将不相关的代码组合成单个模块。

像 PHP 这样的语言的一个问题是,除非有一些创造性的缓存,否则每个包含文件的每一行都必须被标记化,通过解析树压缩并在每次请求托管页面时变成有意义的指令。.NET 和 Java 等编译平台不会受到这种性能杀手的影响。

此外,由于其他发帖人之一提到 MVC 作为一种保持文件简短的方法:良好的代码组织是经验和常识的函数,与任何特定的模式或架构无关。MVC 很有趣,但不是解决这个问题的方法。

于 2009-12-28T02:44:36.967 回答
1

您需要关注行数吗?不,不一定。只需确保您的代码有条理、高效且没有不必要的冗长。

于 2009-12-28T02:38:00.367 回答
0

这真的没关系,只要你正确地记录了你的代码,尽可能地模块化,并检查了任何低效率。您可能有一个 10,000 行的文件。虽然我通常为应用程序的每个部分拆分 500-1000 左右。

于 2009-12-28T02:42:44.117 回答
0

2k 行对我来说听起来太多了……尽管这取决于您遵循的代码样式,例如许多换行符、许多小功能或良好的 api-contract 注释可以增加大小,尽管它们是很好的做法。良好的代码格式也可以增加行数。

关于 PHP,很高兴知道:是只有一个类的 2k 行还是只有一个包含非 OOP PHP 代码的大代码?它是否与模板语句和程序逻辑混合在一起(就像我在 PHP 代码中经常发现的那样)?

通常我不计算这些行,何时拆分。他们只是养成了习惯。如果代码变得混乱,我会做出反应并重构。仍然查看了我们作为一个团队最近编写的一些代码,我可以看到一些模式:

  • 如果大小大于 20LOC(无注释)和 if/else 子句的使用,则提取函数/方法
  • 如果大小 >200-300LOC,则提取到另一个类
  • 如果工件 >10,则提取到另一个包/文件夹

仍然取决于我拥有什么样的代码。例如,如果涉及逻辑负载(if/else/switch/for),则每个函数的 LOC 会降低。如果几乎不涉及任何逻辑(简单愚蠢的单路径代码语句),则限制会增加。最后,最重要的规则是:人类是否能够理解代码。她/他能很好地阅读它吗?

于 2009-12-28T19:54:25.193 回答
0

我不知道任何有用的方法来拆分这么简单的代码,特别是如果它们在语义上属于一起。

考虑是否可以通过重构来消除一些代码可能更有趣。例如,如果您经常使用具有略微不同变量的特定检查组合,则将检查组合外包到一个函数中并在适当的地方调用它可能会有所帮助。
我记得曾经看过一个项目,大部分都写得很好,但它有这样的问题。例如,解析其配置文件的代码是这样复制的:

if (file_exists("configfile")) {
  /* tons of code here */
} else if (file_exists("/etc/configfile")) {
  /* almost the same code again */
}

这是一个极端的例子,但你明白了。

于 2009-12-28T20:04:52.747 回答