软件工程:模块独立性

📌目录



⚖️ 模块独立性:软件设计的核心度量标准

模块独立性是衡量软件设计质量的重要标准,它反映了模块的独立程度。模块独立性主要通过内聚性和耦合性两个定性指标来度量。本文将详细介绍模块独立性的概念、度量标准、设计原则及提高方法。

🎯 一、模块独立性概述

(一)模块独立性的定义

模块独立性是指每个模块只完成系统要求的独立功能,并且与其他模块的联系最少、接口最简单。

模块独立性概念
#mermaid-svg-xgb147PqCNKgXyY4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xgb147PqCNKgXyY4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xgb147PqCNKgXyY4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xgb147PqCNKgXyY4 .error-icon{fill:#552222;}#mermaid-svg-xgb147PqCNKgXyY4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xgb147PqCNKgXyY4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xgb147PqCNKgXyY4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xgb147PqCNKgXyY4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xgb147PqCNKgXyY4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xgb147PqCNKgXyY4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xgb147PqCNKgXyY4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xgb147PqCNKgXyY4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xgb147PqCNKgXyY4 .marker.cross{stroke:#333333;}#mermaid-svg-xgb147PqCNKgXyY4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xgb147PqCNKgXyY4 p{margin:0;}#mermaid-svg-xgb147PqCNKgXyY4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xgb147PqCNKgXyY4 .cluster-label text{fill:#333;}#mermaid-svg-xgb147PqCNKgXyY4 .cluster-label span{color:#333;}#mermaid-svg-xgb147PqCNKgXyY4 .cluster-label span p{background-color:transparent;}#mermaid-svg-xgb147PqCNKgXyY4 .label text,#mermaid-svg-xgb147PqCNKgXyY4 span{fill:#333;color:#333;}#mermaid-svg-xgb147PqCNKgXyY4 .node rect,#mermaid-svg-xgb147PqCNKgXyY4 .node circle,#mermaid-svg-xgb147PqCNKgXyY4 .node ellipse,#mermaid-svg-xgb147PqCNKgXyY4 .node polygon,#mermaid-svg-xgb147PqCNKgXyY4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xgb147PqCNKgXyY4 .rough-node .label text,#mermaid-svg-xgb147PqCNKgXyY4 .node .label text,#mermaid-svg-xgb147PqCNKgXyY4 .image-shape .label,#mermaid-svg-xgb147PqCNKgXyY4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-xgb147PqCNKgXyY4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xgb147PqCNKgXyY4 .rough-node .label,#mermaid-svg-xgb147PqCNKgXyY4 .node .label,#mermaid-svg-xgb147PqCNKgXyY4 .image-shape .label,#mermaid-svg-xgb147PqCNKgXyY4 .icon-shape .label{text-align:center;}#mermaid-svg-xgb147PqCNKgXyY4 .node.clickable{cursor:pointer;}#mermaid-svg-xgb147PqCNKgXyY4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xgb147PqCNKgXyY4 .arrowheadPath{fill:#333333;}#mermaid-svg-xgb147PqCNKgXyY4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xgb147PqCNKgXyY4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xgb147PqCNKgXyY4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xgb147PqCNKgXyY4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xgb147PqCNKgXyY4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xgb147PqCNKgXyY4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xgb147PqCNKgXyY4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xgb147PqCNKgXyY4 .cluster text{fill:#333;}#mermaid-svg-xgb147PqCNKgXyY4 .cluster span{color:#333;}#mermaid-svg-xgb147PqCNKgXyY4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xgb147PqCNKgXyY4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xgb147PqCNKgXyY4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-xgb147PqCNKgXyY4 .icon-shape,#mermaid-svg-xgb147PqCNKgXyY4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xgb147PqCNKgXyY4 .icon-shape p,#mermaid-svg-xgb147PqCNKgXyY4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xgb147PqCNKgXyY4 .icon-shape .label rect,#mermaid-svg-xgb147PqCNKgXyY4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xgb147PqCNKgXyY4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xgb147PqCNKgXyY4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xgb147PqCNKgXyY4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 模块独立性
功能独立
接口简单
修改独立
完成独立功能
与其他模块联系少
修改不影响其他模块

(二)模块独立性的意义

独立性意义

意义 说明
可维护性 模块独立,易于维护
可测试性 模块可以独立测试
可复用性 模块可以独立复用
可理解性 模块功能明确,易于理解
可修改性 修改一个模块不影响其他模块
开发效率 可以并行开发不同模块

(三)模块独立性的好处

