• PHP学习笔记(12)程序之外


    好久没有写博客了,最近在做一个项目.其中遇到很多东西.总结一下.写个博客.(北京啊北京.你怎么就把春天给弄丢了呢.好热啊有木有)

    首先一点,对于需求的理解

      假如我们目前有这么个很简单的需求.有个产品过来和你说.给我写一个大小写字母转换的函数.我要传入大写或小写字母.然后帮我转换成都是大写或者小写.这个听上去其实挺简单的啊.不就一个函数,入参是个字符串.带个模式.返回大写或者小写字母呗.此时函数的模型已经在脑袋里面形成了.当听到这些话的时候,脑袋里面的模型大概是这个样子的.

    function changestr($str,$type =1){//等于1小写转大写,否则大写转小写
    	$str_arr = str_split($str,1);
    	$changenum = $type == 1?-32:32;//大小写字母之间的assic2码相差32
    	foreach($str_arr as $val){
    		$newarr[] = chr(ord($val)+$changenum);
    	}
    	return implode($newarr,'');
    }
    

     其实上面这个函数已经能够实现需求了.但是有很多地方 .我们还需要再考虑.我们要对这个需求进行分析.有很多情况是需求上不能够明确的.
    在实际的使用中我们可能会遇到很多下面这种情况.

    1,如果使用者没有传递第二个参数.怎么处理.如果使用者没有传递任何参数,怎么处理.

    2,如果函数的使用过程中输入的第一个参数不是纯大写或者小写字母会出现什么情况,如果里面混杂着汉字呢.

    3,针对短的字符串.我们可以用这个函数处理.如果用户传递的字符串非常长.函数如何处理.

    我上面提到的问题,可能在需求文档里面根本不会体现.很多事情是隐含在里面的.这些问题要么要口头讨论,要么要一个编程者自己去想办法解决.

    针对上面的问题.我修改了一下我的函数.修改之后大概是这个样子的:

    function changestr($str='',$type =1){//这里type等于1就返回大写,否则返回小写
    	if(strlen($str)>=500||strlen($str)==0){
    		return "too long or too short!~";//这里用来处理字符过长或者过短
    	}
    	$str_arr = str_split($str,1);
    	$changenum = $type == 1?-32:32;//大小写字母之间的assic2码相差32
    	foreach($str_arr as $val){
    		if((ord($val)>=65&&ord($val)<=90)&&$type!=1){
    		//此条件判断字符串当前位置为大写字母,如果是并且要求转换成小写
    			$newarr[] = chr(ord($val)+$changenum);
    		}elseif(ord($val)>=97&&ord($val)<=122&&$type==1){
    		//此条件判断字符串当前位置为小写,如果是并且要转换成小写
    			$newarr[] = chr(ord($val)+$changenum);
    		}elseif((ord($val)>=65&&ord($val)<=90)||(ord($val)>=97&&ord($val)<=122)){
    		//当前位置是字母,但不需要转换
    			$newarr[] = $val;
    		}else{
    		//如果不是字母
    			return "I got a char not a letter. It's the ".$val;
    		}
    	}
    	return implode($newarr,'');
    }
    

     这样的话,这个函数就较之前好用多了.其实在工作中,总能遇到这样的改动.因为作为一个需求人员.他们可能不会考虑到你代码书写中的错误和漏洞.但是作为一个编码人员,我们需要为我们的代码负责.所以就要能想多少想多少.当然,这里面还有我没有想到的.所以我们需要做的是在动手之前,就尽可能的吧可能的情况都尽量想到.才能实现更具有易用性的程序.

    关于需求的变更,要如何应对

      前几天接到一个需求,说页面上有10个列表.每个列表对应一个二级页面.但是列表有2个是有特殊化处理的.读取16条数据,其余的是十条.拿到这个需求的时候,就开始设计程序要怎么实现.我用了半天的时间想更好的实现方法.

      本来我的方法想这样写 

    function index(){
         $sort = array(这里是分类的数组);
    foreach($sort){ if(这里是特殊分类的判定){
    这里写调用16条数据的实现.
    }else{
    这里写调用10条数据的实现
    }
    } }

     但是这样写的话,如果有一天我想要再增加两个特殊分类.那么就要对我的程序动手术.这个时候.就很麻烦了.因为到底哪些分类需要被定义为特殊的分类.是需要经过市场的评估才能够得到准确的结果的.所以如果我把程序写成上面那个鸟样子.那么应对以后的需求变更.就不好弄了.于是我把程序写成了下面这个样子.

    function index(){
            $sort = array(分类的数组);
            foreach($sort)   
    	if(如果是特殊分类){
    		getlist(16);
    	}else{
    		getlist(10);
    	}
    }
    function getlist($total){
    	这里写调用$total条数据的实现.
    }
    

     这样的话,就能够更好的应对以后的变更.如果需要添加特殊的分类.我只需要在分类数组里面添加即可.或者有更好的实现方法.就是这个数组对应一个分类表.我只要在特殊的分类上打个标签.然后去数据库查询特殊的分类.那么就可以吧这个做成一个功能.

      有一天一个产品和我说.我现在想在这个列表页面里加两个分类.但是不要二级页面.

     这个时候,如果你的分类导航是通过循环分类表里面的数据得到的.那么就很无奈.

    --如果你把这两个分类添加到分类里面,那么就会在分类导航里面显示出来.但是又要求这两个分类不能在分类导航里面显示出来(因为没有二级页面).

    --如果你不把这两个分类添加进去,那么就没办法根据分类去录入.

    好是尴尬如何是好.除了对模板的特殊化处理就没有别的办法了么?当然有别的办法.

      如果我在设计分类表的时候,设计一个字段叫做onshow(布尔型).那么我只需要在添加分类后将这个onshow设置为false,在从表中读数据的时候,加上个判断条件就OK 了.问题迎刃而解.

    本来想多写点,不过突然有事情.就先到这里吧.

  • 相关阅读:
    PHP面向对象之接口 (interface)
    防止继承和覆盖(PHP类)
    对PHP中类、继承、抽象的理解(个人总结)
    AngularJS directive 分页,待续...
    facade(外观)模式
    command (命令)模式
    javascript设计模式 富有表现力的javascript
    AngulatJS $directive compile
    directive talks to controller
    testing
  • 原文地址:https://www.cnblogs.com/swordphp/p/3044719.html
Copyright © 2020-2023  润新知