我与一位同事进行了设计讨论。
我们正在实现PHP MySQL数据库应用程序。在第一个实例中,我们为特定表编写了Insert Get Update Delete,SelectAll和Search函数,在代码中写了表和字段名,包含几个php文件,一个用于对象类,一个用于绘制HTML表。 table,一个用于编辑该表的一行,一个包含上述函数,等等。
分歧来了,因为我现在编写了从数据库读/写的通用函数,并以表名作为参数绘制HTML,让这些函数从数据库或类中发现字段名。所以现在代码可以用于任何表,任何字段都无需手动更改每个需要更改的函数。我知道有些情况下需要更多特定于表的功能,而且我认为这应该在需求出现时进行,尽可能集成通用部分。
另一方面,我的同事坚持认为我们应该为每个表分别保存一组文件,即每个表大约5个php文件。在每种情况下,读/写函数的写入方式不同,需要对所有表进行任何更改,以影响5 x个表的次数。
我可以肯定地说,数据库中将有超过15个主表,至少需要基本的功能。
您认为哪种方法最合适?
答案 0 :(得分:2)
编程中的一个重要原则是DRY:不要重复自己。因此,几个用例的常见内容应该在一个位置写入一次。
现在,我从来没有必要开发一个应用程序,其中每个数据库表具有相同的,通用的crud页面。如果是这种情况,它将不是一个功能应用程序,而是一个数据库管理应用程序。你确定你没有重新开发phpMyAdmin吗?
答案 1 :(得分:0)
如果您需要相同的代码来处理多个表上的几个基本操作,我会说您不应该多次编写该代码:不需要重复:
一种可能的解决方案是将尽可能多的公共代码放入单个类中,这对很多表来说是通用的。然后,为每个表都有一个特定的类,它将扩展该公共类。
这样:
关于这一点,请参阅手册的Object Inheritance部分。
关于这个常见的类想法,如果你的CRUD足够通用,你甚至可以走得更远,几乎不写任何代码:有些ORM框架可能会为你做这些。
例如,您可能需要查看Doctrine。
答案 2 :(得分:0)
我们处于开发的第一阶段,我们没有完整的功能规范来开发我们正在开发的Web应用程序。是的,我们知道,但这不是我们的错。
因此,我们正在构建一些部件,使它们非常简单和直接,因此当我们有更多关于构建内容的详细信息时,我们可以在此基础上构建。
我们为客户,广告,用户提供了一个部分......我希望将事情分开,因为我们不知道将来会发生什么。是的,目前我们只有几个字段和一些基本列表和编辑页面,但所有这些都会增长。
并不是我不想实现一些我们可以重用的通用代码。这是我们不知道在不久的将来会有什么限制,我不想编写我们必须强烈参数化的通用代码。
例如,Alex构建了一个传递对象的通用Update方法,它将创建一个UPDATE SQL语句并执行它。好的,这很酷,但这对Web应用程序的用户部分不起作用,因为我们存储了编码的密码。首先,它不会对密码进行编码。其次,如果您编辑用户并且未在密码和密码确认字段中输入任何内容,则旧密码将保留。因此,我们遇到了通用Update方法的问题,正如我所看到的,有两种可能的解决方案:
a)参数化Update方法,以便在修改用户时,如果对象上的密码为空,请保留密码。然后编码密码。
b)覆盖子类的Update方法。
Alex的实现没有使用继承,他在静态类中使用泛型方法,他称之为DataAccess::Update($object);
。该方法从类名中获取表名,因为他修改了数据库以使它们匹配(我更喜欢表的“Clients”和类的“Client”)。因此,Alex的实现无法使用选项b。
我尝试构建它的方式是为每个表保留单独的Update方法。是的,我正在重复自己,但正如我之前所说,我们没有完整的规范,所以我们不知道它会如何发展。我们有一个想法,但我们没有确切的细节。
所以,这里的重点是,在我们有更详细的规范之前,我不想编写通用代码,这样我们就可以评估各部分之间可以共享的内容和什么内容。
并非Web应用程序的所有部分都工作相同,正如JB Nizet所说:“如果是这种情况,它将不是一个功能应用程序,而是一个数据库管理应用程序。”
我可以肯定地告诉你这不是一个数据库管理应用程序,尽管Alex会说“我们只是在构建一个数据库应用程序”。好吧,也许,但数据库应用程序不仅显示/修改表。而现在,观点并不能解决所有问题。
同样,正如JB Nizet所说:“如果是这种情况,它将不是一个功能应用程序,而是一个数据库管理应用程序。”
现在我再次重复自己,但这次没有理由。
感谢您的时间。