编码之道——代码的整洁与逻辑

编码之道——代码的整洁与逻辑

     大部分时候我们都提倡一句话——“代码越简洁越好”,很多时候大家误解了这句话的意思,代码的简洁不是简单。

个人觉得代码的简洁要注意的以下两点:


  • 1、不能省略代码,简洁不是简单;
  • 2、代码简洁的层面是抽象和具体;
  • 3、代码的逻辑一定要严谨;

像之前我老是一样他将代码的优化过程看作一件看电影的不。这里我也将整个代码的优化过程,举例为一个带女朋友去看电影,然后需要告诉女朋友如何去看电影的过程。

代码1-1表示的过程是

     XX,我们去看电影吧,然后回来。

对于这个过程我们只看到了一个简单的目的,但是具体的一些细节我们忽略了,比如我们几点去看电影,在哪里看电影,去看什么电影等

代码1-1:

    //json from clinet is like {'name':'danhuang', 'age':23, 'other':{'t':'a'}}
     $mystr = $_GET['json'];
     $jsonArray = json_decode($mystr, true);
     $name = $jsonArray['name'];
     $age = jsonArray['age'];
     array_merge(array(), jsonArray['other']);

 对于这段代码不知道大家的感觉是什么,不够严谨,代码简单,容易出现bug。


接下来我们做一些改变,代码1-2表示的过程是:

     我们6:00从学校的门口出发,你先上的士,我坐后排右边,你坐后排左边,到了以后我先下车,然后帮你开车门,一起走路到电影院,我们先买中间的位置,如果两个人分开座位的我们就换一个位置,如果没有中间位置的,我们就做后排靠边,看电影时,我抱着你等等。

看到这个大家估计想笑,估计是女朋友听到这些后,会有一个想法“这男人要不得,太罗嗦啦!”。

从整个过程暴露了很多细节,其实这些细节完全可以封装,代码就像故事一样,暴露了一些我们不想看的过程、细节,比如说如何上车下车这种事情和看电影没关系,我们不关心这些,只有当女朋友问这些的时候,我们才告诉她这些细节,而不是直接暴露出整个过程。

 //json from clinet is like {'name':'danhuang', 'age':23, 'other':{'t':'a'}}
     if(!isset($_GET['json'])){
          echo "can not get json from clinet";
          exit;
     }
     $mystr = $_GET['json'];
     $jsonArray = json_decode($mystr, true);
     if(!$jsonArray){
          echo "can not json decode, mystr is not a json string";
          exit;
     }
    
     if(!(isset($jsonArray['name']) && isset(jsonArray['age']) && isset(jsonArray['other']))){
          echo "parameters error";
          exit;
     }
     $name = $jsonArray['name'];
     $age = jsonArray['age'];
     if(is_array(jsonArray['other'])){
          array_merge(array(), jsonArray['other']);
     } else {
          echo "other is not a array, please check it";
          exit;
     }

代码写完整以后,不知道大家是否已经看出,代码1-1存在的问题。虽然代码1-1的代码量很少,但是其中存在很多问题,特别是代码的逻辑严谨性。但是代码1-2还是存在问题,主要是代码不够简洁、抽象。这样的代码虽然很严谨,但是不是我们code需要的代码,我们应该将具体的东西抽象出来。


下面我们做进一步改进。可以理解为

     我们6点从学校出发,打的到XX电影院门口,然后差不多7点到那里,看画皮2,大概9点钟看完,然后我们打的回来。

这整个过程很简洁,可以清晰的表达了我们去看电影的过程,一些细节的问题,我们并不暴露出来,而是把他隐藏起来,并不是说我们不知道这些细节,当女朋友问我“我们是坐中间还是坐边上”,像这种细节,她问了,我们才回答,而不是说我们直接的将这个细节暴露在看电影的过程中。

     $arr = decodeStrFromClinet('json');
     $checkRet = checkIssetKeyArr($arr, array("name","age","other"));
     if($checkRet){
          $name = $arr['name'];
          $age  = $arr['age'];
          if(is_array($arr['other'])){
               array_merge(array(), arr['other']);
          }
     }
    
     function checkIssetKeyArr($arr, $keyArr){
          if(!(is_aray($arr) && is_aray($keyArr))){
               echo "parameteres error. function checkIssetKeyArr"
               return false;
          }
          for($i=0; $i<count($keyArr); $i++){
               $arrKey = $keyArr[$i];
               if(!isset($arr[$arrKey])){
                    echo "arr is not include " . $arrKey ;
                    return false;
               }
          }
     }
    
     function decodeStrFromClinet($clinetKey){
          if(!isset($_GET['json'])){
               echo "can not get json from clinet";
               return null;
          }
          $arr = json_decode($_GET['json'], true);
          if($arr){
               return $arr;
          }
          echo "json is null, the str from clinet is not a json string";
          exit;
     }

从整个过程我们可以看到,最终的代码是我们需要的。一个简单的赋值过程,可以让开发者学到很多东西。

写代码要严谨,严谨过程中要注重代码的整洁。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CDA数据分析师

一个 Pythoner的 Awesome List

? 从大三接触 Python 到现在几乎已经有两年的接触经验了,除去中间有一年左右接私活写写 Android 和 Lamp 之外,有 Python 实际项目开...

2826
来自专栏养码场

一位资深Java的阿里系公司实战面试经验,套路还是面试官的多

占小狼:一位奋斗在魔都的资深Java开发。去年6月在简书上发第一篇技术文章,已坚持发表76篇技术文章,粉丝数突破4000。

2407
来自专栏IT大咖说

华为:既满足用户体验,又节省功耗的App应用设计开发方法

1817
来自专栏Web 开发

如何把捏前端模板颗粒度

今晚看到一篇博文,其原文是讲AngularJS的模板的,但觉得该作者讲的很多思路,不仅仅是AngularJS适用。凡是想在前端进行模板组织的,都可借鉴,故写下读...

800
来自专栏开发与安全

在腾讯实习的那段日子:不要在难受的时候选择 '逃避/离开'

时间过得很快,从2014.6.5入职实习到2015.1.5已经是7个月的时间了,在这边还是学到了很多东西,遇到的人大多数比较nice。中间拿到了留任offer,...

2340
来自专栏HansBug's Lab

【作业2.0】HansBug的5-7次OO作业分析与小结,以及一些个人体会

2524
来自专栏张善友的专栏

Web 单点登录系统

对于企业内部系统来说,CAS系统是一个应用最广的开源单点登陆实现了,其实现模仿Kerberos的一些概念,例如KDC、TGS等等,都是来自于Kerberos。具...

32710
来自专栏圣杰的专栏

ABP入门系列(18)—— 使用领域服务

源码路径:Github-LearningMpaAbp 1.引言 自上次更新有一个多月了,发现越往下写,越不知如何去写。特别是当遇到DDD中一些概念术语的时候...

24810
来自专栏逸鹏说道

.Net中的AOP系列之构建一个汽车租赁应用(上)

开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看。 本系列的实验环境:VS 2013 Update...

3778
来自专栏领域驱动设计DDD实战进阶

DDD实战进阶第一波(五):开发一般业务的大健康行业直销系统(实现产品上下文领域层)

从这篇文章开始,我们根据前面的DDD理论与DDD框架的约束,正式进入直销系统案例的开发。 本篇文章主要讲产品上下文中的领域层的主要实现,先简单讲下业务方面的需求...

3915

扫码关注云+社区

领取腾讯云代金券