我正在尝试将一个可怕的WCF服务重构为更易于管理的东西.在编写本文时,该服务通过构造函数大约需要9个依赖项,这使得单元测试变得非常困难.
该服务通过状态机处理本地状态,对参数进行验证,抛出故障异常,执行实际操作并通过发布/子通道触发发布事件.所有其他服务调用的代码非常相似.
我意识到我可以通过面向方面编程或WCF行为以不同方式完成其中的几个(参数验证,发布/订阅通知),但我的直觉告诉我一般方法是错误的 - 这感觉太"程序化" .
我的目标是将实际操作的执行与发布/子通知之类的内容分开,甚至可能将错误处理分开.
我想知道像DDD或CQRS或其他技术的首字母缩略词是否可以帮到这里?遗憾的是,我不熟悉定义之外的那些概念.
这是一个这样的WCF操作的(简化)示例:
public void DoSomething(DoSomethingData data)
{
if (!_stateMachine.CanFire(MyEvents.StartProcessing))
{
throw new FaultException(...);
}
if (!ValidateArgument(data))
{
throw new FaultException(...);
}
var transitionResult =
_stateMachine.Fire(MyEvents.StartProcessing);
if (!transitionResult.Accepted)
{
throw new FaultException(...);
}
try
{
// does the actual something
DoSomethingInternal(data);
_publicationChannel.StatusUpdate(new Info
{
Status = transitionResult.NewState
});
}
catch (FaultException<MyError> faultException)
{
if (faultException.Detail.ErrorType ==
MyErrorTypes.EngineIsOffline)
{
TryFireEvent(MyServiceEvent.Error,
faultException.Detail);
}
throw;
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道我是否真的有任何使用git/mercurial的情况.
我工作的项目是java和c#项目,通常有5-20人为共同目标("发布")而努力.大部分的开发商是专业的开发谁重构代码,所有的时间.因此,典型的Linux内核在单独的文件中有大量相对独立的更改,我们有不断变化的重构 - 通常会遇到大量文件和大量代码.没有人害怕在这里改变代码.
现在有了颠覆,我们通过非常接近SVN HEAD来解决这个问题.我们中的一些人甚至在构建服务器的jabber广播上触发了自动svn up.我们大多数人也学会了(或者很快学会)如何规划我们的工作以保持与SVN HEAD的接近.如果你正在进行一次重大的重构,我们会逐步将源树弯曲到新的方向,而不是消失太久.有时您只是计划重构操作并在较少竞争的区域开始.经过这么多年的工作,它成为第二天性.我们大多数人从不离开距离svn头不到2小时的"舒适区".自动构建和svn头是项目"脉冲",我们喜欢它.
当然,我们分支每个版本,但从发布分支回到主干的后退数量迅速减少到足以使其无关紧要(我们已经获得了不错的测试覆盖率).与源的私人分支一起运行数天/周听起来像我们积极想要阻止的事情,并且它不会经常发生.
git和mercurial声音都很酷,git略微更多,因为我更像是McGyver类型而不是James Bond类型.但是当谈到建立实际转换的案例时,感觉就像Linus和我生活在两个不同的星球上.大多数时候,我们希望我们的团队专注于HEAD.
GIT如何让我的版本控制更好?GIT如何让我改进我的流程?我是颠覆恐龙吗?
当我第一次看到反单身评论时,我很困惑.我在最近的一些项目中使用了单例模式,并且它运行得很漂亮.事实上,我已经使用了很多次.
现在,在遇到一些问题之后,阅读这个问题,尤其是这篇博文,我理解了我带给世界的邪恶.
那么:我如何从现有代码中删除单例?
例如:
在零售店管理程序中,我使用了MVC模式.我的Model对象描述了商店,用户界面是View,我有一组控制器,它们充当两者之间的联络.大.除了我将Store变成一个单独的(因为应用程序一次只管理一个商店),我还把我的大部分Controller类变成了单例(一个mainWindow,一个menuBar,一个productEditor ......).现在,我的大多数Controller类都可以像这样访问其他单例:
Store managedStore = Store::getInstance();
managedStore.doSomething();
managedStore.doSomethingElse();
//etc.
Run Code Online (Sandbox Code Playgroud)
我应该改为:
Globals仍然很糟糕,但至少他们不会假装.
我看到#1迅速导致可怕的膨胀构造函数调用:
someVar = SomeControllerClass(managedStore, menuBar, editor, sasquatch, ...)
Run Code Online (Sandbox Code Playgroud)
还有其他人经历过这个吗?如果不是全局变量或单个变量,那么为多个单独的类访问公共变量的OO方法是什么?
经过多年将Delphi程序编码为表单和数据模块中不可测试的代码(包括全局变量),唯一的类是表单本身,包含表单UI本身所需的所有代码.
我如何将代码转换为一组执行实际工作的类?我是否需要停止使用数据源/数据集并在类中执行所有操作?我需要ORM吗?
通常没有必要在表单中重用代码,所以将逻辑转换为类是否有意义?
我的模型中有一个集合,其中包含一组我的根域对象的"先前版本".因此,以前的版本是"不可变的",我们永远不会想要更新它们,只希望在它们出现时添加过去的版本."版本化"的域对象也相当复杂,导致需要大量数据库访问才能检索.
当我有这些对象之一的新版本时,我想将其与其他对象保存,而不加载整个集合.高级常见问题解答有一些建议:
当我只想添加或删除元素时,为什么Hibernate总是初始化集合?
遗憾的是,集合API定义了方法返回值,这些值只能通过命中数据库来计算.这有三个例外:Hibernate可以添加到a
<bag>,<idbag>或者<list>在inverse="true"没有初始化集合的情况下声明; 返回值必须始终为true.如果要避免额外的数据库流量(即在性能关键代码中),请重构模型以仅使用多对一关联.这几乎总是可行的.然后使用查询代替集合访问.
我是所有这一切的新手,并不是100%肯定如何重构你的模型只使用多对一的关联.任何人都可以给我一个例子,指出我的教程,以便我可以了解这将如何解决我的问题?
考虑到我们都在不断学习,我们都必须遇到一个问题,即我们学到的东西非常棒,可以显着改善我们的代码或部分代码.
问题是,当你学会了一些新的技术,策略或其他什么时,你或者你应该回到你知道有效的代码,但是可以更好/可维护/更快/ 一般改进并实现这些新知识吗?
我理解"如果它没有被破坏,不要修复它"的概念,但是什么时候会失去你已经编写过的代码的骄傲,以及它对于重构的意义.
如果我对某些内容进行重构重命名,它会尝试暂时执行,但之后只需将其恢复为以前命名的内容即可.没有错误或任何迹象表明出现了问题.
我刚刚重启Eclipse,现在情况更糟.在此之前,至少选择Refactor> Rename将"装箱"这个名称并假装它让你做一个重构.现在,重新启动后,选择Refactor> Rename不会执行任何操作.
Win7 64位
Eclipse Indigo build 20110615-0604
我是一名长期的Java程序员,但目前我用C#编写代码.我习惯了,当我更改文件名时,类名也会改变,反之亦然.这在我的Visual Studio中不起作用.我必须重命名类名和单独文件名,因此有时候我很烦,因为我总是忘记它,所以这结果,我有不同的类和文件名.Visual Studio中是否有选项将重命名放在一个步骤中?
这可能是一个简单的问题:我如何大规模重构我的Java代码,使大多数方法参数成为"最终"?这是遵循我们的"checkstyle"规则之一.我们有数千个Java文件,因此手动编辑所有这些文件对我们来说似乎不是一个可接受的解决方案.
我没有在IntelliJ中找到任何这样的重构选项.有人知道任何有用的工具吗?或者任何实现这一目标的聪明方法?