多重功能在PHP的一个大功能?(multiple functions is one big func

2019-09-25 16:08发布

所以我写DataBase类,这将是之间的密封层PHP ControllerMySQL 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()等一个,但后来我意识到,我是无污染的数据库接口太多的功能,再加上这是一个小规模非常的版本,我正在考虑增加多少,更多的类和更多的功能。 所以,而是采用了很多我只是setteled为3.功能$action将决定什么样的事情呢用户希望与某一类的事情。 因此,就目前而言,可能的操作是这些: "add", "getAll", "getForUpdate", "update", "remove"

但这些功能被屏蔽$action有不同的事情要做,所以他们的返回结果是不同的,第二个参数也可以是不同的。

是我的解决方案一个好的做法? 我相信你们很多人有同样的问题,你是怎么解决的呢? 是否有任何可能出现的问题?

PS Drug, Company, ActiveIngredient是所有类

Answer 1:

函数应该有明确的规定,有明确界定的,简约的返回类型窄责任。 如果你开始打造“神的功能”,它所做的一切取决于你传递什么样的参数厨房水槽,你会大举进入的硬境内维持面条代码。 你不想,做了,如果你把它传递X返回B,但确实℃,如果你传递Ÿ等返回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小的差异,并与乱抛垃圾代码特殊情况下,每个。 这只是导致它们要么极大的相左右,一般来说,他们基本上都是自己做什么功能。



Answer 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逻辑放到一个抽象类,然后从它延长混凝土网关。

然后,您将使用TableModule或类似的其他对象调用对个人网关的方法。



Answer 3:

关注VS单一职责原则相分离的永不落幕的讨论。

  • 关注(SoC)的分离 - 是断裂的计算机程序到可在功能尽可能少重叠的不同特征的过程。 一个问题是任何一件在程序的兴趣或关注的焦点。 通常情况下,关注的是与功能或行为的代名词。 http://en.wikipedia.org/wiki/Separation_of_concerns

  • 单一职责原则(SRP) - 每个对象都应该有一个责任,那它的所有服务应与责任狭隘地对齐。 在一定程度上接应被视为同义词SRP。 http://en.wikipedia.org/wiki/Single_responsibility_principle

尽量让最好的两个,而你的类相应的模型。



Answer 4:

我建议你做的是做一个全球性的数据库类,它控制数据库的基本输入/输出,然后扩展这个到每个表。

这方面的例子可能是一个用户表。 你可以做这个表

  1. 创造
  2. 更新
  3. 删除

然后,您将延长超级数据库类,用类的用户,这将有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 )
    {
        ...
    }
}

这将允许您以后,容易在用户表中添加更多的功能,特别优化查询为您所使用的表/数据。



文章来源: multiple functions is one big function in PHP?
标签: php mysql oop crud