项目和新需求:

我们有一个PHP写的webmail系统,有一个mail_list.php用于展现用户的邮件列表这个页面支持folderId参数(因为邮件是存在不同的文件夹下的)由于邮件太多所以支持翻页。现在需要在系统里增加标签。细化下来:需要在原有的邮件列表里增加标签列,和支持tagid检索出一个邮件列表(列表里也增加标签列)

代码和新需求
mail_list.php调用GetMailList函数,这个函数传入文件夹ID,页码,页大小,得到HTML TABLE和导航链接
GetMailList用T_Page类得到请求的一页数据再处理为HTML表格
虽然T_Page只支持单表查询,但是在整个系统里还是被广泛使用

因为动T_Page还是有风险的,所以最好继承它,然后让需要多表查询的地方直接实例化子类


重构前

/*
功能:查询指定文件夹下的特定页的邮件列表(HTML Table)
*/
function GetMailList($folderId, $pageNo, $pageSize)
{
global $db_obj, $pageLink, $html; // db_obj是从外部导入使用,后两个似乎要导出去 $query = " where folderId = $folderId ..."; //省略很多行
$pageclass = new T_Page;
$tableName = "mail";
$condition = $query . "order by tm desc";
$pageclass->BaseSet($tableName, "id,sender,subject,content,...", $pageNo, $pageSize, $db_obj);
$pageclass->SetCondition($condition); $record = $pageclass->ReadList(); // 查出来的记录集,被放到二维数组里
$pageLink=$pageclass->Page(); //存放翻页按钮的数组 $html = "<table>";
for($ipage=0;$ipage<$pageSize;$ipage++)
{
$i=$ipage; $id = $record[$i]["id"];
$sender = $record[$i]["sender"];
$subject = $record[$i]["subject"];
$content = $record[$i]["content"]; $html = $html . "<tr><td><input type=\"checkbox\" value=\"$id\"></td>";
$html = $html . "<td>$subject</td>";
...
}
$html = $html . "</table>";
}
/*
功能: 查询"一页"记录,且输出导航链接用于翻页
*/
class T_Page
{
var $TableName;
... function BaseSet($TableName, $Fields, $PageNo, $PageSize, $Obj_DB)
{
$this->TableName = $TableName;
... $this->MaxLine = $this->PageSize;
$this->Offset = $this->PageNo * $this->PageSize;
} function SetCondition($Condition)
{
$this->Condition = $Condition;
} function ReadList()
{
$SQL = "select count(*) as recordtotal from $this->tableName $this->Condition";
$result = $this->Obj_DB->simpleQuery($SQL);
$row = $this->Obj_DB->fetchRow($result, DB_FETCHMODE_ASSOC);
$this->Total = $row["recordtotal"]; if($this->Total > 0)
{
$SQL = "select $this->Fields fom $this->tableName $this->Condition limit $this->Offset, $this->MaxLine;";
$result = $this->Obj_DB->simpleQuery($SQL);
$this->Number = $this->Obj_DB->numRows($result); while($row = $this->Obj_DB->fetchRow($result,DB_FETCHMODE_ASSOC))
{
$this->Result[]=$row;
}
$this->Obj_DB->freeResult($result);
}
return($this->Result)
} function Page()
{
if($this->PageNo > 0)
$this->PageLink[0] = "<a ...>上一页</a>";
else
$this->PageLink[0] = "<a>上一页</a>";
...
return $this->PageLink;
} // more function
}

重构后

class MailPage extends T_Page
{
function setTotal()
{
...
$this->Total = $row["recordtotal"];
} function getMailList()
{
$Fields = $this->Field . " ,'' as taglist ";
$SQL.="select $Fields from $this->Table $this->Condition";
$SQL.=" LIMIT $this->Offset , $this->MaxLine"; ...
} function addTagList()
{
     ...
$tagList = Array();
for($i=0; $i < $this->Number; $i++)
{
$key = $this->Result[$i]["id"];
$this->Result[$i]["taglist"] = $tagList[$key];
}
} //覆盖父类的接口
function ReadList()
{
$this->setTotal();
$this->getMailList();
$this->addTagList();
return $this->Result;
}
} class TagPage extends MailPage
{
function SetCondition($taglist)
{
...
$this->Condition = sprintf(" where id in (%s) order by tm desc ", $mailList);
}
}

