如何使代码模块化?

2022-09-01 11:18:33

我有一些Java程序,现在我想找出它是否是模块化的,如果它是模块化的,那么达到什么程度,因为模块化永远不可能是二进制项,即0或1。我如何确定特定代码在多大程度上是模块化的。我想知道如何使代码更加模块化?


答案 1

模块化的一些基准测试:

  1. 您为执行特定任务重写了多少次类似的代码
  2. 当您更改程序的某些部分时,您需要重构多少代码
  3. 文件是否小且易于浏览?
  4. 应用程序模块是否在需要时充分且独立地执行?
  5. 您的代码是否具有最小的灾难性?当你只删除一个函数或变量时,所有的地狱中断都会丢失吗?在重命名类时是否遇到 20 多个错误?(要对此进行检查,您可以实现一种堆栈机制来跟踪应用程序中的所有跃点)
  6. 代码与自然语言用法有多接近?(即模块及其子组件表示更多现实世界的对象,而不考虑净源文件大小)。

有关更多想法,请查看有关模块化的简介和有关软件质量的简介。

至于你对使代码更加模块化的担忧,你应该先问问自己上述问题,获得具体的答案,然后看看这个

基本理念是将应用程序分解为尽可能小的代码片段,整齐地排列在众多易于理解和访问的目录布局中。

应用程序中的每个方法执行的操作不得超过所需的最小处理量。将这些方法组合到越来越多的宏级方法中,应该会引导您回到应用程序。


答案 2

关键点是

  • 关注点分离
  • 内聚力
  • 封装(通过接口进行通信)
  • 替代
  • 可 重用

这种模块系统的一个很好的例子是标准汽车零件,如盘式制动器和汽车音响。当您制造汽车时,您不想从头开始构建汽车立体声系统。您宁愿购买它并插入它。您也不希望制动系统影响汽车音响,或者更糟糕的汽车立体声系统影响制动系统。

为了回答你的问题,“我如何确定特定代码在多大程度上是模块化的”,我们可以形成问题来测试模块化。您能否轻松地用其他模块替换模块,而不会影响应用程序的其他部分?

XML解析器可能是另一个例子。一旦你获得了DOM接口,你真的不在乎下面使用了哪个XML解析器的实现(例如Apache Xerces或JAXP)。

在Java中,另一个问题可能是:所有功能都可以通过接口访问吗?接口几乎照顾到低耦合。

另外,你能用一句话来描述系统中的每个模块吗?例如,汽车立体声系统播放音乐和收音机。盘式制动器可安全地使车辆减速。


(这是我写到什么是组件驱动开发?)

根据维基百科,基于组件的开发是基于组件的软件工程(CBSE)的别名。

[它]是软件工程的一个分支,其优先事项是在整个给定软件系统中可用的广泛功能方面分离关注点

这有点模糊,所以让我们看一下更多细节。

单个组件是封装一组相关功能(或数据)的软件包或模块。

所有系统进程都放置在单独的组件中,以便每个组件中的所有数据和函数在语义上都是相关的(就像类的内容一样)。由于这一原理,人们常说组件是模块化内聚的

因此,根据这个定义,一个组件可以是任何东西,只要它能很好地完成一件事,而且只做一件事。

关于系统范围的协调,组件通过接口相互通信。[...]这一原则导致组件被称为封装

所以这听起来越来越像我们认为好的API或SOA应该是什么样子的。

提供的接口由棒棒糖表示,所需的接口由连接到UML中组件外边缘的开放套接字符号表示。

alt text

组件的另一个重要属性是它们是可替换的,因此,如果后续组件满足初始组件(通过接口表示)的要求,则可以将一个组件替换为另一个组件(在设计时或运行时)。

可重用性是高质量软件组件的重要特征。应该设计和实现软件组件,以便它可以在许多不同的程序中重用。

可替代性和可重用性是使组件成为组件的原因。那么这和面向对象编程有什么区别呢?

面向对象编程(OOP)中的想法是,软件应该根据它所代表的实际或想象对象的心智模型来编写。[...]

相比之下,基于组件的软件工程没有做出这样的假设,而是指出软件应该通过将预制组件粘合在一起来开发,就像在电子或机械领域一样。


推荐