当前位置:  开发笔记 > 运维 > 正文

界面疯狂

如何解决《界面疯狂》经验,为你挑选了4个好方法。

我正在喝coolade并喜欢它 - 接口,IoC,DI,TDD等等.运作得很好.但我发现我必须努力使一切都成为界面!我有一个工厂,这是一个接口.它的方法返回可能是接口的对象(可能使测试更容易).这些对象是他们所需服务的DI接口.我发现保持接口与实现同步是为了增加工作 - 向类添加方法意味着将它添加到类+接口,模拟等.

我是否过早地将接口分解出来?有什么最好的做法可以知道什么时候应该返回一个接口而不是一个对象?



1> 小智..:

当您想要模拟对象与其中一个协作者之间的交互时,接口非常有用.但是,对于具有内部状态的对象,接口的值较小.

例如,假设我有一个与存储库对话的服务,以便提取某些域对象以便以某种方式操作它.

从存储库中提取接口有明确的设计价值.我对存储库的具体实现很可能与NHibernate或ActiveRecord紧密相关.通过将我的服务链接到接口,我可以清楚地分离这个实现细节.事实上,我现在可以为我的服务编写超快速独立单元测试,因为我可以将它交给模拟IRepository.

考虑从存储库返回的域对象以及我的服务所依赖的域对象,价值较低.当我为我的服务编写测试时,我会想要使用一个真实的域对象并检查它的状态.例如,在调用service.AddSomething()之后,我想检查是否有东西被添加到域对象中.我可以通过简单检查域对象的状态来测试它.当我单独测试我的域对象时,我不需要接口,因为我只对对象执行操作并在其内部状态下对其进行测试.例如,如果它正在睡觉,我的羊吃草是否有效?

在第一种情况下,我们对基于交互的测试感兴趣.接口有用,因为我们想拦截在测试对象和带有模拟的协作者之间传递的调用.在第二种情况下,我们对基于状态的测试感兴趣.接口在这里没有帮助.尝试意识到你是在测试状态还是交互,让它影响你的界面或没有界面决定.

请记住(如果您安装了Resharper的副本),以后提取界面非常便宜.如果您决定不需要该接口,那么删除接口并恢复到更简单的类层次结构也很便宜.我的建议是在没有接口的情况下启动,并在发现想要模拟交互时按需提取它们.

当你将IoC引入图片时,我倾向于提取更多接口 - 但是试着隐藏你将多少个类推入你的IoC容器中.通常,您希望将这些限制为基本上无状态的服务对象.



2> Ed Guiness..:

听起来你有点像BDUF.

用coolade轻松一下,让它自然流动.



3> Pontus Gagge..:

请记住,虽然灵活性是一个有价值的目标,但IoC和DI增加了灵活性(在某种程度上是TDD的要求)也增加了复杂性.唯一的灵活点是更快,更便宜或更好地进行下游变更.每个IoC/DI点都会增加复杂性,从而有助于在其他地方进行更改.

这实际上是你需要一个大的设计在锋线上一定程度:确定哪些领域最有可能改变(和/或需要广泛的单元测试),并计划灵活性那里.重构以消除不太可能发生变化的灵活性.

现在,我并不是说您可以猜测在任何精确度下都需要灵活性.你错了.但是你很可能会得到正确的答案.如果您以后发现不需要灵活性,可以在维护中考虑因素.在您需要的地方,可以在添加功能时考虑它.

现在,可能会或可能不会更改的区域取决于您的业务问题和IT环境.这是一些反复出现的地区.

    我总是会考虑外部接口,您可以将其集成到其他系统,以实现高度可变性.

    无论代码为用户界面提供后端,都需要支持UI中的更改.但是,主要针对功能更改的计划:不要过分关注并规划不同的UI技术(例如支持智能客户端和Web应用程序 - 使用模式会有太大差异).

    另一方面,编码可移植到不同的数据库和平台通常是浪费时间,至少在企业环境中.四处询问并检查可能存在的计划,以便在软件可能的生命周期内更换或升级技术.

    对数据内容和格式的更改是一项棘手的工作:虽然数据偶尔会发生变化,但我见过的大多数设计都会很难处理这些变化,因此您可以直接使用具体的实体类.

但只有你可以判断什么可能或不应该改变.



4> Jon Skeet..:

我经常发现我想要"服务"的接口 - 而主要关于"数据"的类型可以是具体的类.例如,我有一个Authenticator接口,但是有一个Contact类.当然,它并不总是那么明确,但这是一个初步的经验法则.

我确实感觉到你的痛苦 - 这有点像回到.h和.c文件的黑暗日子......

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有