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,但又很多不能正常。
没有可运行的底层,没有高级的程序领队,分离的开发却对提供给别人的接口没有任何保证。
崩溃。
起初,看了项目的需求,其中提到了采用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: PHP



0 Trackbacks