I(现在比以往更)看到开发者编写大量层的如:

implementation PresentationLayer ->
    interface IMyDTO ->
        implementation MyDTO ->
            interface IMyService -> 
                implementation MyService -> 
                    interface IMyDomainRepository ->
                        implementation MyDomainRepository ->
                            interface IMyDomainObject -> 
                                implementation MyDomainObject ->
                                    interface IMyIndependentStorageLayer ->
                                        implementation MyMSSQLStorageLayer

通过C#博客

看,这似乎是切片面包以来的最好的事情。基本上,一切都松散耦合。不要直接使用域对象。通过运行一个服务层的一切。通过存储库访问数据。所有层是完全独立的。

不要误会我的意思,我喜欢这个主意,但不是权衡的时间巨大的,尤其是在大的项目?处于维护真正大到足以证明这个投资回报率?

我读的那种尴尬,比如在解释“这样我可以连接不同的数据库,如果我需要”。真?我不认为这是一个普遍的问题,有人突然要求从MSSQL切换到Oracle,现在你坐在那里,希望你有一百万层,所有不认识对方的。

是否有与松耦合过分去一个趋势,还是我刚才读错的博客?你怎么看待这一点,有你有情况下,您真的很高兴后来你没有在一开始的额外工作?

有帮助吗?

解决方案

这是很难设计合适的业务对齐的构想一个软件。我指的是一个可接受的投资回报率。

然而,对于我,层的数目或一个软件概念的低耦合的电平,这取决于该软件将被使用的上下文!

如果您确定什么软件必须做,而且会有可能并不大的修改或在未来增加,有很多层的超水平低耦合的应用是解决不了问题。因为它使建筑没有任何理由和投资的架构的时候太复杂不赚钱...点击 在另一方面,如果你知道应用程序将不得不进行定制,以每个客户,将是肯定的深入修改,所以花了低水平的耦合结构的时间是个好主意......点击 当你想重新使用其他应用程序代码的一部分低层次的耦合可以聪明。在这种情况下,设计时间花费是完全有利可图的,当然。结果 然后,在总结,我会说,一切都取决于对未来和代码重用为其他应用程序的潜在软件的演化。结果 但是这对我做的没有系统非常复杂架构的最佳实践。

其他提示

显然,它可以是过头,并且需要知道“在哪里停止”添加层。

我的经验法则是,如果一个层不需要包括任何显著功能/代码,我并不需要它。话虽这么说,可测试性是一个显著的事情,所以如果买一层我更好的可测试性,我会添加它。

在应用设计没有都是有代价的。这里的价格增加complexibility。你总是要通过你的选择外观选择适合您需求的最佳的一个前。

有了这样说,我觉得你的问题听起来有点失之偏颇。在现实世界中,你可能不经常看到一个客户,要求一种新的DB的,但你可能经常看到谁愿意同一种比以前的数据访问一个新的负荷消费,但在另一个数据库。它不仅对易用性的变化,它也对码复用。

在评价这些事情,我通常会发现它在它通过的DRY原则直视镜头有益的,在你的项目中寻找重复。

如果您使用的是架构相当复杂,你的项目,你往往会看到很多那些小包装之外的其他层,并通过对呼叫层。这被重复自己。

如果在另一方面,你正在使用一个薄架构复杂的系统,您可能会发现,在系统的一个组成部分创造功能不会让你再使用该功能的另一部分,迫使你写了很多非常类似的代码所有的地方。这被重复自己。

在我的经验,如果在识别的重复和不断重构删除它警惕,结构将自身呈现给你。例如说你开始了一个相当基本的架构,但只要他们需要重用摔东西伸到方法,并尽快突破方法伸到类,因为他们需要通过其他类重用。然后,你最终可能会意识到,你的13助手/经理/处理类你写的删除重复实际上看起来有点像他们承担可能,如果它已经进入一个服务层已经被更加明确地界定责任。

这可能会非常棘手知道什么时候它是值得的,但我认为成功的关键在构建系统有很多层正在非常清楚与不同层应该有什么样的责任。添加任何层必须是有助于你在降低了操作的复杂性在它上面的层,并使其更容易地在一种优雅的方式编织在一起的功能。

取一个假设的例子项目。测试使用各种进程SQLite数据库的速度,一些开发人员的计算机上开发数据库PostgreSQL的,临时数据库是一个单一的Oracle安装和生产数据库是一个大规模扩展,非常昂贵,并且很难配置Oracle群集。

您会怎么扳指断没有SQL层从业务层分离?

这是最近的趋势,经验不足的引线/建筑师堕入跃跃欲试。

在这个项目我在,数据访问去:

服务接口 - >服务实现 - >代表接口 - >代表实施 - > DAO接口 - > DAO实现 - > ibatis的XML

这是(现在也是!)坏在我们的情况下,因为在任何代表实现方法最代码是一个单一的线;它只是叫DAO。对于每一个DAO,我们有两个额外的类和一个额外的bean来配置,而我们并没有这样获得任何东西。

接受的改变,重构,并继续前进。使用尽可能多的层,因为它需要拼凑分开不同的概念......,然后停止。如果有在写一些代码,但它会遵循一个模板,无论是慢下来,尝试完全理解为什么模板做,或者接受该模板是错误的应用程序,并忽略位无感知的收益。

我目前工作的,每一个层分离的大型SOA项目,几乎每个类是通过一些抽象工厂实例化。现在,我们正在试图卸载现有的一些功能集成到单独托管服务,这是一个真正的噩梦通过层层试图推断出重要的位去,因为那里是一个永无止境的右键 - >转到定义...追逐下来在最外层仅1行代码是什么!

有什么错脱钩本身,当然即使是在我的项目有在那里我发现它从架构的角度来看是有用的许多领域。只是不要得意忘形......务实,并检查你考虑到分离的区域时,权衡利弊/缺点。

干杯

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