模块化编程

  • 模块接口表达了这个模块所提供的和所要求的元素。这些在接口中定义的元素可以被其他模块检测到。模块实现包含了工作代码,它们对应于在接口中声明的元素。
  • 模块化编程密切相关于结构化编程和面向对象编程,它们有着相同目标,即通过分解成更小部分的方式,促进大型软件和系统的建构,并且都大致起源于 1960 年代。尽管这些术语在历史上的用法曾经是不兼容的,在现代的术语运用中:
  • 模块化编程,指称将整个程序的代码分开成各部分的高层分解。 结构化编程,是采用结构化控制流的低层代码使用。 面向对象编程,是对象的“数据”使用,对象是某种数据结构。 在面向对象编程中,使用接口作为一种架构上的模式(pattern)来构造模块叫做基于接口编程 。
  • 已普及
    • 1990 年代就能在几乎所有主要语言的开发中找到
    • 模块的相对重要性因语言而异
    • 在基于类的面向对象语言中,与作为组织和封装的单元的类存在重叠和混淆 (公认的不同概念)
  • 主在关注点被分离, 使得模块执行逻辑上离散的功能, 通过定义良好的接口进行交互
    • 通常模块形成有向无环图 (DAG)
      • 模块之间的循环依赖被视为表明它们应该是单个模块
      • 在模块确实形成 DAG 的情况下,它们可以排列为层次结构,其中最低级别的模块是独立的,不依赖于其他模块,而更高级别的模块依赖于较低级别的模块。
      • 一个特定的程序或库是其自身层次结构的顶级模块,但又可以被视为高级程序、库或系统的低级模块
  • 在创建模块化系统时,不是创建一个单一的应用程序(最小的组件就是整体),而是单独编写几个较小的模块,因此当它们组合在一起时,它们构建了可执行的应用程序。通常,这些也通过单独的编译单独编译,然后由链接器链接。即时编译器可以在 runtime 时“即时”执行一些这种构造。
  • 这些独立功能通常分为程序控制功能或特定任务功能。程序控制功能旨在为一个程序工作。为适用于各种程序而精心准备了特定的任务功能。
  • 如果构建正确,这使得模块化设计的系统比传统的单体设计更可重用,因为所有(或许多)这些模块都可以在其他项目中重用(无需更改)。这也有助于将项目“分解”为几个较小的项目。从理论上讲,一个模块化的软件项目将更容易由大型团队组装,因为没有团队成员正在创建整个系统,甚至不需要了解整个系统。他们可以只专注于分配的较小任务。