时间耦合与工作单元

2024-03-13

所以,正如一直以来向我指出 https://stackoverflow.com/questions/16148924/value-types-inferred-as-object-at-runtime-when-using-dynamic/16149405?noredirect=1#comment23075938_16149405(我完全同意),时间耦合 http://blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling/是一种设计气味,一般有以下形式:

interface IDoSomething
{
    void Initialise();

    void DoSomethingThatOnlyWorksAfterInitialising();
}

在上面的形式中,您可能可以采取一些措施(通过构造函数注入或通过抽象工厂等)。

然而,这如何适用于工作单元?

我现在正处于 UoW 的欢乐混乱之中,看起来有点像

interface IUnitOfWork
{
    void Initialise(); // sorts out connection sharing/opening/yada

    void Rollback();

    void Commit();
}

诚然,初始化仍然不应该在那里。我设法通过调用该方法来说服自己Enlist就我而言。不过忽略这一点,are Rollback and Commit 考虑根据时间耦合?


进一步的想法

稍微思考一下,是不是措辞的选择(“时间耦合”)是错误的,或者至少是我对措辞的解释是错误的?

在我看来,气味试图做的是让编码员不依赖某种形式的Initialise方法,这可能是违反直觉的,正如EndpointAddressBuilder上面链接中的框架示例。

但是,有效终止该类的进一步使用的方法是否可以接受?方法如Dispose显然有某种形式的时间耦合;调用后尝试使用该类Dispose会给你带来问题,你应该更清楚。类似地与Commit, Rollback,并且我怀疑在其他情况下还有其他各种例子。

是不是只和气味有关初始化耦合(或者其中一位博主可以想出一些更好的词语?)。


Initialize应该返回一个可以回滚或提交的对象:

interface IUnitOfWorkFactory
{
     IUnitOfWork Create();
}

interface IUnitOfWork : IDisposable
{
    void Commit();
    void Rollback(); // should get called by Dispose if Commit was never called.
}

另外,理想情况下您的IUnitOfWork应该延长IDisposable, and Dispose应该是一样的Rollback.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

时间耦合与工作单元 的相关文章

