面向对象的认识---如何找出类

客串:屌丝的坑人表单神器数据库那点事儿探讨负载均衡

推荐:手把手教你做关键词匹配项目(搜索引擎)---- 第一天(起点)、手把手教你做关键词匹配项目(搜索引擎)---- 第十九天(最新)

 

同类文章:面向对象的认识----新生的初识面向对象的番外----思想的梦游篇(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];
    }
}

 

好了,今天的课程到此结束,反正心冷了....

今天的目的也是让大家怎么从需求文档里面找出所谓的类。任何事情都是一步一步来的,熟能生巧嘛。。。

请大家继续关注:面向对象的认识----类的转化   

 

posted @ 2014-09-02 09:58  oShine.Q  阅读(2515)  评论(0编辑  收藏  举报