面向对象开发PHP应用程序的过程中,估计大家都比较惆怅类的设计和函数的设计。一个好的函数,让使用者和后期项目维护者都受益。那么如何来写好你的函数呢?
1. 可读的,易理解的函数名称。
下面是一段来自initphp开源框架 的一段代码:
/** * 类的实例化 单例模式 * * @param string $classname 类名 * @param string $force 是否强制重新实例化 * @return object */ public static function loadclass($classname, $force = false) { if (preg_match('/[^a-z0-9\-_.]/i', $classname)) exit('invalid classname'); if ($force == true) unset(self::$instance[$classname]); if (!isset(self::$instance[$classname])) { if (!class_exists($classname)) exit($classname . ' is not exist!'); $Init_class = new $classname; self::$instance[$classname] = $Init_class; } return self::$instance[$classname]; }
大多数开发过程序的朋友应该一看loadclass就知道这个函数是用来加载类的。这样的类命名就比较靠谱。
不和谐的命名:
public function delWz() { }
这样的名称,很难理解是什么意思。
2. 规范的函数注释和代码写法的规范。
下面是一段来自doitphp 的一段代码:
/** * 返回唯一的实例(单例模式) * * 程序开发中,model,module, widget, 或其它类在实例化的时候,将类名登记到doitPHP注册表数组($_objects)中,当程序再次实例化时,直接从注册表数组中返回所要的对象. * 若在注册表数组中没有查询到相关的实例化对象,则进行实例化,并将所实例化的对象登记在注册表数组中.此功能等同于类的单例模式. * * 注:本方法只支持实例化无须参数的类.如$object = new pagelist(); 不支持实例化含有参数的. * 如:$object = new pgelist($total_list, $page); * * <code> * $object = doit::singleton('pagelist'); * </code> * * @access public * @param string $class_name 要获取的对象的类名字 * @return object 返回对象实例 */ public static function singleton($class_name) { //参数分析 if (!$class_name) { return false; } $key = strtolower($class_name); if (isset(self::$_objects[$key])) { return self::$_objects[$key]; } return self::$_objects[$key] = new $class_name(); }
非常详细的代码注释和规范。
3. 每个函数都要有强壮的功能和具备通用性的能力。
笔者不赞成程序员在开发代码的过程中,刻意去追求函数的最小化,例如一定要每个函数小于10行之类的。函数过长对阅读函数的确不好,这个时候就需要将函数中可以重用的代码剥离出来,写几个新的函数。但是如果你的函数无法剥离,或者剥离出来之后,并不能将这些代码重用起来,那么还是别分太细。每个函数应该有自己比较强壮的功能,分太细只会让阅读者看一个函数的具体逻辑而要找N多个函数,这样反而对开发者的阅读起到不良效果。