12.保持方法可维护性 让我们来看一下这个方法: - class SomeClass {
- function monsterMethod() {
- if($weArePilots) {
- $this->goAndDressUp();
- $this->washYourTeeth();
- $this->cleanYourWeapon();
- $this->takeYourHelmet();
- if($this->helmetDoesNotFit())
- $this->takeAHat();
- else
- $this->installHelmet();
- $this->chekcYourKnife();
- if($this->myAirplain() == "F22")
- $this->goToArmyAirport();
- else
- $this->goToCivilianAirport();
- $this->aim();
- $this->prepare();
- $this->fire();
- }
- }
- }
再看如下代码: - class SomeClass {
- function monsterMethod() {
- if($weArePilots) {
- $this->prepareYourself();
- $this->tryHelmet();
- $this->findYourAirport();
- $this->fightEnemy();
- }
- }
- private function prepareYourself() {
- $this->goAndDressUp();
- $this->washYourTeeth();
- $this->cleanYourWeapon();
- $this->chekcYourKnife();
- }
- private function tryHelmet() {
- $this->takeYourHelmet();
- if($this->helmetDoesNotFit())
- $this->takeAHat();
- else
- $this->installHelmet();
- }
- private function findYourAirport() {
- if($this->myAirplain() == "F22")
- $this->goToArmyAirport();
- else
- $this->goToCivilianAirport();
- }
- private function fightEnemy() {
- $this->aim();
- $this->prepare();
- $this->fire();
- }
- }
对比两段代码,第二段代码更加简洁、可读和可维护。 13.避免深层嵌套 太多层的嵌套会让代码很难阅读、理解和维护。看看下面的代码: - function doSomething() {
- if ($someCondition) {
- if ($someOtherCondition) {
- if ($yetSomeOtherCondition) {
- doSomethingSpecial();
- }
- doSomethingElse();
- }
- }
- }
条件里面又嵌套多个条件,通过转换条件,我们对代码进行了调整: - function doSomething() {
- if (!$someCondition) {
- return false;
- }
- if (!$someOtherCondition) {
- return false;
- }
- if ($yetSomeOtherCondition) {
- doSomethingSpecial();
- }
- doSomethingElse();
- }
相对于前面的代码,这段代码简洁了很多,并且所实现的功能也是一样的。 当你在if里面使用嵌套,请仔细检查代码,里面可能同时执行多个方法,例如下面这段代码: - function someFunc() {
- if($oneThing) {
- $this->doSomething();
- if($anotherThing)
- $this->doSomethingElse();
- }
- }
这种情况下,可以把嵌套代码提取出来: - function someFunc() {
- if($oneThing) {
- $this->doSomething();
- $this->doAnotherThing($anotherThing);
- }
- }
- private doAnotherThing($anotherThing) {
- if($anotherThing)
- $this->doSomethingElse();
- }
14.避免使用匿名数字和字符串(Avoid Magic Numbers and Strings) 使用匿名数字和字符串是有害无益的,在代码里定义需要使用的变量和常量。比如下面这段代码: - function someFunct() {
- $this->order->set(23);
- $this->order->addProduct('superComputer');
- $this->shoppingList->add('superComputer');
- }
给23和“superComputer”赋予相应意义的变量名: - function someFunct() {
- $orderId = 23;
- $selectedProductName = 'superComputer';
- $this->order->set($orderId);
- $this->order->addProduct($selectedProductName);
- $this->shoppingList->add($selectedProductName);
- }
可能会有人认为,一些无意义的变量尽量少定义,虽然它们对性能的影响是微不足道的。但可读性永远处于优先地位。请记住:不要随便优化性能,除非你知道为什么。 15.使用Built-in数组函数 使用built-in函数来代替foreach() 差的代码: - foreach (&$myArray as $key =>$element) {
- if ($element > 5) unset ($myArray[$key]);
- }
改进后的代码: - $myArray = array_filter($myArray, function ($element) { return $element <= 5;});
PHP里面提供了许多数组方法。起初会混淆,但是试着花时间好好学学它们。 16.不要过度使用变量 大家在开发过程中很容易使用变量,但请记住,变量是需要存储在内存中的。看下面这段代码: - public function get_posts() {
- $query = $this->db->get('posts');
- $result = $query->result();
- return $result;
- }
$result变量其实是不需要的。 - public function get_posts() {
- $query = $this->db->get('posts');
- return $query->result();
- }
虽然这些差别都是微不足道的,但对于养成良好的编码习惯还是 很重要的。 通用篇 17.依赖数据库引擎 使用数据库来专门处理数据会让你的程序更高效。 例如,在大多数情况下,你可以避免冗余的数据查询。大多数的plug-and-play用户管理脚本在用户注册时都使用了两次数据查询:先检查用户名/邮件是否存在,另外再把用户信息插入到数据库中。一个比较好的做法是在数据库中设置username字段为UNIQUE,然后你可以利用本地的MySQL函数来检查用户名是否存在,然后添加进去。 18.正确命名变量 使用x、y、z命名变量的时代已经结束(除非是处理一个坐标系统)。变量是你逻辑代码的重要组成部分。不想键入长名字吗?获取一个好的IDE吧,使用IDE只需一眨眼的功夫就可以完成变量命名。 19.方法表示动作 见名知意,看到方法名字就知道它执行了哪些动作。使用一个短的,但具有描述性的范围命名(例如:public methods即可这样命名);使用一个长的名字,并且可以更加详细的描述(例如:定义private/protected methods)。这样会让你的代码更加可读可写。 当然也要避免用非英语来进行命名。例如使用“做些什麼()”或者делатьчтото()命名,简直是糟透了的命名。对于其他程序员来说,真的很难理解。尤其是在一个团队里,请记住,让你命名更加规范些吧! 20.结构的定义 最后,我们来说一下代码结构,从可读性和可维护性来讲,代码结构也是相当重要的,下面我们从两方面来讲: - 首行缩进4字节或2个标签宽度。
- 设置合理的线宽(line-width)并且保持。一行只有40个字节?我们已经不是70年代的人了。一行限制在120个字节,并且在屏幕上放一个标签,并且驱使IDE保持。
结论 发生错误不要紧,关键是要总结错误,并且从中吸取教训,只有不断总结和学习,才能让你的编程之路走的更远。 来自:20 All Too Common Coding Pitfalls For Beginners |