所以我正在编写DataBase
类,它将是PHP Controller
和MySQL View
之间的封装层。
interface iDataBase {
public function drug($action, $drug);
public function company($action, $company);
public function activeIngredient($action, $activeIngredient);
}
首先,我想让所有的setter和getter分开,如getAllDrugs(),updateDrug(),removeDrug(),getForUpdate(),getDrug()等等,但后来我意识到我也在污染数据库界面很多功能,加上这是一个非常小规模的版本,我正在考虑添加更多的类和更多的功能。所以,我没有使用很多函数,只是设置为3 $action
将决定用户想要用某个类做什么样的事情。所以,目前可能的行动包括:"add", "getAll", "getForUpdate", "update", "remove"
但$action
掩盖的这些函数有不同的事情要做,所以它们的返回结果不同,第二个参数也可以不同。
我的解决方案是一个好习惯吗?我相信很多人都有同样的问题,你是怎么解决的?有任何可能的问题吗?
P.S。 Drug, Company, ActiveIngredient
都是类
答案 0 :(得分:3)
一个功能应该有明确定义的,狭隘的职责,明确定义的极简主义回报类型。如果你开始创造“上帝的功能”,它可以做任何事情,厨房下沉取决于你传递的论点,你将大量进入难以维护意大利面条代码的领域。你不想要一个做A的函数,如果你把它传给X就返回B,但是如果你把它传给Y就做C并返回D ......等等。
当你看到类似的模式出现时,启动具体并随着时间的推移进行概括是一个好主意。因此,创建您实际需要的方法:
public function findUserById($id)
public function findUserByEmail($email)
public function updateCompanyName($id, $newName)
如果您发现这些功能之间共享代码,请在幕后统一代码以使其保持干燥状态:
public function findUserById($id) {
return $this->find('SELECT * FROM user WHERE id = ?', $id);
}
public function findUserByEmail($email) {
return $this->find('SELECT * FROM user WHERE email = ?', $email);
}
protected function find($query, $arg) {
...
}
不要反过来开始,认为你“只需要X,Y和Z”,它们似乎足够相似,可以统一到一个方法中,然后发现X,Y和Z之间存在细微差别并乱扔垃圾你的代码,每个特殊情况。这只会带来巨大或一般的功能,它们基本上什么都不做。
答案 1 :(得分:2)
你可能正在寻找的是TableDataGateway(强调我的):
表数据网关保存用于访问 单 表或查看的所有SQL:选择,插入,更新和删除。其他代码调用其方法与数据库进行所有交互。
这意味着您将拥有一个通用数据库适配器,例如PDO对象。你把它注入你的各种TDG。然后,TDG将该适配器用于数据库中的CRUD数据。
class CompanyTableGateway
{
private $dbAdapter;
public function __construct(DBAdapter $dbAdapter)
{
$this->dbAdapter = $dbAdapter;
}
public function create($name, $street, $whatever)
{
$this->dbAdapter->exec( 'INSERT INTO companies …' );
}
public function findById($id)
{
return $this->dbAdapter->exec(
sprintf('SELECT * from companies where id = %d', $id)
);
}
// more methods …
}
如果您有多个这些网关,则可以将常规CRUD逻辑抽象为Abstract类,然后从中扩展具体网关。
然后,您将使用TableModule或类似的其他对象来调用各个网关上的方法。
答案 2 :(得分:1)
关于分离关注与单一责任原则的永无止境的讨论。
关注点分离(SoC) - 将计算机程序分解为尽可能少地在功能上重叠的不同功能的过程。关注点是程序中的任何兴趣或焦点。通常,顾虑与特征或行为是同义词。 http://en.wikipedia.org/wiki/Separation_of_concerns
单一责任原则(SRP) - 每个对象都应该承担一项责任,并且其所有服务都应该与该职责严格一致。在某种程度上,Cohesion被认为是SRP的同义词。 http://en.wikipedia.org/wiki/Single_responsibility_principle
尽量充分利用两者,并相应地为您的课程建模。
答案 3 :(得分:1)
我建议你做的是做一个全局数据库类,它控制数据库的基本输入/输出,然后将其扩展到每个表。
此示例可以是Users表。您可以对此表做什么
然后,您将使用Users Class扩展超级数据库类,该类将为您希望拥有的每个函数提供getter和setter,即:
class Users extends DatabaseClass {
public function update ( $params )
{
// Make the code for an update, and let the SuperClass execute the code.
...
}
public function add ( $params )
{
...
}
public function delete ( $params )
{
...
}
}
这将允许您以后轻松地向Users表添加更多功能,并针对您正在使用的表/数据优化查询。