有两个方案A和B。A和B差异就是,A把数据处理和组装查询条件放在控制器里面。而B把两者放在了功能点里面。如何只看注释,A看不出来功能点是按照什么来查询的,输入的是数组。而B则直观看出输入的是字符串keyword。
参数的定义和功能的定义应该相吻合。类似第一范式设计。
尽量降低模块接口的复杂程度
模块接口是模块与外界进行通信的通道,较复杂的接口往往会带来较高的耦合。因此,应努力降低模块接口的复杂程度。对此,可以从以下两个方面作出考虑:
a.接口参数尽量采用简单数据类型,以使接口容易理解。例如,尽量使用基本字符、整 数类型,而不是数组、指针、结合体类型。
b.限制接口参数的个数。接口参数个数太多,往往是由于模块功能混杂,不得不依靠参 数进行调控。因此,过多的参数往往意味着模块还有进一步分解的必要。
<?php
/**
* 方案A
*/
/**
* 公告服务
*/
class AdService
{
/**
* 获取公告列表(功能点)
* @param array $condition 查询条件
* @param int $page 页码
* @param int $size 单页数据的条数
* @return array 查询出来的数据列表,是数组
*/
public function getAdList($condition = [], $page = 1, $size = 10)
{
//查询数据库
return Db::table('ad')
->where($condition)
->page($page, $size)
->select();
}
}
/**
* Web控制器
*/
class AdController
{
//获取公告列表
public function getAdList()
{
//获取post数据,需要搜索的关键字,用于搜索标题或内容
$keyword = getPost('keyword');
//对post数据处理,去掉两端的空白字符
$keyword = trim($keyword);
//页码
$page = getPost('page');
//单页数据条数
$size = getPost('size');
$adService = new AdService();
//组装查询条件
$condition = [
//对标题或内容按照关键词搜索
'title|content' => ['like', "%$keyword%"]
];
//调用服务中的功能点
$dataList = $adService->getAdList($condition, $page, $size);
return json($dataList);
}
}
<?php
/**
* 方案B
*/
/**
* 公告服务
*/
class AdService
{
/**
* 获取公告列表(功能点)
* @param string $keyword 需要搜索的关键字,用于搜索标题或内容
* @param int $page 页码
* @param int $size 单页数据的条数
* @return array 查询出来的数据列表,是数组
*/
public function getAdList($keyword = '', $page = 1, $size = 10)
{
//数据处理,去掉两端的空白字符
$keyword = trim($keyword);
//组装查询条件
$condition = [
//对标题或内容按照关键词搜索
'title|content' => ['like', "%$keyword%"]
];
//查询数据库
return Db::table('ad')
->where($condition)
->page($page, $size)
->select();
}
}
/**
* Web控制器
*/
class AdController
{
//获取公告列表
public function getAdList()
{
//获取post数据,需要搜索的关键字,用于搜索标题或内容
$keyword = getPost('keyword');
//页码
$page = getPost('page');
//单页数据条数
$size = getPost('size');
$adService = new AdService();
//调用服务中的功能点
$dataList = $adService->getAdList($keyword, $page, $size);
return json($dataList);
}
}