独立性好处
#mermaid-svg-uMu40qFRrU4KPlBK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uMu40qFRrU4KPlBK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uMu40qFRrU4KPlBK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uMu40qFRrU4KPlBK .error-icon{fill:#552222;}#mermaid-svg-uMu40qFRrU4KPlBK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uMu40qFRrU4KPlBK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uMu40qFRrU4KPlBK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uMu40qFRrU4KPlBK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uMu40qFRrU4KPlBK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uMu40qFRrU4KPlBK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uMu40qFRrU4KPlBK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uMu40qFRrU4KPlBK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uMu40qFRrU4KPlBK .marker.cross{stroke:#333333;}#mermaid-svg-uMu40qFRrU4KPlBK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uMu40qFRrU4KPlBK p{margin:0;}#mermaid-svg-uMu40qFRrU4KPlBK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uMu40qFRrU4KPlBK .cluster-label text{fill:#333;}#mermaid-svg-uMu40qFRrU4KPlBK .cluster-label span{color:#333;}#mermaid-svg-uMu40qFRrU4KPlBK .cluster-label span p{background-color:transparent;}#mermaid-svg-uMu40qFRrU4KPlBK .label text,#mermaid-svg-uMu40qFRrU4KPlBK span{fill:#333;color:#333;}#mermaid-svg-uMu40qFRrU4KPlBK .node rect,#mermaid-svg-uMu40qFRrU4KPlBK .node circle,#mermaid-svg-uMu40qFRrU4KPlBK .node ellipse,#mermaid-svg-uMu40qFRrU4KPlBK .node polygon,#mermaid-svg-uMu40qFRrU4KPlBK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uMu40qFRrU4KPlBK .rough-node .label text,#mermaid-svg-uMu40qFRrU4KPlBK .node .label text,#mermaid-svg-uMu40qFRrU4KPlBK .image-shape .label,#mermaid-svg-uMu40qFRrU4KPlBK .icon-shape .label{text-anchor:middle;}#mermaid-svg-uMu40qFRrU4KPlBK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uMu40qFRrU4KPlBK .rough-node .label,#mermaid-svg-uMu40qFRrU4KPlBK .node .label,#mermaid-svg-uMu40qFRrU4KPlBK .image-shape .label,#mermaid-svg-uMu40qFRrU4KPlBK .icon-shape .label{text-align:center;}#mermaid-svg-uMu40qFRrU4KPlBK .node.clickable{cursor:pointer;}#mermaid-svg-uMu40qFRrU4KPlBK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uMu40qFRrU4KPlBK .arrowheadPath{fill:#333333;}#mermaid-svg-uMu40qFRrU4KPlBK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uMu40qFRrU4KPlBK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uMu40qFRrU4KPlBK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uMu40qFRrU4KPlBK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uMu40qFRrU4KPlBK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uMu40qFRrU4KPlBK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uMu40qFRrU4KPlBK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uMu40qFRrU4KPlBK .cluster text{fill:#333;}#mermaid-svg-uMu40qFRrU4KPlBK .cluster span{color:#333;}#mermaid-svg-uMu40qFRrU4KPlBK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uMu40qFRrU4KPlBK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uMu40qFRrU4KPlBK rect.text{fill:none;stroke-width:0;}#mermaid-svg-uMu40qFRrU4KPlBK .icon-shape,#mermaid-svg-uMu40qFRrU4KPlBK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uMu40qFRrU4KPlBK .icon-shape p,#mermaid-svg-uMu40qFRrU4KPlBK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uMu40qFRrU4KPlBK .icon-shape .label rect,#mermaid-svg-uMu40qFRrU4KPlBK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uMu40qFRrU4KPlBK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uMu40qFRrU4KPlBK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uMu40qFRrU4KPlBK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 模块独立性好处
分解问题
简化设计
提高质量
提高效率
复杂问题分解为简单问题
简化系统设计
提高软件质量
提高开发效率

📦 二、模块独立性的度量标准

(一)度量指标

度量指标

模块独立性主要通过两个定性指标来度量:

指标 说明 目标
内聚性(Cohesion) 模块内部各元素之间的关联程度 高内聚
耦合性(Coupling) 模块之间相互依赖的程度 低耦合

(二)度量关系

度量关系
#mermaid-svg-H5MsFu9s6EtgypbT{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-H5MsFu9s6EtgypbT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-H5MsFu9s6EtgypbT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-H5MsFu9s6EtgypbT .error-icon{fill:#552222;}#mermaid-svg-H5MsFu9s6EtgypbT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-H5MsFu9s6EtgypbT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-H5MsFu9s6EtgypbT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-H5MsFu9s6EtgypbT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-H5MsFu9s6EtgypbT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-H5MsFu9s6EtgypbT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-H5MsFu9s6EtgypbT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-H5MsFu9s6EtgypbT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-H5MsFu9s6EtgypbT .marker.cross{stroke:#333333;}#mermaid-svg-H5MsFu9s6EtgypbT svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-H5MsFu9s6EtgypbT p{margin:0;}#mermaid-svg-H5MsFu9s6EtgypbT .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-H5MsFu9s6EtgypbT .cluster-label text{fill:#333;}#mermaid-svg-H5MsFu9s6EtgypbT .cluster-label span{color:#333;}#mermaid-svg-H5MsFu9s6EtgypbT .cluster-label span p{background-color:transparent;}#mermaid-svg-H5MsFu9s6EtgypbT .label text,#mermaid-svg-H5MsFu9s6EtgypbT span{fill:#333;color:#333;}#mermaid-svg-H5MsFu9s6EtgypbT .node rect,#mermaid-svg-H5MsFu9s6EtgypbT .node circle,#mermaid-svg-H5MsFu9s6EtgypbT .node ellipse,#mermaid-svg-H5MsFu9s6EtgypbT .node polygon,#mermaid-svg-H5MsFu9s6EtgypbT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-H5MsFu9s6EtgypbT .rough-node .label text,#mermaid-svg-H5MsFu9s6EtgypbT .node .label text,#mermaid-svg-H5MsFu9s6EtgypbT .image-shape .label,#mermaid-svg-H5MsFu9s6EtgypbT .icon-shape .label{text-anchor:middle;}#mermaid-svg-H5MsFu9s6EtgypbT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-H5MsFu9s6EtgypbT .rough-node .label,#mermaid-svg-H5MsFu9s6EtgypbT .node .label,#mermaid-svg-H5MsFu9s6EtgypbT .image-shape .label,#mermaid-svg-H5MsFu9s6EtgypbT .icon-shape .label{text-align:center;}#mermaid-svg-H5MsFu9s6EtgypbT .node.clickable{cursor:pointer;}#mermaid-svg-H5MsFu9s6EtgypbT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-H5MsFu9s6EtgypbT .arrowheadPath{fill:#333333;}#mermaid-svg-H5MsFu9s6EtgypbT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-H5MsFu9s6EtgypbT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-H5MsFu9s6EtgypbT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-H5MsFu9s6EtgypbT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-H5MsFu9s6EtgypbT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-H5MsFu9s6EtgypbT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-H5MsFu9s6EtgypbT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-H5MsFu9s6EtgypbT .cluster text{fill:#333;}#mermaid-svg-H5MsFu9s6EtgypbT .cluster span{color:#333;}#mermaid-svg-H5MsFu9s6EtgypbT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-H5MsFu9s6EtgypbT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-H5MsFu9s6EtgypbT rect.text{fill:none;stroke-width:0;}#mermaid-svg-H5MsFu9s6EtgypbT .icon-shape,#mermaid-svg-H5MsFu9s6EtgypbT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-H5MsFu9s6EtgypbT .icon-shape p,#mermaid-svg-H5MsFu9s6EtgypbT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-H5MsFu9s6EtgypbT .icon-shape .label rect,#mermaid-svg-H5MsFu9s6EtgypbT .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-H5MsFu9s6EtgypbT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-H5MsFu9s6EtgypbT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-H5MsFu9s6EtgypbT :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 模块独立性
内聚性
耦合性
模块内部关联
模块间依赖
高内聚
低耦合
模块独立性强

