2007/01 20
前一阵加入到了一个普通项目中的开发,向通过这样来提高自己的团队协作和团队学习。
起初,看了项目的需求,其中提到了采用MVC框架开发,模块化等等。这些词对于phper来说的确很先进。不过我也纳闷,为什么客户会在需求中上写上这些。
进一步了解,开发采用自有的一套框架,和subversion管理。第一点提高了我的兴趣,目前我还没有找到一个完好的适应我的框架,也没有应用某一个框架来进行过完整的开发,正好可以有一个实际例子来学习。subversion也是我的强点。团队开发有管理中有管理就好,至少可以远离团队程序代码的修改混乱。

过了几天,拿回代码一看,傻眼了,我可爱的eclipse提示我上百的错误提示。很快对框架代码的走查,发现此套框架BUG多多,根本无法正常运行,在效率上也差的一塌糊涂。没有任何说明和注释,编程风格乱七八糟,函数耦合相当密切且很多是隐性的修改对象的值而不返回任何值。
比如一下代码

#一下代码都在mysql.php中
                 ///-----------------------------------------------------------------------------
                //  将数组装换成string,数组的元素间用","分开
                ///------------------------------------------------------------------------------
                function handleArray(&$arrayData){
                                if(gettype($arrayData)!="array"){
                                                return ;
                                }
                                for($i=0;$i<count($arrayData)-1;$i++){
                                                $str .=" $arrayData[$i] , ";
                                }
                                $str=$str.$arrayData[$i];
                                $arrayData=$str;
                }
                ///-----------------------------------------------------------------------------
                //以","作为分割符,将string转换成数组
                ///------------------------------------------------------------------------------
                function string2Array(&$stringData){
                                if(gettype($stringData)=="array"){
                                                return ;
                                }
                                $array=split(",",$stringData);
                                $stringData=$array;
                }
                ///-----------------------------------------------------------------------------
                //连接到数据库服务器
                ///------------------------------------------------------------------------------
                function connectDB(){
                                $conn=@mysql_connect($this->db_hostname, $this->db_username, $this->db_password); #$conn在这里
                                @mysql_select_db($this->db_name);
                }
                function closeDB(){
                                @mysql_close($conn); #很明显,$conn是之上面的connectDB中的$conn,但程序上是错误的
                }
#一下这个函数有点离谱了,每一次query都connect一次,而且从不释放
                function query($sql){
                                //print $sql;
                                $this->connectDB();
                                $this->query = mysql_query($sql);
                                return $this->query;
                }
 

我想正好,刚刚学习了重构,赶快用上吧。
开始对这些代码重整,以上代码代码重构为:

        /**
         * 将数组$arrayData装换成string,数组的元素间用$separetor分开
         * @author rollenc
         * @param array $arrayData
         * @param string $separeor =','
         * @return string
         */

        function array2String(& $arrayData, $separetor = ',')
        {
                if(! is_array($arrayData))
                {
                        return $arrayData;
                }
                return implode($separetor, $arrayData);
        }

        /**
         * 以$separetor作为分割符,将string转换成数组
         * @param string $str
         * @param string $separetor
         * @return array
         */

        function string2Array($str, $separetor = ',')
        {
                return array_filter(explode($separetor, $str));
        }
        /**
         * 连接到数据库服务器
         */

        //
        //修正conn -- By rollenc
        function connectDB()
        {
                $this->conn = @ mysql_connect($this->db_hostname, $this->db_username, $this->db_password);
                @ mysql_select_db($this->db_name);
        }
        /**
         * 关闭数据库
         * 修正 -- By rollenc
         */

        function closeDB()
        {
                @ mysql_close($this->conn);
        }
        /**
         * 查询数据库
         * @param string $sql 查询语句
         * @return resource
         */

        function query($sql)
        {
                //print $sql;
                $this->query = mysql_query($sql, $this->conn);
                return $this->query; //没有必要返回
        }
 


重构很好的解决了一些基础代码的问题,但看到相应开发出来的module层和一些公用类时,愣住了:
比如一下文件:

<?php
/*
*+---------------------------------------------------------+
*| This file is part of the ***.PHP FrameWork           |
*| Copyright (c) 2006 ******                      |
*|                                                         |
*|$Id: public.php 464 2006-12-27
*|                                                         |
*|
*| This copyright notice MUST stay intact for use.         |
*+---------------------------------------------------------+
*/


/*
*+---------------------------------------------------------+
*| Public Function Class                                   |
*+---------------------------------------------------------+
*/



class Publics
{
                var $birth_date;
               
                function Publics()
                {
                                $this -> birth_date = $this -> birthday(1920, 2000, 1980);
                }
               
