我真的可以为此提供一些帮助。我正在尝试在我的下一个php项目中使用SOLID原理,但是要理解它确实很困难。首先,我不能真正掌握单一责任原则。
假设我正在创建用户注册。首先,我将创建用于连接数据库的Database类。然后,我将创建Register类,该类将接收来自表单的所有用户输入。我将在Register类中创建方法,该方法将检查输入并对其进行清理。现在来了困难的部分。假设我要检查电子邮件是否已经存在。我还需要检查用户名是否已经存在。为此,我需要访问数据库。因此,我可以将数据库连接传递给Register对象。但是,在我看来,如果我遵循SOLID原则,则不应在我的Register类方法中接触数据库。我真的不明白为什么这样做不好吗?
我可以创建一些DbHandler类,该类将处理查询,绑定参数和执行查询,并将信息从Register对象传递给它,然后检查用户名和电子邮件是否已存在。但这对我来说似乎是不必要的。而且,对于Register类,将要做的事情很少。
比如说创建一些RegisterDB类来处理Register对象的db交互,这将是一个好的解决方案吗?但是同样,Register类只会做几件事。
伙计们,我的头会爆炸,我真的可以为此提供帮助。
答案 0 :(得分:0)
您应该阅读一些有关软件设计和设计原理的文献,似乎您缺乏其中的一些要点。
首先,遵循SOLID是一个很好的方法,但是您应该走得更远,再想一想。
针对您的特定问题:您应该创建一个接口或抽象类来表示您的数据库处理,然后在一个单独的子类中实现特定的数据库处理程序或在此类中实现该接口。这将有助于Liskov的替代原理和界面隔离原理。通过这种方法,您可以在外部使用数据库处理程序的抽象,而不必关心它是MariaDB,OrcaleDB还是其他任何东西,因为您无需处理特定的类。
对于您的验证问题:由于这是一个普遍的问题,因此它也属于您的抽象问题,因为每个数据库处理程序都需要检查用户是否已经存在,因此请随意实现一个采用用户名并返回布尔值的方法(如果这样做)一个已经存在。
整个方法都将满足“依赖倒置”原理,这将提高代码的可维护性,并使代码的可读性更强,更易于扩展,因为您可以随时切换具体的实现,而无需接触使用它们的代码。 >
以下是有关这些主题的一些文献:
https://stackify.com/dependency-inversion-principle/