(三)度量原则

度量原则

原则 说明
高内聚 模块内部元素紧密相关
低耦合 模块间依赖关系简单
模块独立 模块功能独立

🌐 三、内聚性详解

(一)内聚性的定义

内聚性(Cohesion)衡量模块内部各元素之间的关联程度,反映模块功能的专一性。

内聚性概念
#mermaid-svg-sthFcyVbI6W8csSf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sthFcyVbI6W8csSf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sthFcyVbI6W8csSf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sthFcyVbI6W8csSf .error-icon{fill:#552222;}#mermaid-svg-sthFcyVbI6W8csSf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sthFcyVbI6W8csSf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sthFcyVbI6W8csSf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sthFcyVbI6W8csSf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sthFcyVbI6W8csSf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sthFcyVbI6W8csSf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sthFcyVbI6W8csSf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sthFcyVbI6W8csSf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sthFcyVbI6W8csSf .marker.cross{stroke:#333333;}#mermaid-svg-sthFcyVbI6W8csSf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sthFcyVbI6W8csSf p{margin:0;}#mermaid-svg-sthFcyVbI6W8csSf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sthFcyVbI6W8csSf .cluster-label text{fill:#333;}#mermaid-svg-sthFcyVbI6W8csSf .cluster-label span{color:#333;}#mermaid-svg-sthFcyVbI6W8csSf .cluster-label span p{background-color:transparent;}#mermaid-svg-sthFcyVbI6W8csSf .label text,#mermaid-svg-sthFcyVbI6W8csSf span{fill:#333;color:#333;}#mermaid-svg-sthFcyVbI6W8csSf .node rect,#mermaid-svg-sthFcyVbI6W8csSf .node circle,#mermaid-svg-sthFcyVbI6W8csSf .node ellipse,#mermaid-svg-sthFcyVbI6W8csSf .node polygon,#mermaid-svg-sthFcyVbI6W8csSf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sthFcyVbI6W8csSf .rough-node .label text,#mermaid-svg-sthFcyVbI6W8csSf .node .label text,#mermaid-svg-sthFcyVbI6W8csSf .image-shape .label,#mermaid-svg-sthFcyVbI6W8csSf .icon-shape .label{text-anchor:middle;}#mermaid-svg-sthFcyVbI6W8csSf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sthFcyVbI6W8csSf .rough-node .label,#mermaid-svg-sthFcyVbI6W8csSf .node .label,#mermaid-svg-sthFcyVbI6W8csSf .image-shape .label,#mermaid-svg-sthFcyVbI6W8csSf .icon-shape .label{text-align:center;}#mermaid-svg-sthFcyVbI6W8csSf .node.clickable{cursor:pointer;}#mermaid-svg-sthFcyVbI6W8csSf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sthFcyVbI6W8csSf .arrowheadPath{fill:#333333;}#mermaid-svg-sthFcyVbI6W8csSf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sthFcyVbI6W8csSf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sthFcyVbI6W8csSf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sthFcyVbI6W8csSf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sthFcyVbI6W8csSf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sthFcyVbI6W8csSf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sthFcyVbI6W8csSf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sthFcyVbI6W8csSf .cluster text{fill:#333;}#mermaid-svg-sthFcyVbI6W8csSf .cluster span{color:#333;}#mermaid-svg-sthFcyVbI6W8csSf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sthFcyVbI6W8csSf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sthFcyVbI6W8csSf rect.text{fill:none;stroke-width:0;}#mermaid-svg-sthFcyVbI6W8csSf .icon-shape,#mermaid-svg-sthFcyVbI6W8csSf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sthFcyVbI6W8csSf .icon-shape p,#mermaid-svg-sthFcyVbI6W8csSf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sthFcyVbI6W8csSf .icon-shape .label rect,#mermaid-svg-sthFcyVbI6W8csSf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sthFcyVbI6W8csSf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sthFcyVbI6W8csSf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sthFcyVbI6W8csSf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 内聚性
模块内部
元素关联程度
高内聚
低内聚
元素紧密相关
功能专一
元素松散关联
功能混杂

(二)内聚性类型

内聚性分类

内聚性从低到高分为七种类型:

内聚类型 说明 强度 评价
偶然内聚 模块内元素无关联 最弱 最差
逻辑内聚 执行逻辑相关的功能
时间内聚 在同一时间段执行 较差
过程内聚 按特定顺序执行 中等 一般
通信内聚 使用相同数据 较强 较好
顺序内聚 前一元素输出是后一元素输入
功能内聚 共同完成单一功能 最强 最好

