繁体   English   中英

辅助函数应该在类中吗?

[英]Should Helper Functions be in a Class?

在考虑到OOP的情况下重写我过去的项目时,我已将代码分解为设备,设施等类。

在转向一种更加面向对象的方法之前,我只是将我的所有辅助函数粘贴在一个包含的“ functions.php”文件中。 以设备为例,是否最好为我的对象特定的属性/方法创建一个Devices类,然后再使用一个DeviceManager类来存储诸如getDeviceByName,getDeviceByID之类的函数?

根据我的理解,OOP比任何其他内容都更具有可读性/可管理性,为什么我认为这样做的目的只是用DeviceManager :: GetDevice(“ Computer1”)之类的东西代替GetDeviceByName(“ Computer1”)

如果您想将类用作命名空间,则可以使用实际的命名空间:

namespace MyCollectionOfFunctions;
function printMyName($name) {
    echo $name;
}

然后,您可以使用如下功能:

use MyCollectionOfFunctions as fn;
echo fn\printMyName('Brett Powell');

功能没有错。 不要让任何人告诉您他们属于一个类,就像静态方法一样。 可以通过这种方式完成,但是由于我们有了名称空间,因此确实没有理由。

在C#或Java之类的OOP语言中,您根本无法在类之外使用函数,因此没有问题。 这并不意味着您正在做OOP,这是一种心态。

在PHP中,您可以将相关函数放入nampespace中,也可以放入类中(在命名空间内)。 这取决于您,没有正确或错误的方法。 就我个人而言,我将它们放在一个类中,因为这就是我在C#中所做的方式,它将对生产率有所帮助:我将相关功能分组在一个地方(类)。 更容易管理。

但是严格来说,从编程的角度来看,这没有什么区别,因为将函数放入类或命名空间中,您的代码不会更干净/解耦或更多的OOP。

将命名空间或类用于静态函数时的一些优点。

  1. 命名空间和类名称有助于区分功能。 您可以避免命名冲突。

  2. 当您想利用IDE的自动建议功能时,DPDate :: FirstDayOfMonth()比FirstDayOfMonth()更好。

  3. 实际上,所有内容都与凝聚力和去耦有关。

您必须遵循以下规则:

  1. 在OOP中,您必须始终使用CLASS
  2. 您的方法必须具有单一责任
  3. 避免使用通用的帮助程序类,这些类必须具有简单而特定的职责
  4. 不要使用静态方法,而要使用策略(通过传递对象抛出参数)来调用方法,这样您就可以创建一个Mock来测试您的方法。
  5. 避免使用私有方法,这会使您难以测试您的课程

记住这一点,您将可以编写清晰的代码。 =)


回答有关项目4的Eric:此代码将使用静态方法:

public function myFunction() {
    $deviceId = DeviceManger::getDeviceId('computer 1');
    // Rest of code using the device id 
}

这样,我无法模拟设备ID的返回,从而可以:

public function myFunction(deviceManger) {
    $deviceId = deviceManager->getDeviceId('computer 1');
    // Rest of code using the device id 
}

测试功能中带有模拟的代码:

$deviceManager = $this->getMock('DeviceManager');
$deviceManager->method('getDeviceId')->returnValue(1);
myFuncion($deviceManager);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM