今年换了一个新的工作,主要工作内容还是写代码,不过工作性质由之前的移动应用服务器后端api转变为日志数据内容的读取和分析。
实话来说,这个是换糟糕了。这个等过些时段在详细记录一下,其中有着各种错误。
暂且不说工作的对或错的问题,还是吐槽一下这个分析系统的代码。
这套系统(说是系统不如说就是cms)主要目的是供内部人员或者合作方的客服查看数据,分析数据使用。这个cms采用的是ThinkPHP3.1 Release框架开发,开发完成后的代码量也不多,代码结构和逻辑也复杂。
但我所认为槽点确是相当的多啊。
1、业务实现结构混乱
ThinkPHP怎么说也是PHP5,ORM面向对象的开发框架。不过在这系统里面,Controller的业务处理作用几乎是100%,Model几乎被闲置,最最关键的是开发人员说“我觉得Model没有什么用”,我只能表示黑线了。而现在我尽可能的使用Model构建业务,Controller做转发和调用。
2、代码结构不分块,几乎没有组织
是的你没看错,foreach一共嵌套了5层!!!对于能写出这样代码的我深感佩服,你有信心读下去吗?!假如你刚好还要维护这样的代码呢??你一定会崩溃。所幸我目前还不用维护这一部分。我认为不论多么复杂的逻辑以及实现方式,代码业务分块编写,简洁调用这是应该的,不管是维护修改和重新设计都会有好处。尽管这只是一个特例但是有很多Controller里面就是这样的写法,入switch case 块里面做 foreach ,foreach里面进行if else判断等等。
3、代码非常冗余
[php]
//导出excel列表
$import_excel=$params['import_excel'];
if ($import_excel == 1)
{
C ( 'SHOW_PAGE_TRACE', false );
header ( 'Content-Type: application/vnd.ms-excel' );
header ( 'Content-Disposition: attachment;filename=excel.xls' );
header ( 'Cache-Control: max-age=0' );
}
[/php]
这是一段简单的excel导出代码,几乎每一个Controller里面都可能有这个需求,但是这段代码居然是每创建一个Controller就重新复制一遍。天哪你崩溃了吗,很简单的一个解决办法在父控制器类里面加入一个方法,子控制器有需要的调用该方法即可。
[php]
/**
* 查询list导出为excel
* @param int $import_excel
* @param string $outname
* @author Lei
* @time 2013-10-10 13:56:30
*/
protected function headerExcel($import_excel, $outname){
if ($import_excel == 1) {
C ( 'SHOW_PAGE_TRACE', false );
header ( 'Content-Type: application/vnd.ms-excel' );
header ( 'Content-Disposition: attachment;filename='.$outname.'.xls' );
header ( 'Cache-Control: max-age=0' );
}
}
[/php]
同样还有很多地方的代码相当冗余,几乎每一个类文件里面都包含那几个方法,差别的只有对应的参数值。
4、条件分支被大量滥用
[php]
$table_name="";
if($this->partition=='1'){
$table_name=C("DB_PREFIX").$this->tablename.date("Ymd",strtotime($date));
if(empty($mksql_array[$table_name])){
$_makesql=str_replace("{TABLE_NAME}",$table_name,$this->_makesql);
$sql = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where `TABLE_SCHEMA`='".C("DB_NAME")."' and TABLE_NAME ='".$table_name."'";
$tablelist = $model->query($sql);
if(empty($tablelist)){
$model->query($_makesql);
}
$mksql_array[$table_name]=1;
}
}elseif($this->partition=='2'){
$table_name=C("DB_PREFIX").$this->tablename.date("Ym",strtotime($date));
if(empty($mksql_array[$table_name])){
$_makesql=str_replace("{TABLE_NAME}",$table_name,$this->_makesql);
$sql = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where `TABLE_SCHEMA`='".C("DB_NAME")."' and TABLE_NAME ='".$table_name."'";
$tablelist = $model->query($sql);
if(empty($tablelist)){
$model->query($_makesql);
}
$mksql_array[$table_name]=1;
}
}else{
$table_name=C("DB_PREFIX").$this->tablename;
if(empty($mksql_array[$table_name])){
$_makesql=str_replace("{TABLE_NAME}",$table_name,$this->_makesql);
$sql = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where `TABLE_SCHEMA`='".C("DB_NAME")."' and TABLE_NAME ='".$table_name."'";
$tablelist = $model->query($sql);
if(empty($tablelist)){
$model->query($_makesql);
}
$mksql_array[$table_name]=1;
}
$table_name=C("DB_PREFIX").$this->tablename;
}
[/php]
你会看到这里的if else 里面的块代码就是一模一样的,只是上面的一个参数差别。显而易见的是我们可以写一个函数把参数传递进去即可。
[php]
/**
* 检测以及创建对应的logtable
*
* @param string $date
* @return string
* @author Lei.Lu
*/
protected function createLogTable($date){
$model = M ();
static $mksql_array = array ();
$table_name = "";
$dbprefix = C ( "DB_PREFIX" );
switch ($this->partition){
case '1':
$table_name = $dbprefix . $this->tablename . date ( "Ymd", strtotime ( $date ) );
break;
case '2':
$table_name = $dbprefix . $this->tablename . date ( "Ym", strtotime ( $date ) );
break;
default:
$table_name = $dbprefix . $this->tablename;
}
if (empty ( $mksql_array [$table_name] )) {
$_makesql = str_replace ( "{TABLE_NAME}", $table_name, $this->_makesql );
$sql = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where `TABLE_SCHEMA`='" . C ( "DB_NAME" ) . "' and TABLE_NAME ='" . $table_name . "'";
$tablelist = $model->query ( $sql );
if (empty ( $tablelist )) {
$model->query ( $_makesql );
}
$mksql_array [$table_name] = 1;
}
return $table_name;
}
[/php]
5、各种不规范的地方
代码逻辑不用了,注释起来。不删除
这样的变量赋值
╮(╯▽╰)╭
魔法数字的滥用,写到哪个就是哪个
代码格式的不规范;变量、方法名的命名一会拼音,一会英文;单点登录的用户信息数据传输不加密。。。等等
总体而言,代码作者的完成意识一切以功能出来为主,在controller里想到哪写到哪,没有代码分块,系统MVC分层的概念,Model、module更不会用。更不用说那些规范方面的问题了,让人有各种糟糕的感觉。
尽管如此,但是我还是得坚持。
不过也不能说明这个cms就是一无所用的,存在即为合理,看来确实如此,所在部门包括我就两个程序,其他都是小白,如一个网页缓存没刷开页面都不知道怎么解决的那些人是不考虑这些问题的,既然在这里要求他人改变,他人不改变那么我也只好自己保持自我,直到不用忍耐的那天。