(三)内聚性详解

1. 偶然内聚

偶然内聚是最低级别的内聚,模块内元素之间没有任何关联。

复制代码
// 偶然内聚示例
模块A:
  - 计算员工工资
  - 打印报表
  - 读取配置文件
  - 发送电子邮件

2. 逻辑内聚

逻辑内聚的模块包含多个逻辑上相关的功能,通过参数选择执行哪个功能。

复制代码
// 逻辑内聚示例
模块B:处理所有输入
  if (type == 1)
    处理输入1
  else if (type == 2)
    处理输入2
  else if (type == 3)
    处理输入3

3. 时间内聚

时间内聚的模块包含在同一时间段内执行的功能。

复制代码
// 时间内聚示例
模块C:初始化模块
  - 初始化变量
  - 打开文件
  - 建立连接
  - 读取配置

4. 过程内聚

过程内聚的模块包含按特定顺序执行的功能。

复制代码
// 过程内聚示例
模块D:订单处理流程
  - 验证订单
  - 计算价格
  - 检查库存
  - 生成订单号

5. 通信内聚

通信内聚的模块包含使用相同数据的功能。

复制代码
// 通信内聚示例
模块E:学生数据处理
  - 读取学生数据
  - 计算学生平均分
  - 输出学生成绩

6. 顺序内聚

顺序内聚的模块中,前一元素的输出是后一元素的输入。

复制代码
// 顺序内聚示例
模块F:数据处理流水线
  - 读取数据 → 数据
  - 验证数据 → 验证结果
  - 转换数据 → 转换结果
  - 输出数据

7. 功能内聚

功能内聚是最高级别的内聚,模块内所有元素共同完成单一功能。

复制代码
// 功能内聚示例
模块G:计算平方根
  - 所有代码共同完成计算平方根的功能

(四)内聚性比较

内聚性层次
#mermaid-svg-E79hToAbORtjwYpp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-E79hToAbORtjwYpp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-E79hToAbORtjwYpp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-E79hToAbORtjwYpp .error-icon{fill:#552222;}#mermaid-svg-E79hToAbORtjwYpp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-E79hToAbORtjwYpp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-E79hToAbORtjwYpp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-E79hToAbORtjwYpp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-E79hToAbORtjwYpp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-E79hToAbORtjwYpp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-E79hToAbORtjwYpp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-E79hToAbORtjwYpp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-E79hToAbORtjwYpp .marker.cross{stroke:#333333;}#mermaid-svg-E79hToAbORtjwYpp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-E79hToAbORtjwYpp p{margin:0;}#mermaid-svg-E79hToAbORtjwYpp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-E79hToAbORtjwYpp .cluster-label text{fill:#333;}#mermaid-svg-E79hToAbORtjwYpp .cluster-label span{color:#333;}#mermaid-svg-E79hToAbORtjwYpp .cluster-label span p{background-color:transparent;}#mermaid-svg-E79hToAbORtjwYpp .label text,#mermaid-svg-E79hToAbORtjwYpp span{fill:#333;color:#333;}#mermaid-svg-E79hToAbORtjwYpp .node rect,#mermaid-svg-E79hToAbORtjwYpp .node circle,#mermaid-svg-E79hToAbORtjwYpp .node ellipse,#mermaid-svg-E79hToAbORtjwYpp .node polygon,#mermaid-svg-E79hToAbORtjwYpp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-E79hToAbORtjwYpp .rough-node .label text,#mermaid-svg-E79hToAbORtjwYpp .node .label text,#mermaid-svg-E79hToAbORtjwYpp .image-shape .label,#mermaid-svg-E79hToAbORtjwYpp .icon-shape .label{text-anchor:middle;}#mermaid-svg-E79hToAbORtjwYpp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-E79hToAbORtjwYpp .rough-node .label,#mermaid-svg-E79hToAbORtjwYpp .node .label,#mermaid-svg-E79hToAbORtjwYpp .image-shape .label,#mermaid-svg-E79hToAbORtjwYpp .icon-shape .label{text-align:center;}#mermaid-svg-E79hToAbORtjwYpp .node.clickable{cursor:pointer;}#mermaid-svg-E79hToAbORtjwYpp .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-E79hToAbORtjwYpp .arrowheadPath{fill:#333333;}#mermaid-svg-E79hToAbORtjwYpp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-E79hToAbORtjwYpp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-E79hToAbORtjwYpp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-E79hToAbORtjwYpp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-E79hToAbORtjwYpp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-E79hToAbORtjwYpp .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-E79hToAbORtjwYpp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-E79hToAbORtjwYpp .cluster text{fill:#333;}#mermaid-svg-E79hToAbORtjwYpp .cluster span{color:#333;}#mermaid-svg-E79hToAbORtjwYpp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-E79hToAbORtjwYpp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-E79hToAbORtjwYpp rect.text{fill:none;stroke-width:0;}#mermaid-svg-E79hToAbORtjwYpp .icon-shape,#mermaid-svg-E79hToAbORtjwYpp .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-E79hToAbORtjwYpp .icon-shape p,#mermaid-svg-E79hToAbORtjwYpp .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-E79hToAbORtjwYpp .icon-shape .label rect,#mermaid-svg-E79hToAbORtjwYpp .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-E79hToAbORtjwYpp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-E79hToAbORtjwYpp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-E79hToAbORtjwYpp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 偶然内聚
逻辑内聚
时间内聚
过程内聚
通信内聚
顺序内聚
功能内聚
最弱
最强

