关于命名
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字符串。