一个庞大的应用程序,每隔几个月就会增加一个新的模块,5-10个程序员
一些模块访问相同的表,一些模块使用(当前)相同的查询
我的问题是,使每个模块成为100%独立的应用程序,使用它自己的DAL类和BL类(库类,ZF,共享,当然),或者所有模块是否都使用相同的资源(类)会更聪明吗? ?
我唯一确定需要通用的是用户配置文件/ ACL / auth数据,它位于OpenLDAP服务器上。
答案 0 :(得分:3)
在大型易变环境中共享代码时应该小心。在很多情况下,快速演变和变化会导致不兼容,可能会导致只在生产中发现的问题。
共享代码最重要的影响就是测试。特别是当依赖项受到潜在破坏性更改的影响时 - 测试成本会成倍增加。此费用通常会导致在进行更改时执行很少或不执行测试。因此,缺陷蔓延到生产环境中。
代码体越成熟,就越能在模块或系统之间共享它。成熟的代码往往是稳定的,变化不大。它还应该拥有最强大的单元和集成测试库,以支持它。成熟的代码通常由许多用户执行,并且您对检测到并修复了错误的信心更高。
相反,不成熟的代码往往会经常发生变化 - 而且这些变化往往会产生破坏性。通常情况下,公共界面会发生变化 - 这会导致模块的大量重构工作依赖于它,或代码库的分支,这违背了共享代码的目的。
如果您确实选择共享代码库的某些部分,则应确保为每个模块/系统配备一套单元和集成测试,以验证现有使用不会受共享代码更改的影响。您还应该考虑通过命名约定或版本控制实践使共享代码非常明显。
根据我的经验,以下是共享代码可以合理安全的一些情况(假设您拥有良好的版本控制和变更管理实践):
答案 1 :(得分:1)
如果它是一个大型系统,不要认为它会变得更聪明,可能会导致维护噩梦。
重用很重要,重复不是。
答案 2 :(得分:1)
我认为您应该对模块进行分区,以便它们不共享表或查询。
面向服务的体系结构,无论您决定是否根据分布式Web组件实现它,都会将业务功能和它们拥有的数据隔离开来。如果您正确执行此操作,则没有共享表或查询,以及与该数据交互的单个界面。在我建议分享之前,我会花时间重新设计该标准。
答案 3 :(得分:0)
我想说要分享。我已经看到了足够的评论方法//如果你改变这个功能你也必须改变......规则并没有严格遵守 - 这是一个维护噩梦。你为什么不分享?您是否希望设计保持稳固且不受影响?
答案 4 :(得分:0)
查询应该从不重复。如果您在两个位置内联相同的数据库查询,则需要重构该代码, AT LEAST 将通过相同的客户端代码。或者,最佳实践将要求您清点和控制数据接口,以便明确您对后端提供的数据服务的期望。如果查询的行为以相同的方式开始,然后必须在某些调用之间变化,那么您至少可以看到调用者以查看哪些需要更改。如果它以相同的方式开始并且需要在许多地方进行相同的更改,那么您将会感到安慰系统没有重复。
如果您使用的是关系数据库范例,我将始终只使用SP。应用程序永远不会具有SELECT访问权限,因此您可以控制数据库的边界。
如果您正在使用OO方法来应用程序设计,这应该有助于处理关注点的分离和理解,限制依赖关系并控制各个子系统接口的可见性。
我希望应用程序共享公共库,并且库将公开各种子系统。在.NET世界中,这将是许多单独的程序集,它们代表子系统的不同逻辑部分,并非构成系统的每个Web服务,控制台应用程序,表单应用程序,Web应用程序或服务/守护程序都需要所有这些部分。
尽管LBushkin对于快速变化的代码共享难度是正确的,因为许多消费者可能会期望不同的行为 - 随着代码的成熟,使用正在使用的代码所获得的可靠性和舒适性在许多地方使用是指数级更大。即你知道在任何地方运行的代码总是更可靠 - 特别是.NET中的泛型类。