最近要对以前的一个项目改版,以前写的类基本上都是对一些方法的堆积,一个类都有上百k的大小,根本谈不上是面向对象,或者称之为伪对象吧。以以前写的一个User类为例,对有些疑问的几个地方进行讨论下。
一、我在User里要用到$db这个变量,用来查询数据库的,$db是通过db类实例化出来的,那我这个$db是不是在User类的__construct()里就进行实例化呢?这样做的好处就是User类的其他方法可以直接用$db变量了,不好的地方就是我的User类里其他一些方法可能根本不需要用到$db变量,不仅仅是$db变量,还有一些cache对象、webservice对象,都可能有这种情况,也就是说在方法用到的时候去实例化对象,还是__construct()里就进行实例化?或者是不是有什么设计模式来处理这种情况?
二、对类的划分问题。在User类我这里可能有给用户添加物品、删除物品、显示用户物品列表,同样不仅仅只有物品,还有积分、金钱等等,大部分都是增加、删除、显示列表的,这些都放User类里看起来是没有什么问题的,都和用户相关。但是个人总感觉User类纯粹是一些方法的堆积了(尤其是显示列表的那些方法),是不是可以改成这样,比如以积分为例,有一个UserScoreMgr类,继承自User类,然后对积分的操作都放在这个类中,这样是不是好一些?或者同样有什么样的设计模式来处理这个问题?
一、我在User里要用到$db这个变量,用来查询数据库的,$db是通过db类实例化出来的,那我这个$db是不是在User类的__construct()里就进行实例化呢?这样做的好处就是User类的其他方法可以直接用$db变量了,不好的地方就是我的User类里其他一些方法可能根本不需要用到$db变量,不仅仅是$db变量,还有一些cache对象、webservice对象,都可能有这种情况,也就是说在方法用到的时候去实例化对象,还是__construct()里就进行实例化?或者是不是有什么设计模式来处理这种情况?
二、对类的划分问题。在User类我这里可能有给用户添加物品、删除物品、显示用户物品列表,同样不仅仅只有物品,还有积分、金钱等等,大部分都是增加、删除、显示列表的,这些都放User类里看起来是没有什么问题的,都和用户相关。但是个人总感觉User类纯粹是一些方法的堆积了(尤其是显示列表的那些方法),是不是可以改成这样,比如以积分为例,有一个UserScoreMgr类,继承自User类,然后对积分的操作都放在这个类中,这样是不是好一些?或者同样有什么样的设计模式来处理这个问题?
解决方案 »
- 哪位仁兄会PHP的麻烦帮个忙~~
- 在win2003里怎么配php!
- 又是关于php数据库乱码的问题~~~很奇怪哦!
- 不知道这算不算是PHP5的BUG,代码绝对正确,就是插不进去数据,大家近来瞧瞧 散分!!
- 百度查询收录api接口
- asp 购物车
- 网站页面抓取
- 设置SESSION退出浏览器后就失效,怎样把session的过期时间设成0?
- 請問有誰用 "PHPED" 這個錯誤怎么解!!
- 急!!!请大家帮忙看一看,我的程序运不了,在线等待。先谢了。
- Catchable fatal error: Object of class dUser could not be converted to string in on line 16
- 用什么工具可以方便的 预览、修改 php和css
2, 我也许会这么划分:
添加物品,删除物品,显示用户物品列表
增加积分,减少积分,显示积分
增加金钱,减少金钱,显示余额
这些都可以写成独立的类,因为它们本身互不影响。也不需要继承User,如果你觉的会乱的话,指定这些类实现一个统一的接口。
而User类的工作,只是负责调用,即向这些类传递一些参数
user是实体严格意义上就是存储用户的信息,然后在创建user相关的业务逻辑。
用户相关的附属的积分,物品,金钱等等和用户相关连的也主要集中在业务了逻辑上。
当然没有完美的设计方式,适合就是最好的。
php的面向对象,“我觉得没几个人敢用”,你很大胆。呵呵,当然任何东西都是喜忧参半的
重构(Refactoring)就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。拆分你先有的类,形成一个个单一对象,有如你的 UserScoreMgr类
需要注意的是:继承的层次不要太多,一般以不超过二个层此为宜