【问题标题】:CF Project getting too big, what shall one do?CF项目太大了,怎么办?
【发布时间】:2011-04-18 23:17:00
【问题描述】:

一个简单的计费系统(在 ColdBox MVC 之上)正在膨胀为一个半企业库存 + 配置 + 问题跟踪 + 利润跟踪应用程序。他们似乎在做自己的事情,但他们共享许多东西,包括共同的客户和员工(登录)池,以及其他混合的数据和业务逻辑。

您如何保持这样的系统模块化?从维护可测试性可重用性的角度来看?

  • 单个单体应用? (即基础应用的新包)
  • ColdBox 模块?不确定如何使其“可安装”以及它带来什么好处。
  • Java Portlet?不知道,只是跳出框框思考
  • SOA 架构?通过网络服务 API 调用?

您有什么想法和/或经验想分享吗?

【问题讨论】:

  • 嘿亨利,您可能想将 ERP 标记与问题联系起来,它可能会带来更多观点。

标签: model-view-controller coldfusion erp coldbox


【解决方案1】:

我建议您使用 ColdBox Modules 将应用程序分解为模块化部分。您还可以将单独的业务逻辑研究到 RESTful ColdBox 层中,并以这种方式加入系统。同样,这完全取决于您目前的要求和需要。

模块旨在将单一应用程序分解成更易于管理的部分,这些部分可以独立或耦合在一起。

【讨论】:

  • Module 如何真正打破单体应用?我无法想象它如何帮助将模型与父应用程序的模型解耦,除了在需要时很容易将其复制出来,除非模块的模型是完全独立的?谢谢
  • 首先进行一轮分析以了解系统的较大部分并了解它们如何相互耦合。这将决定可以在这里发挥作用的主要模块。此外,每个模块都可以与作为 soa 策略的一部分的公共域服务交互,或者只是整个域模型的一部分和公共库模块的一部分。模块本身只会使用这些服务并提供它自己的。如果您有如此大的内聚应用程序,则并非所有内容都将完全解耦。那是不可得的涅槃。您必须在模块化和
  • 还有耦合。良好的领域模型模型架构将对您有所帮助,并且如果您利用诸如wirebox 或cold spring 之类的di 库,您可以更好地管理这些领域对象以及et 的连接方式。同样,我的建议是记录应用程序的大图,并找到一个您拥有通用服务和特定服务的地方并相应地构建您的模块
  • 谢谢 Luis,我会先阅读 CB 的模块文档。对使用 ColdBox Relax 将应用程序转变为 SOA 架构有何评论?何时使用它,它带来什么好处?再次感谢
【解决方案2】:

停止思考技术(例如 Java 门户、ColdBox 模块等)并专注于架构。我的意思是想象你如何向观察者解释你的系统。首先在白板上绘制一组框,代表每件作品 - 库存、客户、问题跟踪等…… - 然后使用线条显示这些系统之间的交互。这让您关注separation of concerns,它像功能一样组合在一起。首先不要担心 UI,而是专注于算法和数据。

如果我们谈论的是 MVC,那么这一步就是专注于模型。随着该活动的完成,困难的部分来了,修改代码以符合该图(即模型)。要真正理解这个模型应该是什么样子,我建议阅读 Eric Evans 的Domain Driven Design。目标是建立一个模型,其关系可通过dependency injection 进行管理。大概这会为您留下一组高级 CFC(如果您愿意的话,可以提供服务)以及底层业务实体和持久性管理。他们的关系最好由某种 bean 容器/服务定位器来管理,我相信 ColdBox 有它自己的,另一个例子是 ColdSpring。

这项工作的结果是一个可单元测试的模型。独立于用户界面。如果所有这些都令人困惑,我建议您查看Working Effectively with Legacy Code,了解有关如何进行此转换的一些想法。

一旦你有了这个,现在就可以考虑一个控制器(例如ColdBox)并通过它将模型链接到视图。但是,请仔细研究任何控制器并选择它,因为它可以为您的应用程序带来一些功能(缓存是一个例子)。您的视图可能也需要重新构想才能与这个新设计交互,但您应该拥有一个算法现在与 UI 分离的系统,从而使视图的工作变得容易。

实际上,您解决此问题的方式是迭代的。找到一个可以按照我描述的方式轻松梳理的系统,通过单元测试对其进行测试,并与人员一起验证,然后继续下一个系统。虽然这是一个乏味的过程,但我可以保证它比尝试重写所有内容要少得多,除非您提前拥有一套非常好的自动验证,否则会招致灾难。

更新

重申一下,技术无法解决您的问题。将朝着更具凝聚力的对象继续迭代。

现在就耦合数据而言,使用 ORM 已经做出了权衡,而单体系统确实有其优势。另一种方法是通过 DI 为一个有状态实体提供对另一个服务对象的引用,以便您通过它检索它。这将使您能够模拟它以进行单元测试,并将其替换为类似的服务对象和相应的实体,以促进在其他上下文中的重用。

就解决业务问题(例如会计)而言,重用是一种新兴属性,您可以编写多个系统来做大致相同的事情,然后弄清楚如何进行泛化。根据我的经验,您很少会开始编写一些东西来解决一些成为可重用组件的业务问题。

【讨论】:

  • 我已经在使用带 DI 的 DDD。但是,我想知道我提到的哪些技术可以让我更好地组织这些部分。高级视图表明它们应该更松散耦合,但实际情况是数据库表必须耦合(例如,FK 到 Staff.staff_id)。一旦耦合,就很难再使用了。寻找两全其美的解决方案,但似乎没有。
【解决方案3】:

我建议您花一些时间来研究模块。它将有助于将您的代码划分为逻辑特征,同时保持与模型的集成。

