zoukankan      html  css  js  c++  java
  • 面向对象的认识---如何找出类

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

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

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

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

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

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

  • 相关阅读:
    适配器模式
    快排变种
    美团面试问题
    gulp前端自动化构建工具新手入门篇
    javascript继承
    .call()和.apply()相同点与不同点
    JavaScript原型,原型链 !
    锚点链接和hash属性
    构造函数与普通函数的比较
    JS的作用域和作用域链
  • 原文地址:https://www.cnblogs.com/oshine/p/3950825.html
Copyright © 2011-2022 走看看