我有一些事件的处理程序在一个边界流管理持久性机制,对于给定一般事务:

void MyBoundaryClass::MyEventHandler(...)
{
  //retrieve stuff from the UI
  //...
  //declare and initialize trasaction to persist
  SimpleTransaction myTransaction(.../*pass down stuff*/);
  //do some other checks
  //...
  //declare transaction persistor
  TransactionPersistor myPersistor(myTransaction, .../*pass down connection to DB and other stuff*/);
  //persist transaction
  try
  {
    myPersistor.Persist();
  }
  catch(...)
  {
    //handle errors
  }
}

它会更好,有些用来包裹SimpleTransaction和TransactionPErsistor的对象?

是否有任何有用的经验法则明白如果我需要一个更深一层的封装?

在目前的规则的拇指,我遵循的是"如果方法得到太大了-做点什么"。它是困难的,有时找到正确的平衡之间的程序性和面向目标的当处理边界事件的处理程序。

任何意见?

欢呼

有帮助吗?

解决方案

考虑到:

  • 概念的封装 是关于定义的容器,
  • 面向对象的设计概念为基础的消息传递(调用的方法)

我会认为 API 是一个很好的迹象,有关针对性的一个新的高级封装(I.e。该定义的新的对象)

如果服务(i。e API)提供的这种新的对象是连贯一致,并更好地暴露于其余程序时,重新在一个特殊的目的,然后通过各种手段,使用一个新的对象。

否则,它是一个可能的矫枉过正。

因为你让一个 公共 API通过创建一个新的对象,这一概念的 测试 可以更容易做到在这一新的对象(和一些其他的 模拟 对象),而不是创造了许多遗留的对象,以测试这些同样的行动。

在你的情况下,如果你想要测试的事务,必须实际测试MyEventHandler的MyBoundaryClass,以从中检索数据的用户界面。

但是如果定义的一些用,即给你机会 下联接的不同结构层次 (GUI与数据)的存在MyBoundaryClass和出口数据管理纳入一个专门的类。
然后,你可以测试数据的持续存在的独立测试方案,特别侧重于限制数值和数据库的失败,并不是名义条件,等等。

检测方案可以帮助你完善 凝聚力 (大点提到过 Daok)的不同的对象。如果你的测试是简单和一致,有机会,你的对象有一个良好的定义务的边界。

因为它可以认为, 联结和凝聚力的两个基石OO编程, ,凝聚力的一个新的类似些用可以是评估中期所设的行动,它将执行的。

有凝聚力意味着某一类执行一套紧密相关的行动。缺乏凝聚力,另一方面,意味着,一类是执行几个不相关的任务。[...]应用软件将最终成为难以控制的因为越来越多的行为成为分散,并最终在错误的地方。

如果你重新组合行为,否则实现在几个不同的地方到您的些用,它应该是现,前提是其公共API表示明确的步骤,一个什么样的交易涉及的并不是"有关的东西交易"喜欢各种各样的实用功能。一个名称本身并不足以判断凝聚力的一类。该组合的名称及其公共API是必要的。

例如,一个有趣的方面的一些用将被完全封装这一概念的交易,它将:

  • 成为几乎未知的余f系统,并将降低之间的联接其他类别和交易'
  • 加强凝聚力的一些用由中心其API周围的事务的步骤(如initTransaction(),persistTransaction(),...),避免任何吸气器或任何交易实例。

其他提示

拟订在VonC的建议,考虑以下准则:

  • 如果你希望援引的同样的功能的其他地区,在相同的方式,这是合理的封装他们在一个新的对象。

  • 如果一个功能(或者一项目)提供了一套设施是有用独特的,这是合理的重构成较小的部件。

VonC点有关API是一个优秀的石蕊测试:建立有效的 接口, , 对象 往往变得显而易见。

封装级别应直接链接到对象的内聚。您的对象必须执行单个任务,或者必须分成多个类并封装其所有行为和属性。

经验法则是时候测试你的对象了。如果您正在进行单元测试,并且您意识到您正在测试多个不同的东西(不是在相同的区域操作中),那么您可能会尝试将其拆分。

对于你的情况,我会用你对“TransactionManager”的想法进行封装。这样,“TransactionManager”就可以了。将处理交易的工作方式,而不是“MyBoundaryClass”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top