随机推荐

  • 如何使用 NetBeans 和 x-debug 查看长字符串的值?

    x debug 或 NetBeans 是否有设置来扩展其显示的最大字符串大小 使用 NetBeans 在 Windows 中调试 PHP 应用程序 我可以添加监视或将鼠标悬停在任何变量上以查看其值 但对于长字符串 我得到的只是 字符串 没有
  • (Android Studio 语音识别器)即使我给了它 RECORD_AUDIO 和 INTERNET,我还是收到错误 9(权限不足)

    package blessupboys speechtest import android app Activity import android content Context import android content Intent
  • 静态和非静态方法的同步块

    我创建了两个线程 并使用称为该对象的静态和非静态方法的单个类实例 理想情况下 静态方法需要使用类名来调用 我也这样做了 我同步了线程正在调用其方法的类的私有静态成员上的静态和非静态方法 我注意到输出是同步的 我的问题是 静态方法如果使用同步
  • 将 jsTree 节点设置为“未确定”状态

    我在用着jsTree http www jstree com 显示带有复选框的树 每个级别的节点都使用以下命令按需加载json data plugin 如果检查节点的后代 则该节点应处于 未确定状态 如 ACME 和 USA 问题是 树一开
  • 程序类型已存在:io.invertase.firebase.BuildConfig

    根据一些谷歌搜索 两个包之间似乎存在一些重叠 我过去遇到过类似的问题 我认为我能够使用 gradlew clean 修复它 但这并不能解决我当前的问题 这是错误 任务 app transformDexArchiveWithDexMerger
  • 箱子堆放问题

    我在很多地方都发现了这个著名的 dp 问题 但我不知道如何解决 给你一组 n 种类型 矩形 3 D 盒子 其中第 i 盒子的高度为 h i 宽度为 w i 深度 d i 均为实数 你 想要创建一堆盒子 尽可能高 但你可以 只将一个盒子堆叠在
  • 如何处理使用相同数据库的两个独立 Laravel 项目的迁移?

    我们的设置是这样的 我们有 API 可以为 iOS 和 Android 应用程序提供支持 我们有一个管理 API 可以为管理 Web 应用程序提供支持 我正在开发管理员 我的同事正在开发应用程序 API 它们都使用相同的数据库和大部分相同的
  • Ternary 和 If/Else 编译成相同的东西,为什么?

    编译器将简单的三元语句编译为与编译简单的 if else 语句相同的东西吗 另外 为什么编译器会被设计为以不同的方式编译它们 例如 这样 int a 169 int b 420 int c c a gt b 42 69 编译为与此相同的内容
  • 是否可以支持旧 API 级别的 setScrollY() (ScrollView API 14) 之类的函数?

    我正在编写一个简单的第一个 Android 应用程序 我的主要活动之一是相当长的 ScrollView 其中我有一些调用其他 ListView 的按钮 当 ListView 完成并且 ScrollView 回来时 我希望屏幕上的位置与第一次
  • 我们可以将两个连接到不同数据库的 Django/python 应用程序合并到一个集成应用程序中吗

    我有两个独立的 Django 应用程序连接到不同的数据库 我想制作一个父应用程序 将请求路由到两个子应用程序之一 这可能吗 我怎样才能实现这一目标 父应用程序不必连接到任何数据库 它应该只是将请求路由到子应用程序 谢谢您的帮助 这个有可能
  • 为什么我在后台运行脚本时会得到“暂停(tty 输入)”的信息

    我写了一个tcsh脚本来清除集群中的垃圾数据 代码是 set hosts 1 set clear path 2 foreach i hosts rsh i rm rvf clear path end 当我在后台运行此脚本时 如下所示 dis
  • 如何查找两个 JavaScript 对象数组之间的差异?

    我有两个 JavaScript 数组orig 原始对象数组 和update 更新后的对象原始数组 具有相同的长度并包含对象 我想输出每对对象之间的差异 Example var orig enabled true name Obj1 id 3
  • 如何将 unicode 字符发送到活动应用程序?

    我需要 Windows API 中的 SendInput 之类的东西 我看到这个方法 我不知道有什么办法可以将unicode字符转换为虚拟键码 CGEventRef CGEventCreateKeyboardEvent CGEventSou
  • Neo4j 2 和 Java 8

    Java 8 将于本周发布 当将 Neo4j 1 9 与 Java 7 一起使用时 我们看到弹出警告 提示仅支持 6 但我们对 1 9 7 组合从未遇到任何问题 我知道 Neo4j 2 不能使用低于 Java 7 的任何东西 但是 Neo4
  • 禁用键盘 :: TextInput React Native

    下面给出的代码在第一次和第二次点击时有效 在相同的文本输入上它不起作用 键盘再次打开 因为文本输入已经聚焦 并且我正在使用自定义数字按钮进行输入 TextInput onFocus Keyboard dismiss 有什么建议么 原生反应的
  • HTML5 中是否可以实现类似 Photoshop 的混合模式?

    我想放一个红色矩形 div 元素在我的网页上 这样它不仅看起来是透明的 而且就像在 Photoshop 的乘法模式中混合的一样 The div 将有position fixed 所以下面的内容会很快改变 任何 HTML5 CSS3 canv
  • 自动打开第一张 Fancybox 图片

    单击链接后 我将从 JSON get 中引入一些图像 然后单击其中一张图片时可以显示图库 但我希望第一张图像立即出现 作为一旦JSON 已加载 这可能吗 我的代码是 json get css cursor pointer click fun
  • 在 tr 上使用 :hover 时出现 CSS 边框问题

    我试图在数据表中突出显示鼠标所在的行 我正在尝试用 border top 和 border bottom 来做到这一点 为了提高可读性 我还在交替行上放置了一个浅色透明的 png 似乎当我打开和关闭边框 适用于 IE8 和 FF 时 行会稍
  • 如何将 PHYLIP 格式转换为 FASTA

    我刚刚开始使用 perl 我有一个问题 我有 PHYLIP 文件 我需要将其转换为 FASTA 我开始写剧本 首先 我删除了行中的空格 现在我需要对齐所有行 每行应包含 60 个氨基酸 并且序列标识符应打印在新行中 也许有人可以给我一些建议
  • 时间耦合与工作单元

    所以 正如一直以来向我指出 https stackoverflow com questions 16148924 value types inferred as object at runtime when using dynamic 16