📊 四、耦合性详解

(一)耦合性的定义

耦合性(Coupling)衡量模块之间相互依赖的程度,反映模块间联系的紧密程度。

耦合性概念
#mermaid-svg-seDnxfDcBmuhdHo3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-seDnxfDcBmuhdHo3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-seDnxfDcBmuhdHo3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-seDnxfDcBmuhdHo3 .error-icon{fill:#552222;}#mermaid-svg-seDnxfDcBmuhdHo3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-seDnxfDcBmuhdHo3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-seDnxfDcBmuhdHo3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-seDnxfDcBmuhdHo3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-seDnxfDcBmuhdHo3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-seDnxfDcBmuhdHo3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-seDnxfDcBmuhdHo3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-seDnxfDcBmuhdHo3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-seDnxfDcBmuhdHo3 .marker.cross{stroke:#333333;}#mermaid-svg-seDnxfDcBmuhdHo3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-seDnxfDcBmuhdHo3 p{margin:0;}#mermaid-svg-seDnxfDcBmuhdHo3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-seDnxfDcBmuhdHo3 .cluster-label text{fill:#333;}#mermaid-svg-seDnxfDcBmuhdHo3 .cluster-label span{color:#333;}#mermaid-svg-seDnxfDcBmuhdHo3 .cluster-label span p{background-color:transparent;}#mermaid-svg-seDnxfDcBmuhdHo3 .label text,#mermaid-svg-seDnxfDcBmuhdHo3 span{fill:#333;color:#333;}#mermaid-svg-seDnxfDcBmuhdHo3 .node rect,#mermaid-svg-seDnxfDcBmuhdHo3 .node circle,#mermaid-svg-seDnxfDcBmuhdHo3 .node ellipse,#mermaid-svg-seDnxfDcBmuhdHo3 .node polygon,#mermaid-svg-seDnxfDcBmuhdHo3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-seDnxfDcBmuhdHo3 .rough-node .label text,#mermaid-svg-seDnxfDcBmuhdHo3 .node .label text,#mermaid-svg-seDnxfDcBmuhdHo3 .image-shape .label,#mermaid-svg-seDnxfDcBmuhdHo3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-seDnxfDcBmuhdHo3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-seDnxfDcBmuhdHo3 .rough-node .label,#mermaid-svg-seDnxfDcBmuhdHo3 .node .label,#mermaid-svg-seDnxfDcBmuhdHo3 .image-shape .label,#mermaid-svg-seDnxfDcBmuhdHo3 .icon-shape .label{text-align:center;}#mermaid-svg-seDnxfDcBmuhdHo3 .node.clickable{cursor:pointer;}#mermaid-svg-seDnxfDcBmuhdHo3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-seDnxfDcBmuhdHo3 .arrowheadPath{fill:#333333;}#mermaid-svg-seDnxfDcBmuhdHo3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-seDnxfDcBmuhdHo3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-seDnxfDcBmuhdHo3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-seDnxfDcBmuhdHo3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-seDnxfDcBmuhdHo3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-seDnxfDcBmuhdHo3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-seDnxfDcBmuhdHo3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-seDnxfDcBmuhdHo3 .cluster text{fill:#333;}#mermaid-svg-seDnxfDcBmuhdHo3 .cluster span{color:#333;}#mermaid-svg-seDnxfDcBmuhdHo3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-seDnxfDcBmuhdHo3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-seDnxfDcBmuhdHo3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-seDnxfDcBmuhdHo3 .icon-shape,#mermaid-svg-seDnxfDcBmuhdHo3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-seDnxfDcBmuhdHo3 .icon-shape p,#mermaid-svg-seDnxfDcBmuhdHo3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-seDnxfDcBmuhdHo3 .icon-shape .label rect,#mermaid-svg-seDnxfDcBmuhdHo3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-seDnxfDcBmuhdHo3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-seDnxfDcBmuhdHo3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-seDnxfDcBmuhdHo3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 耦合性
模块之间
相互依赖程度
高耦合
低耦合
依赖紧密
修改影响大
依赖松散
修改影响小

(二)耦合性类型

耦合性分类

耦合性从强到弱分为七种类型:

耦合类型 说明 强度 评价
内容耦合 直接访问另一模块内部 最强 最差
公共耦合 通过公共数据区交互
外部耦合 共享外部环境 较强 较差
控制耦合 传递控制信息 中等 一般
标记耦合 传递数据结构 较弱 较好
数据耦合 传递数据参数 最弱
无直接耦合 无直接关系 最好

(三)耦合性详解

1. 内容耦合

内容耦合是最强级别的耦合,一个模块直接访问另一模块的内部。

复制代码
// 内容耦合示例
模块A:
  goto 模块B的内部标签L1

2. 公共耦合

公共耦合的模块通过公共数据区(如全局变量)进行交互。

复制代码
// 公共耦合示例
全局变量:globalData

模块A:
  globalData = 10

模块B:
  print(globalData)

3. 外部耦合

外部耦合的模块共享外部环境(如外部文件、设备)。

复制代码
// 外部耦合示例
模块A:
  写入文件 data.txt

模块B:
  读取文件 data.txt

4. 控制耦合

控制耦合的模块通过传递控制信息(如标志位)进行交互。

复制代码
// 控制耦合示例
模块A:
  flag = true
  调用 模块B(flag)

模块B:
  if (flag == true)
    执行操作1
  else
    执行操作2

5. 标记耦合

标记耦合的模块通过传递数据结构进行交互。

复制代码
// 标记耦合示例
模块A:
  student = {id: "001", name: "张三", age: 20}
  调用 模块B(student)

模块B:
  接收 student
  print(student.name)

