rav*_*ren 5 php static-methods design-patterns
我目前正在重写一个电子商店 - 但只有客户端,即CMS仍然主要是机智.我没有使用预先构建的框架,因为系统必须保持与CMS的向后兼容性,我必须完全自由地使用代码结构.
新系统纯粹基于MVC,我有一个Bootstrapper,它根据当前的uri加载控制器,后者使用模型进行实际工作 - 包括会话和数据库.
tl; dr这是我的第一个没有预先构建框架的项目.
在设计模式方面我很缺乏经验.我知道大多数受欢迎的工作如何工作但从未使用过.
现在我怀疑代码气味,因为我的所有模型都是纯粹由静态方法组成的类.我发现以不同的方式做这些事情没有任何好处.我通常需要在代码中的各个地方使用一些方法.即我需要在主布局中获取登录用户,检查用户权限以查看bootstraper中的当前页面,由控制器显示用户面板.如果我不使用静态,我需要每次重新实例化一个对象或保持全局对象.一次也不需要多于一个这样的课程.
我必须遗漏一些东西,因为即使我使用OOP,我的一些类对于他们的方法来说只是毫无意义的容器(有时是几个私有变量).我本来可以使用PHP4和简单的功能.
任何意见或建议将受到高度赞赏.
编辑:尽管有这些受过良好教育的答案,我仍然不相信.尽管这是因为我缺乏经验最有可能,我还是没有预见到任何与当前的设置会错.我的意思是我甚至不知道由于现在的代码架构而给我带来任何不便的情况.我希望我没有得到一个严厉的教训,因为改变任何事情为时已晚......
你是对的,这是代码味道,每个人都会告诉你它是baaaad.
所以我建议在这里对问题的严重程度进行自我评估:
你有没有getter和setter的课程吗?
你的静态功能是否如下所示?
如果是,请尝试移动类MyClass中已经更多OO 的逻辑.这是程序/脚本世界的一个经典错误.
static void myMethod( MyClass anObject )
{
// get value from anObject
// do some business logic
// set value of anObject
}
Run Code Online (Sandbox Code Playgroud)
您是否有很多全局状态,例如您从当前会话中获取的数据?
如果是,请评估是否要更改它.OO方式是将会话传递给调用链.但实际上,将会话作为全局对象访问会很方便.但它阻碍了可测试性.尝试删除一些全局状态并将其转换为您在方法中传递和操作的常规对象.
进行此评估,并尝试识别实用程序类,服务类和业务对象.实用程序类是具有实用方法(例如格式化,转换等)的辅助类,它们可以是静态的.服务类做一些业务逻辑,但它们应该是无状态的,一个实例就足够了.业务对象是user,products,article等在这里,你必须集中你的努力.尝试将普通数据转换为嵌入某些行为的对象.
看看应该是实体是愚蠢的.即使它是用于java,概念也是通用的.
编辑
以下是根据您的评论我的分析:
OO范例会说你应该尝试使用域模型来将数据库映射到实体.至少有一个贫血领域模型,其中实体是加载/持久存储在数据库中的枯燥数据容器.然后OO范例也会说如果可能的话在实体中加入一些逻辑.
它还会说将服务转化为对象以简化组合和重用.如果是这种情况,您可以使用拦截器包装所有服务来启动/停止事务或进行一些安全检查,这将无法使用静态方法.
你描述的内容(没有实体+无状态程序服务)不被认为是一个伟大的OO设计.我建议你至少引入贫血领域模型和DAO.关于无懈可击的程序服务,这实际上是许多Web应用程序的现实 - 如果您不需要更多,您可以坚持下去.
我的2美分