gpt4 book ai didi

php - 结束使用 moSTLy 静态类可以吗?

转载 作者:可可西里 更新时间:2023-11-01 13:38:15 26 4
gpt4 key购买 nike

我目前正在重写一个电子商店 - 但仅限于客户端,即 CMS 大部分保持完好。我没有使用预构建的框架,因为系统必须保持与 CMS 的向后兼容性,而且我必须拥有完全自由的代码结构。

新系统完全基于 MVC,我有一个 Bootstrapper,它根据当前的 uri 加载 Controller ,后者使用模型进行实际工作——包括 session 和数据库。

tl;dr 这是我的第一个没有预构建框架的项目。

我在设计模式方面非常缺乏经验。我知道大多数流行的是如何工作的,但从未使用过它们。

现在我怀疑代码有异味,因为我所有的模型都是由静态方法组成的类。我找不到以不同方式做它们的好处。在整个代码中,我经常需要在不同地方使用一些方法。 IE。我需要在主布局中获取登录用户,检查用户权限以查看 Bootstrap 中的当前页面,通过 Controller 显示用户面板。如果我不使用静态,我每次都需要重新实例化一个对象或保留一个全局对象。一次也不需要多个这样的类。

我一定是遗漏了什么,因为即使我使用 OOP,我的一些类对于它们的方法(有时还有几个私有(private)变量)来说只是毫无意义的容器。我本可以只使用 PHP4 和简单的函数。

如有任何意见或建议,我们将不胜感激。

编辑:尽管有所有这些有根据的答案,我仍然不相信。尽管这很可能是因为我缺乏经验,但我仍然没有预见到当前设置会出现任何问题。我的意思是,我什至无法理解由于现在的代码架构而给我带来任何不便的情况。我希望在改变任何事情都为时已晚时,我不会受到严厉的教训......

最佳答案

你是对的,这是一种代码味道,每个人都会告诉你这是 baaaad。

所以在这里我建议对问题的严重性进行 self 评估:

  • 您是否有包含许多getter 和setter 的类?

  • 您的静态函数是否像下面这样?

    如果是,请尝试移动类 MyClass 中的逻辑,这已经是更面向对象的方式了。这是程序/脚本世界的一个典型错误。


 static void myMethod( MyClass anObject )
{
// get value from anObject
// do some business logic
// set value of anObject
}

  • 您是否有很多全局状态,例如您从当前 session 中获取的数据?

    如果是,请评估您是否要更改它。面向对象的方式是将 session 传递到调用链中。但实际上,将 session 作为全局对象进行访问很方便。但它阻碍了可测试性。尝试移除一些全局状态并将其转换为您在方法中传递和操作的常规对象。

进行此评估,并尝试识别实用程序类、服务类和业务对象。实用程序类是具有实用程序方法(例如格式化、转换等)的辅助类,这些方法可以是静态的。服务类做一些业务逻辑,但它们应该是无状态的,一个实例就足够了。业务对象有userproductsarticle等,是你必须下功夫的地方。尝试将普通数据转换为具有嵌入某些行为的对象。

看看should entity be dumb .即使是针对java,概念也是笼统的。

编辑

这是我根据您的评论做出的分析:

  • 您没有包含实体的领域模型。您直接操作数据库。
  • 您所说的模型就是我所说的服务,是您执行操作数据的业务逻辑的地方。服务类是无状态,这是正确的。正如您在问题中指出的那样,您需要不断地重新创建它们、创建一个全局实例或使用静态方法。

OO 范例会说您应该尝试拥有一个领域模型,您可以在其中将数据库与实体进行映射。至少有一个anemic domain model其中实体是加载/保存在数据库中的沉闷数据容器。然后 OO 范式也会说如果可能的话在实体中加入一些逻辑。

它还会说将服务转换为对象以简化组合和重用。如果是这种情况,您可以使用拦截器包装所有服务以启动/停止事务或进行一些安全检查,这是静态方法无法做到的。

您描述的内容(无实体 + 无状态过程服务)不被视为出色的 OO 设计。我建议你至少引入一个贫血域模型和 DAO .关于sateless procedural services,这实际上是很多web应用的现实——如果你不需要更多,你可以坚持下去。

我的 2 美分

关于php - 结束使用 moSTLy 静态类可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2410584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com