6. 数据耦合

数据耦合是最弱级别的耦合,模块通过传递简单数据参数进行交互。

复制代码
// 数据耦合示例
模块A:
  调用 模块B(10, 20)

模块B:
  接收 a, b
  return a + b

7. 无直接耦合

无直接耦合的模块之间没有直接关系,通过父模块调用。

复制代码
// 无直接耦合示例
父模块:
  调用 模块A
  调用 模块B

模块A和模块B之间无直接关系

(四)耦合性比较

耦合性层次
#mermaid-svg-WPv8lNZHGeOpNGPg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WPv8lNZHGeOpNGPg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WPv8lNZHGeOpNGPg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WPv8lNZHGeOpNGPg .error-icon{fill:#552222;}#mermaid-svg-WPv8lNZHGeOpNGPg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WPv8lNZHGeOpNGPg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WPv8lNZHGeOpNGPg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WPv8lNZHGeOpNGPg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WPv8lNZHGeOpNGPg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WPv8lNZHGeOpNGPg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WPv8lNZHGeOpNGPg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WPv8lNZHGeOpNGPg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WPv8lNZHGeOpNGPg .marker.cross{stroke:#333333;}#mermaid-svg-WPv8lNZHGeOpNGPg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WPv8lNZHGeOpNGPg p{margin:0;}#mermaid-svg-WPv8lNZHGeOpNGPg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WPv8lNZHGeOpNGPg .cluster-label text{fill:#333;}#mermaid-svg-WPv8lNZHGeOpNGPg .cluster-label span{color:#333;}#mermaid-svg-WPv8lNZHGeOpNGPg .cluster-label span p{background-color:transparent;}#mermaid-svg-WPv8lNZHGeOpNGPg .label text,#mermaid-svg-WPv8lNZHGeOpNGPg span{fill:#333;color:#333;}#mermaid-svg-WPv8lNZHGeOpNGPg .node rect,#mermaid-svg-WPv8lNZHGeOpNGPg .node circle,#mermaid-svg-WPv8lNZHGeOpNGPg .node ellipse,#mermaid-svg-WPv8lNZHGeOpNGPg .node polygon,#mermaid-svg-WPv8lNZHGeOpNGPg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WPv8lNZHGeOpNGPg .rough-node .label text,#mermaid-svg-WPv8lNZHGeOpNGPg .node .label text,#mermaid-svg-WPv8lNZHGeOpNGPg .image-shape .label,#mermaid-svg-WPv8lNZHGeOpNGPg .icon-shape .label{text-anchor:middle;}#mermaid-svg-WPv8lNZHGeOpNGPg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WPv8lNZHGeOpNGPg .rough-node .label,#mermaid-svg-WPv8lNZHGeOpNGPg .node .label,#mermaid-svg-WPv8lNZHGeOpNGPg .image-shape .label,#mermaid-svg-WPv8lNZHGeOpNGPg .icon-shape .label{text-align:center;}#mermaid-svg-WPv8lNZHGeOpNGPg .node.clickable{cursor:pointer;}#mermaid-svg-WPv8lNZHGeOpNGPg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WPv8lNZHGeOpNGPg .arrowheadPath{fill:#333333;}#mermaid-svg-WPv8lNZHGeOpNGPg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WPv8lNZHGeOpNGPg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WPv8lNZHGeOpNGPg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WPv8lNZHGeOpNGPg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WPv8lNZHGeOpNGPg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WPv8lNZHGeOpNGPg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WPv8lNZHGeOpNGPg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WPv8lNZHGeOpNGPg .cluster text{fill:#333;}#mermaid-svg-WPv8lNZHGeOpNGPg .cluster span{color:#333;}#mermaid-svg-WPv8lNZHGeOpNGPg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WPv8lNZHGeOpNGPg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WPv8lNZHGeOpNGPg rect.text{fill:none;stroke-width:0;}#mermaid-svg-WPv8lNZHGeOpNGPg .icon-shape,#mermaid-svg-WPv8lNZHGeOpNGPg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WPv8lNZHGeOpNGPg .icon-shape p,#mermaid-svg-WPv8lNZHGeOpNGPg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WPv8lNZHGeOpNGPg .icon-shape .label rect,#mermaid-svg-WPv8lNZHGeOpNGPg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WPv8lNZHGeOpNGPg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WPv8lNZHGeOpNGPg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WPv8lNZHGeOpNGPg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 内容耦合
公共耦合
外部耦合
控制耦合
标记耦合
数据耦合
无直接耦合
最强
无耦合

💡 五、提高模块独立性的方法

(一)提高内聚性的方法

提高方法

方法 说明
功能单一 一个模块只做一件事
功能明确 模块功能明确定义
元素相关 模块内元素紧密相关
避免混杂 避免将不相关功能放在同一模块

(二)降低耦合性的方法

降低方法

方法 说明
简化接口 减少模块间接口参数
数据耦合 尽量使用数据耦合
避免公共 避免使用全局变量
信息隐藏 隐藏模块内部细节

(三)设计原则

