编码之道——代码的整洁与逻辑
大部分时候我们都提倡一句话——“代码越简洁越好”,很多时候大家误解了这句话的意思,代码的简洁不是简单。
个人觉得代码的简洁要注意的以下两点:
像之前我老是一样他将代码的优化过程看作一件看电影的不。这里我也将整个代码的优化过程,举例为一个带女朋友去看电影,然后需要告诉女朋友如何去看电影的过程。
代码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;
}
从整个过程我们可以看到,最终的代码是我们需要的。一个简单的赋值过程,可以让开发者学到很多东西。
写代码要严谨,严谨过程中要注重代码的整洁。