面向对象的认识---如何找出类
推荐:手把手教你做关键词匹配项目(搜索引擎)---- 第一天(起点)、手把手教你做关键词匹配项目(搜索引擎)---- 第十九天(最新)
同类文章:面向对象的认识----新生的初识、面向对象的番外----思想的梦游篇(1)
吐槽:一上班收到博客园的来信说到,“我们会综合多方面的因素进行考虑,对于首页的管理我们正在努力改进。”,深感欣慰, 这就是不同的答复,有不同的效果,我也希望博客园能说到做到。
最近那些童鞋们作业不做,要求倒是蛮多的,其中一位提到培训下Mysql语句方面的知识,即SQL语句的使用。我直接回了句:先完成上次培训的作业先。
最近也是为了要培训的效果有所成效,当时那位管理级别的就说要搞惩罚措施,对那些不完成作业的进行惩罚,惩罚无外乎就是那些吃吃喝喝的,我当时就说了,学习是自觉的事情,惩罚措施不用搞,当时他就直接反驳说到,你搞了两年,你看哪个自觉了,你就一坑货。我只好无语了,坑坏了下一代的花花朵朵咋办……
也许是心地太好,我就提倡到不交作业的就给1元钱吧,每天早上拿个小碗遇到那些童鞋就说:童鞋来施舍点,好几天没饭吃了,行行好!
------------- 华丽的分割线 正式进入正文 --------------
上回说到类、对象啥的,还没看的童鞋赶紧了:面向对象的认识----新生的初识
我问到:童鞋们,类的基础知识你们都理解了,那么怎么找出类呢,大家有方法吗?
童鞋们:…….(我们要是知道,还要你培训干毛)
我眼睛晃过了一圈,一片沉默,这个是什么造成了现在的现状?
哎呀,我只好自然自语的说到:
类嘛,其实都挺好找的,就专找名词,我们从哪儿找名词,就从需求文档里。
名词这个概念就不用我解析了吧!(连我这种专打错别字的都晓得)
当时有位童鞋直接站起来说到:没有需求文档咋办?
这种叫做没事找事做的,典型的找抽型。
没有需求文档就从口头描述那儿得来,笨的人跟他说半天,他也不懂。
(现在现实很多公司没有需求文档,不过这不是理由)
我再次说到:说归说,还是实战来得靠谱,你们听清楚需求,然后从里面找出名词。
我来到超市,在门口有篮子和购物车,我比较勤快,我拿起了篮子,开始逛超市,我一般先会看看商品的价格,然后觉得把便宜的商品放进了篮子,我提着篮子来到收银台,收银漂亮妹子把篮子里面的商品通过读码器,全部刷一次,然后告诉我总价,我给了现金,收银漂亮妹子不知道干了啥,找零的抽屉打开了,然后他把零钱以及购物凭证给了我,顺手把抽屉推了进去,最后把商品装进了购物袋,然后说了多谢惠顾,欢迎下次关临。我高高兴兴的把商品提回了家。
然后那些童鞋们找出了这些名词,千奇百怪:
我(购物者)、超市、篮子、购物车、商品、商品的价格、便宜的商品、购买的商品、收银台、收银漂亮妹子(收银员)、读码器、现金、抽屉、零钱、购物凭证、购物袋
我就说了:好了,名词找出来了,假设你要做个收银系统,你要怎么办,这么多的名词都要用吗?
童鞋们:……. (我们要是知道,还要你培训干毛)
我继续说到:我们就想想这些名词跟这系统有没有关系。
购物者跟系统有关系吗?
当时他们的想法有两种,一种是有,一种是没有。
我当时就说了,好像输入商品的不是购物者,而是收银员。
收银员成了一个类。我乘胜追击,继续问到:收银员都做了什么事情?
1. 用读码器扫商品
2. 收取现金
3. 打开抽屉
4. 关闭抽屉
Very good!
后面也是一样,通过激烈的讨论, 最终定下了如下类:
收银员
- 用读码器扫商品
- 收取现金
- 打开抽屉
- 关闭抽屉
商品
- 价格
- 条形码
- 名称
购物凭证
- 所购买的商品 - 商品
- 数量
- 折扣
- 总价
- 总价
- 折扣
- 折后价
- 付款的金额
- 找零的金额
- 购物凭证的编号
超市
- 商品列表
读码器
- 读取商品
很好,我们把类都定义好了,我给他们的作业是把这些转成代码。
过了几天我收到了一份程序,当时我懵了,这是什么节奏?
错得太离谱了,我直接喷血了。。。。
然后没办法我又浪费一天的时间一步一步的去教。
首先定义个收银员类,他有哪些操作:
1. 新建购物凭证
2. 在新建的购物凭证上,用读码器扫商品
3. 收取现金,用于支付该次购物
代码如下:
<?php class Cashier { /** * @var Order $order */ private $order; /** * 新建购物凭证 */ public function newOrder() { $this->order = new Order(); } /** * 用读码器扫商品 * @param $goodsId * @param $num */ public function scan($barcode, $num) { #读卡器读取商品 $goods = CodeReader::read($barcode); $this->order->add($goods, $num); } /** * 收取现金 * @param $money * @throws Exception */ public function pay($money) { $totalMoney = $this->order->getTotalMoney(); if ($money > $totalMoney) { $this->order->setPayMoney($money); $balanceMoney = $this->order->getBalanceMoney(); #显示屏展示找零 Display::show($balanceMoney); #订单结算 $this->order->setFinished(); #抽屉打开 Drawer::open(); #订单打印 Printer::print($this->order); } else throw new Exception("金额不够丫,请老板赏脸打发一下"); } }
收银员的代码写好了,我继续让他们去写购物凭证。
我们通过收银员类里面知道订单有以下方法:
1. add($goods,$num); //添加所购买的商品
2. getTotalMoney(); //获取总价
3. setPayMoney($money); //设置支付价钱
4. getBalanceMoney(); //获取找零
5. setFinished(); //订单结算
童鞋们在写Order类的时候,遇到了一下情况:
1. 类里面的属性不会用。
2. 不知道如何把所购买的商品转化成数组或者对象 (明显的基础没打好)
3. 数组的使用不熟练
这些我真心忍了,看样子得专门搞个课程,名字我都想好了,叫做:面向对象的认识----类的转化
这些娃有坑爹的,来看看童鞋们的代码:
class Order { public $orderList = array(); public function add($goods,$num) { $this->orderList[] = array($goods,$num); } public function getTotalMoney() { $Money = 0; foreach($this->orderList as $order) { $Money += $order['0']->price*$order['1']; } return $Monry; } } class Goods { public $price; }
在来瞧瞧另外一个版本的:
class Order { /** * @var OrderGoods[] $orderGoodsList */ private $orderGoodsList = array(); private $payMoney = 0; public function add($goods, $num) { $orderGoods = new OrderGoods($goods, $num); $this->orderGoodsList[] = $orderGoods; } /** * 获取订单总价 * @return int */ public function getTotalMoney() { $totalMoney = 0; foreach ($this->orderGoodsList as $orderGoods) { $totalMoney += $orderGoods->getTotalMoney(); } return $totalMoney; } public function setPayMoney($payMoney) { $this->payMoney = $payMoney; } public function getBalanceMoney() { return $this->payMoney - $this->getTotalMoney(); } public function setFinished() { #该干嘛干嘛 } } class OrderGoods { /** * @var Goods $goods */ private $goods; private $num; public function __construct($goods, $num) { $this->goods = $goods; $this->num = $num; } public function getTotalMoney() { return $this->goods->price * $this->num; } } class Goods { public $price; public $name; public $id; } class Shop { public $goodsList; public function find($goodsId) { return $this->goodsList[$goodsId]; } }
好了,今天的课程到此结束,反正心冷了....
今天的目的也是让大家怎么从需求文档里面找出所谓的类。任何事情都是一步一步来的,熟能生巧嘛。。。
请大家继续关注:面向对象的认识----类的转化
出处:http://www.cnblogs.com/oshine/
本作品由oShine.Q 创作, 欢迎转载,但任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问,请给我留言。