设计原则
#mermaid-svg-OXBVKtA1ghKvwRSq{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OXBVKtA1ghKvwRSq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OXBVKtA1ghKvwRSq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OXBVKtA1ghKvwRSq .error-icon{fill:#552222;}#mermaid-svg-OXBVKtA1ghKvwRSq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OXBVKtA1ghKvwRSq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OXBVKtA1ghKvwRSq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OXBVKtA1ghKvwRSq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OXBVKtA1ghKvwRSq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OXBVKtA1ghKvwRSq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OXBVKtA1ghKvwRSq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OXBVKtA1ghKvwRSq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OXBVKtA1ghKvwRSq .marker.cross{stroke:#333333;}#mermaid-svg-OXBVKtA1ghKvwRSq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OXBVKtA1ghKvwRSq p{margin:0;}#mermaid-svg-OXBVKtA1ghKvwRSq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OXBVKtA1ghKvwRSq .cluster-label text{fill:#333;}#mermaid-svg-OXBVKtA1ghKvwRSq .cluster-label span{color:#333;}#mermaid-svg-OXBVKtA1ghKvwRSq .cluster-label span p{background-color:transparent;}#mermaid-svg-OXBVKtA1ghKvwRSq .label text,#mermaid-svg-OXBVKtA1ghKvwRSq span{fill:#333;color:#333;}#mermaid-svg-OXBVKtA1ghKvwRSq .node rect,#mermaid-svg-OXBVKtA1ghKvwRSq .node circle,#mermaid-svg-OXBVKtA1ghKvwRSq .node ellipse,#mermaid-svg-OXBVKtA1ghKvwRSq .node polygon,#mermaid-svg-OXBVKtA1ghKvwRSq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OXBVKtA1ghKvwRSq .rough-node .label text,#mermaid-svg-OXBVKtA1ghKvwRSq .node .label text,#mermaid-svg-OXBVKtA1ghKvwRSq .image-shape .label,#mermaid-svg-OXBVKtA1ghKvwRSq .icon-shape .label{text-anchor:middle;}#mermaid-svg-OXBVKtA1ghKvwRSq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OXBVKtA1ghKvwRSq .rough-node .label,#mermaid-svg-OXBVKtA1ghKvwRSq .node .label,#mermaid-svg-OXBVKtA1ghKvwRSq .image-shape .label,#mermaid-svg-OXBVKtA1ghKvwRSq .icon-shape .label{text-align:center;}#mermaid-svg-OXBVKtA1ghKvwRSq .node.clickable{cursor:pointer;}#mermaid-svg-OXBVKtA1ghKvwRSq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OXBVKtA1ghKvwRSq .arrowheadPath{fill:#333333;}#mermaid-svg-OXBVKtA1ghKvwRSq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OXBVKtA1ghKvwRSq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OXBVKtA1ghKvwRSq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OXBVKtA1ghKvwRSq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OXBVKtA1ghKvwRSq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OXBVKtA1ghKvwRSq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OXBVKtA1ghKvwRSq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OXBVKtA1ghKvwRSq .cluster text{fill:#333;}#mermaid-svg-OXBVKtA1ghKvwRSq .cluster span{color:#333;}#mermaid-svg-OXBVKtA1ghKvwRSq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OXBVKtA1ghKvwRSq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OXBVKtA1ghKvwRSq rect.text{fill:none;stroke-width:0;}#mermaid-svg-OXBVKtA1ghKvwRSq .icon-shape,#mermaid-svg-OXBVKtA1ghKvwRSq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OXBVKtA1ghKvwRSq .icon-shape p,#mermaid-svg-OXBVKtA1ghKvwRSq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OXBVKtA1ghKvwRSq .icon-shape .label rect,#mermaid-svg-OXBVKtA1ghKvwRSq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OXBVKtA1ghKvwRSq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OXBVKtA1ghKvwRSq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OXBVKtA1ghKvwRSq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 提高模块独立性
提高内聚性
降低耦合性
功能单一
功能明确
简化接口
数据耦合
模块独立

📋 六、模块独立性设计实例

(一)实例背景

项目:学生成绩管理系统

原设计问题

复制代码
// 低内聚高耦合的设计
模块A:学生管理
  - 学生信息录入
  - 成绩计算
  - 报表打印
  - 数据备份

(二)改进设计

改进后设计
#mermaid-svg-o382ylX2dkZJfuK2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-o382ylX2dkZJfuK2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-o382ylX2dkZJfuK2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-o382ylX2dkZJfuK2 .error-icon{fill:#552222;}#mermaid-svg-o382ylX2dkZJfuK2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-o382ylX2dkZJfuK2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-o382ylX2dkZJfuK2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-o382ylX2dkZJfuK2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-o382ylX2dkZJfuK2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-o382ylX2dkZJfuK2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-o382ylX2dkZJfuK2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-o382ylX2dkZJfuK2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-o382ylX2dkZJfuK2 .marker.cross{stroke:#333333;}#mermaid-svg-o382ylX2dkZJfuK2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-o382ylX2dkZJfuK2 p{margin:0;}#mermaid-svg-o382ylX2dkZJfuK2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-o382ylX2dkZJfuK2 .cluster-label text{fill:#333;}#mermaid-svg-o382ylX2dkZJfuK2 .cluster-label span{color:#333;}#mermaid-svg-o382ylX2dkZJfuK2 .cluster-label span p{background-color:transparent;}#mermaid-svg-o382ylX2dkZJfuK2 .label text,#mermaid-svg-o382ylX2dkZJfuK2 span{fill:#333;color:#333;}#mermaid-svg-o382ylX2dkZJfuK2 .node rect,#mermaid-svg-o382ylX2dkZJfuK2 .node circle,#mermaid-svg-o382ylX2dkZJfuK2 .node ellipse,#mermaid-svg-o382ylX2dkZJfuK2 .node polygon,#mermaid-svg-o382ylX2dkZJfuK2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-o382ylX2dkZJfuK2 .rough-node .label text,#mermaid-svg-o382ylX2dkZJfuK2 .node .label text,#mermaid-svg-o382ylX2dkZJfuK2 .image-shape .label,#mermaid-svg-o382ylX2dkZJfuK2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-o382ylX2dkZJfuK2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-o382ylX2dkZJfuK2 .rough-node .label,#mermaid-svg-o382ylX2dkZJfuK2 .node .label,#mermaid-svg-o382ylX2dkZJfuK2 .image-shape .label,#mermaid-svg-o382ylX2dkZJfuK2 .icon-shape .label{text-align:center;}#mermaid-svg-o382ylX2dkZJfuK2 .node.clickable{cursor:pointer;}#mermaid-svg-o382ylX2dkZJfuK2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-o382ylX2dkZJfuK2 .arrowheadPath{fill:#333333;}#mermaid-svg-o382ylX2dkZJfuK2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-o382ylX2dkZJfuK2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-o382ylX2dkZJfuK2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-o382ylX2dkZJfuK2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-o382ylX2dkZJfuK2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-o382ylX2dkZJfuK2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-o382ylX2dkZJfuK2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-o382ylX2dkZJfuK2 .cluster text{fill:#333;}#mermaid-svg-o382ylX2dkZJfuK2 .cluster span{color:#333;}#mermaid-svg-o382ylX2dkZJfuK2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-o382ylX2dkZJfuK2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-o382ylX2dkZJfuK2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-o382ylX2dkZJfuK2 .icon-shape,#mermaid-svg-o382ylX2dkZJfuK2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-o382ylX2dkZJfuK2 .icon-shape p,#mermaid-svg-o382ylX2dkZJfuK2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-o382ylX2dkZJfuK2 .icon-shape .label rect,#mermaid-svg-o382ylX2dkZJfuK2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-o382ylX2dkZJfuK2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-o382ylX2dkZJfuK2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-o382ylX2dkZJfuK2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 学生成绩管理系统
学生信息管理模块
成绩管理模块
报表模块
数据备份模块
学生信息录入
学生信息查询
学生信息修改
成绩录入
成绩计算
成绩查询
报表生成
报表打印
数据备份
数据恢复

