好的包装结构如何使一个好的应用程序

在这篇文章中,我会给你一些简单建议,如果认真遵循,将立即导致您的Java应用程序易于维护和可扩展的体系结构。 尽管本文专门针对Java,但这些概念同样适用于允许在程序包中排列代码的其他语言。

可以写一本关于如何实现良好架构(以及人们所做的)的书,但是您现在需要一种更好的架构,而且时间紧迫-我也是-所以让我们跳入其中。 现在,我要告诉您的一切都归结为以下最重要的建议:

使用私人包自由范围

如果这样做的话,这立即解决了很多问题,一旦您习惯了,您将希望与我意识到此建议的价值之时一样惊奇。 让我详细解释一下。

在更大的应用中,可维护性的关键是保持耦合的 应用程序的单个组件受到控制。 这假设您的应用程序实际上必须首先被构造成组件。 如果不是这样,您可能会经历过某种包间依赖地狱具有包装周期等(好的ol'大泥球)。

依赖性是所有规模软件开发中的关键问题(肯特·贝克)

Java提供了包装 to structure your code into components. But experience taught me that most times, a single component is spread across multiple 包装. This happens when programmers choose their 包装 under 技术方面。 例如,如果您有一个包裹org.domain.app.controllers您所有控制器所在的位置以及另一个软件包org.domain.app.services where all your services live you have a 技术 package structure. In this scenario, possibly unrelated classes are located near to each other in the same package while related classes are located far away.

相关代码的局部性是拥有易于推理的代码的关键方面

因为您的相关类(共同解决特定领域的问题)位于不同的程序包中,所以它们都必须是上市为了一起工作。 通过选择不将相关类放入同一包中,您可以避免在不希望使用某些类的地方使用某些类的所有弊端。

如果预先选择了域要么特征相关的程序包结构首先有一个简单的解决方案来避免此问题:

给尽可能多的课程私人包范围

实际上,默认情况下,您应该每堂课私人包并且仅在必要时扩大其范围。 一段时间后,每当看到蜂鸣声时,您都会感到不适上市 - and this is a good thing. It makes you think explicitly about the 上市 interface of your package. Following this advice you will automatically create packages with following characteristics:

  • 高凝聚力:包装中的所有东西都与其他东西相关。 相关代码的局部性将使推理变得容易。与其他软件包的耦合度低:因为您的软件包只有很少的公共接口

尽管这些都是好事,但您还将体验到包装变得越来越大,使您感到不舒服。

No packages - No cycles

如果您觉得您的程序包太大了,那么这显然表明可能会有更好的针对特定领域的削减。 在这种情况下,您应该查看并质疑当前软件包的全部用途。 以我的经验,您遇到以下情况:

  1. 不相关的代码破坏了您的原始功能,而这些代码实际上提供了其他功能。随着时间的流逝,原始功能的需求发生了很大变化,以致原始结构不再足够适合。 该功能也很可能不会改变,但是您在编码时对它的理解却有所改变。

大多数情况下,第一种情况很容易解决。 如果您确实处于大多数无关代码滑入您的功能包的情况下,应该很容易将其隔离并将其移至其自己的包中。

如果隔离较小的零件不是那么容易,那么您可能会遇到第二种情况。 这是巫术的地方私人包达到极限,您将不得不做实际的工作。 现在,您可以在程序包级别进行一些重构-也就是说,您需要将当前程序包拆分为多个新程序包,以更好地满足您要解决的域问题的要求。 仅通过在软件包之间移动某些类就很可能无法解决此问题,但是可能需要进行实际的代码更改。

但是因为所有相关的东西都在一起,而且您知道大多数东西都没有在包外使用,所以重构时您会很有信心。

unit tests

您是否想知道单元 in 单元 testing is? You might have come across test suites where a test 类 exists for every production 类。If so you most likely experienced that your 单元 tests are not very robust。They break easily if you adjust the implementation 类 even if you actually preserved behavior correctly。That is because 单元并不意味着类。单元 pertains to all the code you want to test in isolation in order to solve a domain specific problem。单元手段特征 and 特征, in our case,手段the public interface of your package.

不要为每个生产类编写测试类。 为每个功能编写测试类

这样做将您的测试代码宽松地耦合到生产代码,就像将您的生产代码宽松地耦合到其他软件包一样。 您可以在公共接口后面自由更改所有实现细节(例如,甚至删除类),而无需破坏测试。 那就是信息隐藏。

总而言之,通过自由使用软件包私有范围,您可以免费获得!

  • 包装内的高内聚力封装之间的耦合度低持久的架构,因为组件/包之间的接口定义明确易于推理的代码一个很好的提示,说明您应该进行哪些测试以实现更强大的单元测试

再说一遍:您得到这个是因为简单地省略了上市类声明中的修饰符! 每当您需要创建一个新类时,将其打包为私有并将其放入该软件包中,从域或功能的角度来看,您认为它最合适。 这样一来,您就可以随着时间的推移仔细地更改包装布局。

附录 细心的读者可能已经注意到以下几点:上面有关构建软件包的提示实际上与我们几十年来在课堂上所遵循的建议相同。 毫无疑问,保留助手方法是最佳实践私人的为了拥有明确定义的公共界面。 如果“依赖性在所有方面都是一个问题”在所有规模上,用于管理依赖关系的解决方案看起来也都可能是相似的。

更多信息:

from: https://dev.to//skuzzle/how-a-great-package-structure-can-make-a-great-application-22ng

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值