2014-02-05 49 views
4

有很多静态函数是不好的做法吗?我使用Yii框架,并且我意识到我的模型类中有很多静态函数。我把我所有与用户有关的功能放到UsersModel中(我也对其他模型也做了同样的处理),但是我最终得到了很多静态函数。只是想知道你们如何处理这个问题。很多这些函数只是查询生成器函数而不是延迟加载,因为我需要提高数据库性能。Yii和静态函数

功能。例如:

User::getUserFromCampaign(1) 
User::getUsersNotInCamapaigns() 
User::isAdmin() 
+0

也许这个问题应该去programmers.stackexchange –

+0

静态函数使得很难测试:http://googletesting.blogspot.com/2008/12/static-methods-are-死亡对testability.html。 – bblincoe

+2

'静态'方法是一个痛苦的测试,维护,交换和没有适当的面向对象的地方。所以是的,我会说这是非常糟糕的做法。 – PeeHaa

回答

1

实例化您的类是最好的测试,但没有使用静态某些任务没有问题。

很多都是意见,如果你的代码工作,它的运行效率和易于维护,那么所有的花花公子!

此外还添加到Laravel门面评论。 Laravel确实实例化了这个类,一个外观只是为更大的图片提供了一个简化的界面,让我们说..这正是laravel正在做的。最终结果是非常好的可读代码。

+0

它是超级可读的......并且非常强大的单元可测试(http://laravel.com/docs/testing)。 – Leng

0

MVC是一个很好的设计模式,它有它的位置。工厂设计模式是另一个不错的模式。如果您不熟悉Google,请致电Factory design pattern。简而言之:FooFactory是一个生成Foo类对象的类(或者FooModel类,如果您愿意的话)。

MVC和Factory并不相互排斥,所以您可以将很多这些静态方法重构为新的UserFactoryClass。

  • User::getUserFromCampaign(1)对我来说,虽然有点奇怪。我认为1是一个广告系列ID?那么它返回的用户是什么?或者一个广告系列只能有一个用户?如果是这种情况,那么UserFactory::getUserFromCampaign()将为具有给定ID的活动中的用户返回UserModel对象。

  • User::getUsersNotInCampaign(),我假设,返回一个UserModel对象数组?将它重构为`UserFactory::getUsersNotInCampaign(),然后你就去。

  • User::isAdmin()根本不应该是静态的。 if ($user->isAdmin()) ...,不if(User::isAdmin($user))...

+0

-1:请停止混淆“工厂方法”与适当的工厂反模式。另外..请标记您不同意的评论。 –

+0

我没有标记一件事。事实上,你的评论让我想知道我明显的错误信息,我希望你能指点我关于正确的工厂的资源,他们的方式。 – Andrejovich

+0

好吧..第一个评论神奇地消失了(我只是假设这是你的行为,对于那个错误感到抱歉)。由于两个问题,静态工厂方法被认为是反模式。即时问题是由于使用静态程序导致的紧耦合引起的。它也带来了一个更长远的问题:如果你开始在你的代码库中使用继承,工厂方法会变成一个“复杂的黑洞”,因为它开始吸引大量的创建逻辑。 –