                function birthday($year_start, $year_end, $year_def)
                {
                                $arr_year              = array();
                                $arr_month            = array();
                                $arr_day                = array();
                               
                                for($i=$year_start; $i<=$year_end; $i++){array_push($arr_year, $i);     }
                                for($j=1; $j<=12; $j++) {array_push($arr_month, $j);}
                                for($k=1; $k<=31; $k++) {array_push($arr_day, $k);}

                                $birth['year']    = $this -> select("year", $arr_year, $arr_year, $year_def, $year_def);
                                $birth['month']  = $this -> select("month", $arr_month, $arr_month);
                                $birth['day']      = $this -> select("day", $arr_day, $arr_day);
                               
                                return $birth;
                               
                }
               
                //-----------------------------------------------------
                // 下拉选择框
                //-----------------------------------------------------
                function select($name,$arr_value,$arr_label,$def_value="",$def_label="",$size=1,$other=""){
                                $select  = "<select name=$name size=$size $other>";
                                for($i=0; $i<count($arr_value); $i++){
                                        if($arr_value[$i]==$def_value){
                                                $select .= "<option value=".str_replace(" ","_",$arr_value[$i])." selected class='checkbox'>".$arr_label[$i]."</option>";
                                        }else{
                                                $select .= "<option value=".str_replace(" ","_",$arr_value[$i])." class='checkbox'>".$arr_label[$i]."</option>";
                                        }
                                }
                                $select .= "</select>";
                                return $select;
                }
               
                //-------------------------------------------------------
                // 函数名称:letterTrans($letter)
                // 大小写字母转换:输入大(小)写字母,输出小(大)写字母
                // 变量:$letter
                //-------------------------------------------------------
                function letterTrans($letter)
                {
                                if(ord($letter) <= 90)
                                {
                                                return chr(ord($letter)+32);
                                }else{
                                                return chr(ord($letter)-32);
                                }
                }
       
}

$Public = new Publics;

?>
 

以及这段代码

#这是一个module层的代码
                function QueryLevel0()
                {
                        $conditions = "level='0' ";
                        $orderby = " rank asc ";
                        return $this->Query($conditions, $orderby);
                }
       
                function QueryLevel1()
                {
                        $conditions = "level='1' ";
                        $orderby = " rank asc ";
                        return $this->Query($conditions, $orderby);
                }
       
                function QueryLevel2()
                {
                        $conditions = "level='2' ";
                        $orderby = " rank asc ";
                        return $this->Query($conditions, $orderby);
                }
                function QueryById($id = '')
                {
                        if ($id == "")
                        {
                                $id = $this->id;
                        }
                        $conditions = " id='" . $id . "' ";
                        $orderby = " rank asc ";
                        $num = $this->base->Select($conditions);
                        if ($num == 1)
                        {
                                $this->id = $this->base->values['id'][0];
                                $this->rank = $this->base->values['rank'][0];
                                $this->level = $this->base->values['level'][0];
                                $this->parent_id = $this->base->values['parent_id'][0];
                                $this->name = $this->base->values['name'][0];
                                $this->remark = $this->base->values['remark'][0];
                                $this->role = $this->base->values['role'][0];
                                $this->module = $this->base->values['module'][0];
                                $this->def = $this->base->values['def'][0];
                                $this->open = $this->base->values['open'][0];
                                $this->add_date = $this->base->values['add_date'][0];
                                $this->add_user = $this->base->values['add_user'][0];
                                $this->valid = $this->base->values['valid'][0];
       
                                return true;
                        }
                        return false;
                }
 

从QueryById函数来将,C层调用了QueryById之后,还需要继续访问module的变量,这一点就已经失去了访问透明的概念了。
当我看到这里的时候,我彻底的崩溃了。这不是底层代码的问题了,而是其它的协作者编程的问题。这不是我所知道的任何一种技术能够解决的问题了。
通过了几天的磨合,我承受不住了,采用MVC的方式开发,负责C层的我对M层“返回”(如上QueryById所示,他没有返回给我)和调用无法正常进行,V层也没有很方便的赋值方法和如何赋值的文档,只知道类似于smartytemplate,但又很多不能正常。

没有可运行的底层,没有高级的程序领队,分离的开发却对提供给别人的接口没有任何保证。
崩溃。
Defined tags for this entry:

Posted by rollenc

0 Trackbacks

  1. No Trackbacks

0 Comments

Display comments as(Linear | Threaded)
  1. No comments

Add Comment


You can use [geshi lang=lang_name [,ln={y|n}]][/lang] tags to embed source code snippets
E-Mail addresses will not be displayed and will only be used for E-Mail notifications