作为 ColdBox,有大量的文档和示例...

http://wiki.coldbox.org/wiki/Modules.cfm

http://experts.adobeconnect.com/p21086674/

【讨论】:

    【解决方案4】:

    您需要摆脱 MVC 并用 SOA 架构取而代之,这样将两部分连接起来的唯一东西就是服务请求。

    所以在服务器端你有 DAO 和 FACADE 层。客户端可以是 MVC 或您想在其他地方使用的任何架构。您甚至可以为每个不同的业务拥有一个单独的客户。

    即使对于服务器端,您也可以将项目分解为多个服务器:所有业务之间的共同点以及所有业务之间的区别。

    【讨论】:

      【解决方案5】:

      幸运的是,我们在这里面临的问题并不是独一无二的。

      这里的问题似乎不在于代码本身,或者如何将其分解,而是要了解您现在正在从事 ERP 设计和开发。

      了解如何最好地开发和发展以合乎逻辑的方式管理组织细节的 ERP 是我认为您要解决的更深层次的问题。如何从中进行编码的设计和架构本身源于对您需要的核心功能领域的理解。

      幸运的是,我们可以研究一些您可以掌握的现有 ERP 系统,看看它们是如何解决一些问题的。有一些不错的开源 ERP,让我想到这个提示的是我监督的 SAP Business One 的全周期安装(一个绕过大型 SAP 挑战的中小型 ERP)。

      您正在寻找的是了解其他人如何解决您面临的相同 ERP 架构。至少您会了解模块化之间的权衡,在哪里划定模块之间的界限以及为什么。

      通常情况下,ERP 系统会处理从报价到生产(如果需要)、计费、运输和由此产生的会计工作的所有事情。

      ERPS 处理两个主要领域:

      1. 商品生产
      2. 提供服务

      有些企业是小部件工厂,有些是服务企业。一个功能齐全的开箱即用 ERP 将有一个“订单”的连续链/生命周期,该“订单”由多个步骤提供服务。

      如果我们阅读 ERP 可以涵盖的步骤的粗略列表,您会看到适用于您的步骤。这些可能是您拥有或应该将您的应用程序分解成的模块。想象一下以下步骤,其中每个步骤都是不同的文档,都连接到链中的前一个文档。

      1. 潜在客户生成 --> 销售机会
      2. 销售机会 --> 报价/估计
      3. 报价估算 --> 销售订单
      4. 销售订单 --> 生产订单(构建它,或安排某人完成工作)
      5. 生产订单 --> 采购订单(订购所需材料或专家在需要时到达)
      6. 生产订单 --> 生产调度(将建造什么,何时,或谁来完成,何时?)
      7. 生产计划 --> 生产! (做作业)
      8. 生产的服务/货物 --> 库存调整 - 如果需要,将任何原始库存转换为成品,或准备发货
      9. 成品/服务 --> 装箱单
      10. Packing Slip items --> 发票

      系统集成商的作用是使用所需的步骤,并跳过未使用的步骤。这会为您不断发展的应用带来一件事:

      制定可靠的数据安全策略。确保您感到舒适,因为每个人都只能看到他们应该看到的内容。假设它已经到位,将应用程序分解为主要部分是一个好主意。模块是我们的朋友。然而,分解它们的顺序可能会对你的行为产生更大的影响。

      查看哪些部分是通用的(报告等),可以在多个应用程序之间重复使用,哪些部分更专门用于应用程序本身。与应用程序本身相关的功能可能已经更紧密地耦合在一起,您可能需要解决这个问题。

      对于 ERP,我一直更喜欢交易“核心”模块,所有其他交易提供者都使用该模块(一旦定义,计费就会推动流程)。

      当我将 90 年代的 Lotus Notes ERP 转换为 SAP ERP 时,Lotus Notes 应用程序非常出色,它可以处理应有的一切。有一些构建在侧面的小应用程序没有作为模块集成,这是摆脱它的主要原因。

      如果您今天根据今天的要求重新编写应用程序,您会如何以不同的方式完成它?看看与你所拥有的是否有任何重大差异。让应用程序争取您的注意力,以决定首先需要检修/模块化的内容。 ColdBox 非常适合模块化,无论您是使用插件类型的模块还是只是使用分离良好的代码,您都不会出错,这只是开发人员时间和金钱的功能来完成它。

      我要构建/自动化单元测试的第一个模块是最复杂的编程模块。如果你是一个体面的开发人员,你可能不需要从昨天开始进行端到端的单元测试。从最复杂的开始,进入应用程序的核心部分,然后扩展到可能让您彻夜难眠的任何其他领域。

      希望对您有所帮助!如果您不介意,请分享您最终会做什么,如果我提到的任何内容需要进一步解释,请在此处或推特上联系我 :) @JasPanesar

      【讨论】:

      • 感谢您如此周到且写得很好的回复。我仍然不知道如何在 CF 中构建 ERP,或者 CF 是否是构建此类系统的正确工具?目前,我认为Order的Status不足以捕捉事件的流向......我只能想到使用State Pattern,但是当有10多个状态时没有多大意义......
      • 感谢您的客气话。我不得不非常痛苦地学习 ERP,所以它变得非常痛苦,哈哈。如果您已经有一个代码库,CF 或任何其他工具都适用于 ERP。许多 ERPS 摆脱了“文档”的概念,其中数据不断地从一个文档(销售订单)复制到下一个文档(生产订单),然后将下一个(装箱单)复制到下一个文档(无论是建造并打包发货的发票) ..
      • 有什么框架可以构建 ERP?您是否使用任何书籍或其他资源学习 ERP?谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多