(三)改进分析

改进分析

改进项 改进前 改进后
内聚性 低(偶然内聚) 高(功能内聚)
耦合性 高(公共耦合) 低(数据耦合)
模块独立性
可维护性

(四)接口设计

改进后接口设计

复制代码
// 模块接口设计
学生信息管理模块:
  - addStudent(studentId, name, age, major) → result
  - getStudent(studentId) → studentInfo
  - updateStudent(studentId, info) → result

成绩管理模块:
  - addScore(studentId, courseId, score) → result
  - calculateAverage(studentId) → average
  - getScores(studentId) → scoreList

报表模块:
  - generateReport(type, data) → report
  - printReport(report) → result

数据备份模块:
  - backup(data) → result
  - restore(backupFile) → result

📝 总结

模块独立性是软件设计的核心度量标准,直接决定软件质量。

🎯 模块独立性定义:每个模块只完成系统要求的独立功能,与其他模块联系最少、接口最简单。

📦 度量标准

  • 内聚性:衡量模块内部各元素之间的关联程度,从低到高分为偶然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚、功能内聚
  • 耦合性:衡量模块之间相互依赖的程度,从强到弱分为内容耦合、公共耦合、外部耦合、控制耦合、标记耦合、数据耦合、无直接耦合

🌐 设计原则:高内聚低耦合------追求功能内聚,避免偶然内聚;追求数据耦合,避免内容耦合。

💡 提高方法

  • 提高内聚性:功能单一、功能明确、元素相关、避免混杂
  • 降低耦合性:简化接口、数据耦合、避免公共、信息隐藏

📋 设计目标:模块独立性强------可维护性好、可测试性好、可复用性好、可理解性好、可修改性好、开发效率高。


核心启示:模块独立性是软件设计的核心,"高内聚低耦合"是设计的黄金法则。良好的模块独立性能够显著提高软件的可维护性、可测试性、可复用性和开发效率。在实际工作中,我们需要注意:第一,追求功能内聚,一个模块只做一件事,做到极致;第二,追求数据耦合,模块间通过简单参数交互,减少依赖;第三,避免内容耦合和公共耦合,不要直接访问模块内部或使用全局变量;第四,简化模块接口,参数越少越好;第五,重视信息隐藏,保护模块内部实现细节。模块独立性设计是一项需要经验和技巧的工作,需要设计师具备良好的抽象能力和分解能力。通过合理的模块独立性设计,我们可以构建出高质量、易维护的软件系统。记住:"高内聚低耦合"不仅是一种设计原则,更是一种设计哲学。


相关推荐
梁辰兴9 小时前
软件工程:模块化
软件工程·设计原则·模块化·定义·梁辰兴·内聚性·耦合性
郝学胜-神的一滴21 小时前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
rolt1 天前
《软件方法》强化自测题-分析(12)
软件工程·架构师·uml
lanfordxb2 天前
从 Markdown 到图片卡片:MarkCard Studio 的功能设计与官网实现记录
rust·软件工程·ai工具
郝学胜-神的一滴2 天前
[简化版 GAMES 104] 现代游戏引擎 04:从0到1构建你的游戏世界
c++·游戏·unity·游戏引擎·软件工程·unreal engine
Dr.kangder2 天前
嵌入式处理器架构解析(七)——SPARC
架构·嵌入式·软件工程
智造ERP规划2 天前
项目型制造成本核算:WBS成本归集、变更冲击量、完工百分比,三个逻辑讲透
数据库·系统架构·软件工程·制造
智造ERP规划2 天前
项目型制造财务核算全流程:收入什么时候确认、成本怎么归集、开票≠收款,一条链讲透
大数据·系统架构·软件工程·制造
梁辰兴3 天前
软件工程:概要设计的任务
软件工程·设计原则·设计方法·梁辰兴·关键要点·概要设计的任务·主要任务