PHP程序的一次重构记录的更多相关文章

  1. XE 的程序升级 XE5 问题处理记录

    XE 的程序升级 XE5 问题处理记录 1.  [dcc32 Fatal Error] frxClass.pas(3556): F1026 File not found: 'xxxxx\Registr ...

  2. Linux 系统运行着许多子系统和应用程序。您可以使用系统日志记录从启动时就收集有关运行中系统的数据。有时

    概述 在本教程中,您将学习以下内容: 配置 syslog 守护程序 了解标准设施.优先级和操作 配置日志轮换 了解 rsyslog 和 syslog-ng 系统内部发生了什么 Linux 系统运行着许 ...

  3. MVC应用程序的jQuery代码重构

    先看看这篇<在jQuery定义自己函数>http://www.cnblogs.com/insus/p/3415444.html 程序越看越是有重构的地方. 先看1部分,由于在#16代码有宣 ...

  4. #华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else

    1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码 ...

  5. 华为云&#183;寻找黑马程序员#【代码重构之路】如何“消除”if/else【华为云技术分享】

    1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码 ...

  6. 记一次百万行WPF项目代码的重构记录

    此前带领小组成员主导过一个百万行代码上位机项目的重构工作,分析项目中存在的问题做了些针对性的优化,整个重构工作持续了一年半之久. 主要针对以下问题: 1.产品型号太多导致代码工程的分支太多,维护时会产 ...

  7. 最简单的记录程序运行时间的方法:[记录PHP程序运行消耗时间]

    比较实用的debug方法:具体参考地址已经记不清了,这里重写成类方便调用 /** * @author logonmy@126.com * @Date: 13-7-23 * @desc example ...

  8. 微信小程序开发之带搜索记录的搜索框

    实现功能:点击搜索框,有搜索记录时以下拉菜单显示,点击下拉子菜单,将数据赋值到搜索框,点击搜索图标搜索,支持清空历史记录,可手动输入和清空查询关键字, UI: wxml: <!--查询历史记录数 ...

  9. 编写第一个Linux环境下程序的编译,下载记录

    跟着韦东山学习Linux: 今天系统系统性的学了代码的编译下载,条记录一下: 一,代码:001_led_on.S,就把下面代码编译后Bin文件下载进2440处理器. /* * 点亮LED1: gpf4 ...

随机推荐

  1. sql语法:inner join on, left join on, right join on具体用法

    inner join(等值连接) 仅仅返回两个表中联结字段相等的行 left join(左联接) 返回包含左表中的全部记录和右表中联结字段相等的记录 right join(右联接) 返回包含右表中的全 ...

  2. How to let gedit of linux display "space"

    gedit--> preference --> check "draw spaces" . Then gedit  will display spaces

  3. Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流)

    1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creat ...

  4. Spring MVC的异常统一处理方法

    我们经常需要统一配置项目的异常处理,又希望统一处理异常代码,同时不侵入原有的正常代码.我们可以通过以下三种方式实现统一处理项目的自定义异常. 通过SimpleMappingExceptionResol ...

  5. 加快modelsim仿真速度的方法(原创)

    ①仿真精度越高,仿真效率月底. 仿真时采用`timescale 1ns/1ns比采用1ns/100ps的仿真效率高 simulation was two billion ns. ②clock gene ...

  6. windows下使用redis,Redis入门使用,Redis基础命令

    windows下使用redis,Redis入门使用,Redis基础命令 >>>>>>>>>>>>>>>> ...

  7. php-fpm 的安装与LNMP测试

    1. 下载并安装PHP 1.1 编译安装 1.1.1 安装前的准备 下载并安装libmcrypt 和 libmcrypt-devel[root@test /opt/soft]# wget ftp:// ...

  8. java新手笔记2 数据类型

    1.注释 /** doc注释 * 类说明信息 */ //声明类 文件名与类名一致 public class World {//类定界符 //声明方法 main方法 public static void ...

  9. 时间处理得到UTC时间

    在工作过程遇到了时间处理的问题,因为需要统一将时间处理按照utc时间进行处理,因此,不能简单的通过系统运行直接得到时间的毫秒数,这样会在不同时区得到的值是不同的. import java.text.P ...

  10. 九度OJ 1086 最小花费--动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1086 题目描述: 在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对 ...