《代码整洁之道》笔记[1.命名]

关于命名

1. 名副其实

$ad->cloud()->ads(new AttributeFilter('status', Ad::STATUS_ACTIVE));

其实Query和AttributeFilter是一样的,但是一定要用Filter,因为这里是做Filter的事情。

如果你写出一个类,名叫“自行车”,然后后来写了一个方法:

$car = new 自行车;
$car->踩刹车();

典型的名不副实的错误!
如果“自行车”可以代替“小轿车”,也最好用 class 小轿车 extends 自行车(当然,这会犯另外一个问题),
然后使用 $car = new 小轿车。

2. 避免误导

下面的方法返回的是啥?

$ad->get('categorys');
$ad->get('categoryEnglishName');
$ad->get('createdTime');

3. 有意义的

$ad = new Ad;
$_ad = $ad->causeAd();
$tmpAd = $_ad->related();

$_ad是啥?$tmpAd是啥?
不要因为这是暂时的变量或者private的变量就可以随便起名,否则最终被恶心到的是你自己。

4. 读得出来

比如:$c = new Category,$cs是categorys,但是在编码时,思维会断一下。
再比如:antispamBoobyTrap,虽然在知道它的用途之后,大家都会觉得挺好玩的。。。
但是,别拌可爱,别用双关语。

5. 考虑搜索

写代码其实是读代码的过程。
如果想搜索一个类的使用实例时,如果这个类名字叫 class User,
然后还有几个类叫class UserOrder,class UserAddress,class UserExtendsInfo…
恭喜!杯具。。。。

6. 短,再短

之前写过一篇blog,lib里面的class应该是一个名词(名词短语),方法名应该就是一个动词(动词短语)
不是class knockThreeCmNailIntoPineHammer,而是class Hammer。

干掉驼峰是简洁的好办法。

7. 一一对应

下面的$r是什么东西?

$rule = new Rule();
$rules = $rule->getList();
if (!empty($rules)) {
foreach ($rules as $r)
$r->deal($ad);
}

或者,下面的$a又是什么东西?

$ads = $ad->cloud()->ads();
foreach ($ads as $a) {
if ($ad->title == $a->title)
echo 'duplicate title!';
}

还有,还有。。。
insert和append有啥区别? sort和order有啥区别?
避免混淆的好办法是一个概念只对应一个名字。

比如在所有的代码里class Bike的实例最好是一个统一的名字。
不要一会是$bike = new Bike,一会又是$bicycle = new Bike,然后$bke = new Bike;
很多时候,bug就是这样弄出来的。

8. 正常思维

$i应该就是一个计数器,$url应该就是一个URL字符串。

Leave a Reply

Your email address will not be published. Required fields are marked *