-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path2544566248.html
More file actions
960 lines (650 loc) · 37 KB
/
Copy path2544566248.html
File metadata and controls
960 lines (650 loc) · 37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
<!DOCTYPE html>
<html lang="en" data-default-color-scheme="auto">
<head>
<meta charset="UTF-8">
<link rel="apple-touch-icon" sizes="76x76" href="/img/fluid.png">
<link rel="icon" href="/img/fluid.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="theme-color" content="#2f4154">
<meta name="author" content="FangZhou">
<meta name="keywords" content="Vue,React,Nodejs,blogs,frontend,web,developer,programmer">
<meta name="description" content="软件工程复习笔记,涵盖耦合性、内聚性、UML建模、测试和CMMI等内容">
<meta property="og:type" content="article">
<meta property="og:title" content="软件工程复习笔记">
<meta property="og:url" content="http://arkpln.github.io/2544566248.html">
<meta property="og:site_name" content="Ark的技术博客">
<meta property="og:description" content="软件工程复习笔记,涵盖耦合性、内聚性、UML建模、测试和CMMI等内容">
<meta property="og:locale" content="en_US">
<meta property="og:image" content="http://arkpln.github.io/images/se.webp">
<meta property="article:published_time" content="2026-01-10T05:42:31.000Z">
<meta property="article:modified_time" content="2026-01-26T04:00:05.020Z">
<meta property="article:author" content="FangZhou">
<meta property="article:tag" content="software-engineering">
<meta property="article:tag" content="uml">
<meta property="article:tag" content="testing">
<meta property="article:tag" content="cmmi">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="http://arkpln.github.io/images/se.webp">
<title>软件工程复习笔记 - Ark的技术博客</title>
<link rel="stylesheet" href="https://lib.baomitu.com/twitter-bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://lib.baomitu.com/github-markdown-css/4.0.0/github-markdown.min.css">
<link rel="stylesheet" href="https://lib.baomitu.com/hint.css/2.7.0/hint.min.css">
<link rel="stylesheet" href="https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.css">
<!-- 主题依赖的图标库,不要自行修改 -->
<!-- Do not modify the link that theme dependent icons -->
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_1749284_5i9bdhy70f8.css">
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_1736178_k526ubmyhba.css">
<link rel="stylesheet" href="/css/main.css">
<link id="highlight-css" rel="stylesheet" href="/css/highlight.css">
<link id="highlight-css-dark" rel="stylesheet" href="/css/highlight-dark.css">
<script id="fluid-configs">
var Fluid = window.Fluid || {};
Fluid.ctx = Object.assign({}, Fluid.ctx)
var CONFIG = {"hostname":"arkpln.github.io","root":"/","version":"1.9.8","typing":{"enable":true,"typeSpeed":70,"cursorChar":"_","loop":false,"scope":[]},"anchorjs":{"enable":true,"element":"h1,h2,h3,h4,h5,h6","placement":"left","visible":"hover","icon":""},"progressbar":{"enable":true,"height_px":3,"color":"#29d","options":{"showSpinner":false,"trickleSpeed":100}},"code_language":{"enable":true,"default":"TEXT"},"copy_btn":true,"image_caption":{"enable":true},"image_zoom":{"enable":true,"img_url_replace":["",""]},"toc":{"enable":true,"placement":"right","headingSelector":"h1,h2,h3,h4,h5,h6","collapseDepth":0},"lazyload":{"enable":true,"loading_img":"/img/loading.gif","onlypost":false,"offset_factor":2},"web_analytics":{"enable":true,"follow_dnt":true,"baidu":null,"google":{"measurement_id":null},"tencent":{"sid":null,"cid":null},"leancloud":{"app_id":"mEwkD7geCX7RWNO8srhDE2oP-gzGzoHsz","app_key":"4EF76hyiVA1QILHZThVbfoat","server_url":"https://mewkd7ge.lc-cn-n1-shared.com","path":"window.location.pathname","ignore_local":false},"umami":{"src":null,"website_id":null,"domains":null,"start_time":"2024-01-01T00:00:00.000Z","token":null,"api_server":null}},"search_path":"/local-search.xml","include_content_in_search":true};
if (CONFIG.web_analytics.follow_dnt) {
var dntVal = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
Fluid.ctx.dnt = dntVal && (dntVal.startsWith('1') || dntVal.startsWith('yes') || dntVal.startsWith('on'));
}
</script>
<script src="/js/utils.js"></script>
<script src="/js/color-schema.js"></script>
<meta name="google-site-verification" content="5KfTZvtlydmBIzY97rVo-caP5jljAfmD3Qs3sBzY2Go"><style>ins.adsbygoogle[data-ad-status="unfilled"] { display: none !important; }</style>
<meta name="generator" content="Hexo 7.3.0"></head>
<body>
<header>
<div class="header-inner" style="height: 70vh;">
<nav id="navbar" class="navbar fixed-top navbar-expand-lg navbar-dark scrolling-navbar">
<div class="container">
<a class="navbar-brand" href="/">
<strong>Ark的技术博客</strong>
</a>
<button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<div class="animated-icon"><span></span><span></span><span></span></div>
</button>
<!-- Collapsible content -->
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ml-auto text-center">
<li class="nav-item">
<a class="nav-link" href="/" target="_self">
<i class="iconfont icon-home-fill"></i>
<span>快乐老家</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/archives/" target="_self">
<i class="iconfont icon-archive-fill"></i>
<span>笔岚档案</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/categories/" target="_self">
<i class="iconfont icon-category-fill"></i>
<span>文以类聚</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/tags/" target="_self">
<i class="iconfont icon-tags-fill"></i>
<span>按标签阅览</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/about/" target="_self">
<i class="iconfont icon-user-fill"></i>
<span>联系我</span>
</a>
</li>
<li class="nav-item" id="search-btn">
<a class="nav-link" target="_self" href="javascript:;" data-toggle="modal" data-target="#modalSearch" aria-label="Search">
<i class="iconfont icon-search"></i>
</a>
</li>
<li class="nav-item" id="color-toggle-btn">
<a class="nav-link" target="_self" href="javascript:;" aria-label="Color Toggle">
<i class="iconfont icon-dark" id="color-toggle-icon"></i>
</a>
</li>
</ul>
</div>
</div>
</nav>
<div id="banner" class="banner" parallax="true" style="background: url('/images/se.webp') no-repeat center center; background-size: cover;">
<div class="full-bg-img">
<div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
<div class="banner-text text-center fade-in-up">
<div class="h2">
<span id="subtitle" data-typed-text="软件工程复习笔记"></span>
</div>
<div class="mt-3">
<span class="post-meta">
<i class="iconfont icon-date-fill" aria-hidden="true"></i>
<time datetime="2026-01-10 13:42" pubdate>
January 10, 2026 pm
</time>
</span>
</div>
<div class="mt-1">
<span class="post-meta mr-2">
<i class="iconfont icon-chart"></i>
5.1k words
</span>
<span class="post-meta mr-2">
<i class="iconfont icon-clock-fill"></i>
43 mins
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</header>
<main>
<div class="container-fluid nopadding-x">
<div class="row nomargin-x">
<div class="side-col d-none d-lg-block col-lg-2">
<aside class="sidebar d-none d-xl-block" style="margin-right:-1rem;z-index:-1"><ins class="adsbygoogle" style="display:flex;justify-content:center;min-width:160px;max-width:300px;width:100%;height:600px;position:sticky;top:2rem" data-ad-client="ca-pub-3240358922862141" data-ad-slot="6522434837"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script></aside>
</div>
<div class="col-lg-8 nopadding-x-md">
<div class="container nopadding-x-md" id="board-ctn">
<div id="board">
<article class="post-content mx-auto">
<h1 id="seo-header">软件工程复习笔记</h1>
<div class="markdown-body">
<h1 id="软件工程复习笔记"><a href="#软件工程复习笔记" class="headerlink" title="软件工程复习笔记"></a>软件工程复习笔记</h1><h2 id="简答题测验"><a href="#简答题测验" class="headerlink" title="简答题测验"></a>简答题测验</h2><p><em>说明:请根据所学知识,用2-3句话简要回答以下问题。</em></p>
<ol>
<li>什么是耦合性与内聚性?它们如何影响模块的功能独立性?</li>
<li>UML中的类图和对象图的主要用途是什么?它们之间有何关键区别?</li>
<li>简述增量过程模型的核心特点及其主要优点之一。</li>
<li>根据质量功能部署(QFD)理论,需求可以分为哪三个类别?</li>
<li>在面向对象建模中,聚合(Aggregation)与组合(Composition)关系有何区别?</li>
<li>软件工程过程包含哪五个基本框架活动?</li>
<li>什么是CMMI?它定义了哪五个能力成熟度级别?</li>
<li>请解释黑盒测试与白盒测试之间的主要区别。</li>
<li>将类图中的泛化(继承)关系映射到关系数据库时,可以采用哪一种策略?</li>
<li>软件设计中的信息隐藏原则是什么?它能带来哪些好处?</li>
</ol>
<hr>
<h2 id="简答题答案"><a href="#简答题答案" class="headerlink" title="简答题答案"></a>简答题答案</h2><ol>
<li><strong>什么是耦合性与内聚性?它们如何影响模块的功能独立性?</strong> 耦合性是衡量软件结构中各个模块之间相互关联程度的度量,而内聚性则是衡量一个模块内部各成分彼此结合紧密程度的度量。为了实现功能独立性,软件设计应追求尽可能松散的耦合和尽可能高的内聚。</li>
<li><strong>UML中的类图和对象图的主要用途是什么?它们之间有何关键区别?</strong> 类图用于描述系统的静态结构,展示了系统的类、属性、操作以及类之间的关系。对象图则展示了系统在特定时刻的一个快照,描述了类的实例(对象)及其当前的属性值。关键区别在于,类图是对类型的建模,而对象图是对实例的建模。</li>
<li><strong>简述增量过程模型的核心特点及其主要优点之一。</strong> 增量模型的核心特点是将软件产品作为一系列增量构件来设计、实现、集成和测试,每个增量都会发布一部分功能。其主要优点之一是能在较短时间内向用户提交有用的工作产品,使用户能尽早使用系统并提供反馈。</li>
<li><strong>根据质量功能部署(QFD)理论,需求可以分为哪三个类别?</strong> 质量功能部署(QFD)将需求分为三类:正常需求,即客户明确提出的需求;期望需求,即客户认为理所当然、隐含在产品中的需求;以及令人兴奋的需求,即超出客户期望、能带来极大满意度的需求。</li>
<li><strong>在面向对象建模中,聚合(Aggregation)与组合(Composition)关系有何区别?</strong> 聚合与组合都是表示“整体-部分”关系的特殊关联。主要区别在于,聚合关系中,一个部分可以属于多个整体;而组合关系(强聚合)中,部分对象的生命周期取决于整体,部分唯一属于一个整体,会随着整体的创建和销毁而被创建和销毁。</li>
<li><strong>软件工程过程包含哪五个基本框架活动?</strong> 软件工程过程的五个基本框架活动是:沟通(Communication),包括需求获取;策划(Planning),包括项目估算和进度计划;建模(Modeling),包括分析和设计;构建(Construction),包括编码和测试;以及部署(Deployment),包括交付、支持和反馈。</li>
<li><strong>什么是CMMI?它定义了哪五个能力成熟度级别?</strong> CMMI(能力成熟度模型集成)是由卡耐基梅隆大学软件工程研究院制定的软件过程改良与评估模型,是目前世界公认的软件产品进入国际市场的通行证。它定义了五个能力成熟度级别:已执行级(Level 1)、已管理级(Level 2)、已定义级(Level 3)、已定量管理级(Level 4)和已优化级(Level 5)。(注:还有一个级别为不完全级 Level 0)。</li>
<li><strong>请解释黑盒测试与白盒测试之间的主要区别。</strong> 主要区别在于测试的视角和依据。黑盒测试是一种确认技术,它从产品功能角度出发,不关心内部实现逻辑,回答“我们在构造一个正确的系统吗?”。白盒测试是一种验证技术,它基于代码的内部逻辑结构进行测试,回答“我们在正确地构造一个系统吗?”。</li>
<li><strong>将类图中的泛化(继承)关系映射到关系数据库时,可以采用哪一种策略?</strong> 可以采用“一类一表”的策略,即分别为父类和每个子类建立数据表。子类表中包含其特有属性,并通过一个外键与父类表的主键关联,访问完整对象时需要进行表连接。另外两种策略是将子类属性上拉到父类表,或将父类属性下推到各子类表。</li>
<li><strong>软件设计中的信息隐藏原则是什么?它能带来哪些好处?</strong> 信息隐藏原则是指模块的设计应使其所包含的信息(过程和数据)对于不需要这些信息的其他模块来说是不可访问的。这样做的好处包括降低“副作用”的可能性、减少局部设计决策对全局的影响、促进封装以及形成更高质量的软件。</li>
</ol>
<hr>
<h2 id="论述题"><a href="#论述题" class="headerlink" title="论述题"></a>论述题</h2><p><em>说明:请根据相关材料,对以下问题进行深入分析和阐述。无需提供答案。</em></p>
<ol>
<li>结合外卖平台数据库性能瓶颈的案例,论述良好软件设计的重要性。详细解释技术团队采用的“混合持久化(Polyglot Persistence)”策略是如何通过读写分离、专用搜索引擎和内存加速等技术解决不同类型数据的处理需求的。</li>
<li>“秋千”漫画和“Phil与Maria”的对话揭示了需求获取过程中的哪些典型挑战?请阐述需求工程中的起始、导出、精化、协商和确认等活动是如何系统性地应对这些挑战,以确保最终交付的软件能满足用户的真实需求。</li>
<li>对比分析瀑布模型与敏捷开发模型(如Scrum)在过程流程、需求处理和客户交互方面的核心差异。结合“图像浏览软件”开发场景,讨论在需求初期不明确且可能频繁变更的情况下,哪种过程模型更为适用,并说明理由。</li>
<li>解释里氏替换原则(LSP)和开闭原则(OCP)的核心思想。以“鸟”与“企鹅”的例子或“矩形”与“正方形”的例子说明违反这些原则可能导致的问题,并探讨如何重新设计以更好地遵循这些原则,从而提高软件的可扩展性和可维护性。</li>
<li>从提供的“教室管理系统”、“房屋发布系统”或“兼职招聘系统”的需求描述中任选其一,识别出其核心实体类、边界类和控制类。绘制一个简要的类图,标明主要类的属性以及类之间的关联关系(包括名称、角色和多重性),并解释你的建模决策。</li>
</ol>
<hr>
<h2 id="核心术语词汇表"><a href="#核心术语词汇表" class="headerlink" title="核心术语词汇表"></a>核心术语词汇表</h2><table>
<thead>
<tr>
<th>术语 (Term)</th>
<th>定义 (Definition)</th>
</tr>
</thead>
<tbody><tr>
<td><strong>软件工程 (Software Engineering)</strong></td>
<td>涵盖了方法、工具和过程三个要素,旨在系统化、规范化地开发和维护软件。</td>
</tr>
<tr>
<td><strong>软件过程模型 (Software Process Model)</strong></td>
<td>软件过程的一种抽象表示,通常是对软件过程某一特定方面的抽象描述。</td>
</tr>
<tr>
<td><strong>瀑布模型 (Waterfall Model)</strong></td>
<td>一种线性的、顺序的软件开发模型,开发过程像瀑布一样自上而下地流动。</td>
</tr>
<tr>
<td><strong>增量模型 (Incremental Model)</strong></td>
<td>将软件作为一系列增量构件来设计、实现和测试的过程模型,每个增量都为用户提供部分功能。</td>
</tr>
<tr>
<td><strong>螺旋模型 (Spiral Model)</strong></td>
<td>一种演化过程模型,它将原型开发的迭代性质与瀑布模型的系统性和可控性结合起来,并增加了风险分析。</td>
</tr>
<tr>
<td><strong>敏捷开发 (Agile Development)</strong></td>
<td>一种以人为核心、迭代、循序渐进的开发方法,强调快速响应变化,其代表有极限编程(XP)和Scrum。</td>
</tr>
<tr>
<td><strong>需求工程 (Requirement Engineering)</strong></td>
<td>通过执行起始、导出、精化、协商、规格说明、确认和管理七个活动来帮助软件工程师理解待解决问题的过程。</td>
</tr>
<tr>
<td><strong>功能需求 (Functional Requirement)</strong></td>
<td>描述系统应该提供的服务,即用户希望软件做什么事情,完成什么功能。</td>
</tr>
<tr>
<td><strong>非功能需求 (Non-functional Requirement)</strong></td>
<td>对系统提供服务或功能时受到的约束进行描述,如性能、安全性、可靠性等。</td>
</tr>
<tr>
<td><strong>领域需求 (Domain Requirement)</strong></td>
<td>来自于系统应用领域并反映该领域特征的需求。</td>
</tr>
<tr>
<td><strong>UML (Unified Modeling Language)</strong></td>
<td>面向对象技术领域的标准建模语言,它独立于软件过程,可用于可视化、说明、构造和文档化软件。</td>
</tr>
<tr>
<td><strong>类图 (Class Diagram)</strong></td>
<td>一种结构图,用于描述系统的静态结构,包括系统的类、属性、操作以及它们之间的关系。</td>
</tr>
<tr>
<td><strong>对象图 (Object Diagram)</strong></td>
<td>描述系统在某个特定时刻的静态结构,是类图的一个实例,显示了对象及其属性的当前值。</td>
</tr>
<tr>
<td><strong>关联 (Association)</strong></td>
<td>描述类与类之间的一种结构关系。一个完整的关联关系可包含名称、角色和多重性。</td>
</tr>
<tr>
<td><strong>多重性 (Multiplicity)</strong></td>
<td>指明有多少个关联端点的对象可以与另一个端点的一个对象相关联,格式通常为“minimum..maximum”。</td>
</tr>
<tr>
<td><strong>聚合 (Aggregation)</strong></td>
<td>关联的一种特殊形式,表示“整体-部分”关系,一个部分可以属于多个整体。</td>
</tr>
<tr>
<td><strong>组合 (Composition)</strong></td>
<td>聚合的更强形式,部分的生命周期取决于整体,部分唯一属于一个整体。</td>
</tr>
<tr>
<td><strong>软件设计 (Software Design)</strong></td>
<td>一个将需求变换为用于构建软件的“蓝图”的迭代过程,是更高层次的抽象表达。</td>
</tr>
<tr>
<td><strong>耦合性 (Coupling)</strong></td>
<td>对软件程序结构中各个模块之间相互关联程度的一种度量。设计目标是低耦合。</td>
</tr>
<tr>
<td><strong>内聚性 (Cohesion)</strong></td>
<td>标志一个模块内部各成分彼此结合的紧密程度。设计目标是高内聚。</td>
</tr>
<tr>
<td><strong>信息隐藏 (Information Hiding)</strong></td>
<td>一项设计原则,要求模块应设计得使其所含信息(过程和数据)对不需要这些信息的模块不可访问。</td>
</tr>
<tr>
<td><strong>重构 (Refactoring)</strong></td>
<td>在不改变代码外部行为的前提下,改进其内部结构的过程。</td>
</tr>
<tr>
<td><strong>里氏替换原则 (LSP)</strong></td>
<td>如果一个子类可以替换其基类,那么使用基类的模块在无需修改的情况下就可以扩展。</td>
</tr>
<tr>
<td><strong>开闭原则 (OCP)</strong></td>
<td>软件实体(类、模块等)应该对扩展开放,对修改关闭。</td>
</tr>
<tr>
<td><strong>CMMI (能力成熟度模型集成)</strong></td>
<td>由美国国防部委托卡耐基梅隆大学软件工程研究院制定的软件过程改良、评估模型,用于评估企业的过程能力成熟度。</td>
</tr>
<tr>
<td><strong>黑盒测试 (Black-box Testing)</strong></td>
<td>一种确认技术,从产品功能角度测试,不关心内部实现,验证系统是否正确。</td>
</tr>
<tr>
<td><strong>白盒测试 (White-box Testing)</strong></td>
<td>一种验证技术,测试程序的内部结构或工作原理,验证系统构造是否正确。</td>
</tr>
<tr>
<td><strong>边界值分析 (Boundary Value Analysis)</strong></td>
<td>一种测试方法,指找到等价类中稍高于其边界值及稍低于其边界值的一些特定情况进行测试。</td>
</tr>
<tr>
<td><strong>Redis</strong></td>
<td>一个开源的、跨平台的非关系型键值(key-value)存储系统,常被描述为“数据结构服务器”,因其高性能常被用于缓存、消息队列等场景。</td>
</tr>
</tbody></table>
<h2 id="速记表格"><a href="#速记表格" class="headerlink" title="速记表格"></a>速记表格</h2><table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>概念/原则名称</td>
<td>核心定义</td>
<td>主要特征/属性</td>
<td>设计目标/作用</td>
<td>度量或启发式规则</td>
</tr>
<tr>
<td>模块化</td>
<td>将软件划分为可独立命名和编址的构件(模块),每个模块完成一个子功能。</td>
<td>表现为数据和功能的分割,是关注点分离(SoC)的常见表现。</td>
<td>使软件更容易构造、应对变更和维护;实现分而治之,降低系统复杂性。</td>
<td>规模适中:模块长度建议控制在 30-50 条语句左右;扇出(Fan-out)以 3 到 9 为宜;扇入(Fan-in)越大说明共享程度越高。</td>
</tr>
<tr>
<td>功能独立性</td>
<td>一个模块在不需要另一个模块的情况下,能够完整地执行其特定子功能。</td>
<td>由抽象、模块化和信息隐藏概念直接产出;通过评价指标“内聚”与“耦合”来衡量。</td>
<td>提升系统的可理解性、可测试性、可靠性和可维护性。</td>
<td>评估准则:增加内聚,减少耦合。目标是实现高内聚、低耦合。</td>
</tr>
<tr>
<td>内聚性</td>
<td>标志一个模块内部各成分彼此结合的紧密程度,是信息隐藏和局部化概念的自然扩展。</td>
<td>体现了模块内部功能的单一性和纯粹性。</td>
<td>度量模块功能相对强度的定性准则;高内聚有助于提高模块独立性。</td>
<td>尽量做到“一个模块一个功能”,内聚程度越高越好。</td>
</tr>
<tr>
<td>耦合性</td>
<td>对软件程序结构中各个模块之间相互关联程度的一种度量。</td>
<td>取决于模块间接口的复杂性、进入模块的方式以及通过接口的数据量。</td>
<td>追求尽可能松散耦合的系统,以降低修改带来的副作用及错误传播可能性。</td>
<td>避免“病态连接”;减少控制耦合和公共耦合;将特征耦合转化为数据耦合。</td>
</tr>
<tr>
<td>软件设计的启发式规则</td>
<td>基于工程经验总结出的用于改进设计质量和优化软件结构的规律。</td>
<td>涵盖模块独立性、规模、深度、宽度、扇入、扇出、作用域与控制域等维度。</td>
<td>作为优化软件内部结构的指导,提升软件的可读性、可靠性和可维护性。</td>
<td>模块作用域应在控制域之内;遵循“模块化”及“体系结构设计”中的经验数值(如扇出 3-9)。</td>
</tr>
<tr>
<td>体系结构设计</td>
<td>定义了软件的主要结构元素之间的联系,包括体系结构风格和设计模式。</td>
<td>体现为模块(构件)的层次结构。</td>
<td>提供软件的全貌,从实现角度说明数据域、功能域和行为域的设计。</td>
<td>度量指标包括深度(控制层数)和宽度(同一层模块总数)。</td>
</tr>
<tr>
<td>抽象</td>
<td>抽出事物的本质特性而暂时不考虑其细节,概括事物间的相似方面。</td>
<td>包括数据抽象、过程抽象和控制抽象。</td>
<td>作为认识复杂现象的思维工具,通过不同层次的抽象解构复杂系统。</td>
<td>每一层抽象是对高一级抽象的较具体化描述(精化)。</td>
</tr>
<tr>
<td>信息隐藏</td>
<td>模块的设计应使其所含信息(算法、数据结构等)对于不需要这些信息的模块不可访问。</td>
<td>通过定义明确的接口实现对内部“秘密”的封装。</td>
<td>降低副作用;减少局部设计决定对全局的影响;阻止非法或不必要的全局数据使用。</td>
<td>促进封装,作为形成高质量功能独立性的重要手段。</td>
</tr>
</tbody></table>
</div>
<hr>
<div>
<div class="post-metas my-3">
<div class="post-meta mr-3 d-flex align-items-center">
<i class="iconfont icon-category"></i>
<span class="category-chains">
<span class="category-chain">
<a href="/categories/software-engineering/" class="category-chain-item">software-engineering</a>
</span>
</span>
</div>
<div class="post-meta">
<i class="iconfont icon-tags"></i>
<a href="/tags/software-engineering/" class="print-no-link">#software-engineering</a>
<a href="/tags/uml/" class="print-no-link">#uml</a>
<a href="/tags/testing/" class="print-no-link">#testing</a>
<a href="/tags/cmmi/" class="print-no-link">#cmmi</a>
</div>
</div>
<div class="license-box my-3">
<div class="license-title">
<div>软件工程复习笔记</div>
<div>http://arkpln.github.io/2544566248.html</div>
</div>
<div class="license-meta">
<div class="license-meta-item">
<div>Author</div>
<div>FangZhou</div>
</div>
<div class="license-meta-item license-meta-date">
<div>Posted on</div>
<div>January 10, 2026</div>
</div>
<div class="license-meta-item">
<div>Licensed under</div>
<div>
<a class="print-no-link" target="_blank" href="https://creativecommons.org/licenses/by/4.0/" rel="external nofollow noopener noreferrer">
<span class="hint--top hint--rounded" aria-label="BY - Attribution">
<i class="iconfont icon-cc-by"></i>
</span>
</a>
</div>
</div>
</div>
<div class="license-icon iconfont"></div>
</div>
<div style="width:100%;display:flex;justify-content:center;margin-bottom:1.5rem"><ins class="adsbygoogle" style="display:flex;justify-content:center;max-width:845px;width:100%;height:90px" data-ad-client="ca-pub-3240358922862141" data-ad-slot="6522434837"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script></div>
<div class="post-prevnext my-3">
<article class="post-prev col-6">
<a href="/3712793328.html" title="计算机网络沉淀心得">
<i class="iconfont icon-arrowleft"></i>
<span class="hidden-mobile">计算机网络沉淀心得</span>
<span class="visible-mobile">Previous</span>
</a>
</article>
<article class="post-next col-6">
<a href="/1319920940.html" title="迈向2026:大学生的年终总结">
<span class="hidden-mobile">迈向2026:大学生的年终总结</span>
<span class="visible-mobile">Next</span>
<i class="iconfont icon-arrowright"></i>
</a>
</article>
</div>
</div>
<article id="comments" lazyload>
<div id="valine"></div>
<script type="text/javascript">
Fluid.utils.loadComments('#valine', function() {
Fluid.utils.createScript('https://lib.baomitu.com/valine/1.5.1/Valine.min.js', function() {
var options = Object.assign(
{"appId":"mEwkD7geCX7RWNO8srhDE2oP-gzGzoHsz","appKey":"4EF76hyiVA1QILHZThVbfoat","path":"window.location.pathname","placeholder":null,"avatar":"retro","meta":["nick","mail","link"],"requiredFields":[],"pageSize":10,"lang":"zh-CN","highlight":false,"recordIP":false,"serverURLs":"","emojiCDN":null,"emojiMaps":null,"enableQQ":false,"el":"#vcomments"},
{
el: "#valine",
path: window.location.pathname
}
)
new Valine(options);
Fluid.utils.waitElementVisible('#valine .vcontent', () => {
var imgSelector = '#valine .vcontent img:not(.vemoji)';
Fluid.plugins.imageCaption(imgSelector);
Fluid.plugins.fancyBox(imgSelector);
})
});
});
</script>
<noscript>Please enable JavaScript to view the comments</noscript>
</article>
</article>
</div>
</div>
</div>
<div class="side-col d-none d-lg-block col-lg-2">
<aside class="sidebar" style="margin-left: -1rem">
<div id="toc">
<p class="toc-header">
<i class="iconfont icon-list"></i>
<span>Table of Contents</span>
</p>
<div class="toc-body" id="toc-body"></div>
</div>
</aside>
</div>
</div>
</div>
<a id="scroll-top-button" aria-label="TOP" href="#" role="button">
<i class="iconfont icon-arrowup" aria-hidden="true"></i>
</a>
<div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
<div class="modal-content">
<div class="modal-header text-center">
<h4 class="modal-title w-100 font-weight-bold">Search</h4>
<button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body mx-3">
<div class="md-form mb-5">
<input type="text" id="local-search-input" class="form-control validate">
<label data-error="x" data-success="v" for="local-search-input">Keyword</label>
</div>
<div class="list-group" id="local-search-result"></div>
</div>
</div>
</div>
</div>
</main>
<footer>
<div class="footer-inner">
<div class="footer-content">
<a href="https://hexo.io" target="_blank" rel="external nofollow noopener noreferrer"><span>Hexo</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="external nofollow noopener noreferrer"><span>Fluid</span></a>
</div>
<div class="statistics">
<span id="leancloud-site-pv-container" style="display: none">
总访问量
<span id="leancloud-site-pv"></span>
次
</span>
<span id="leancloud-site-uv-container" style="display: none">
总访客数
<span id="leancloud-site-uv"></span>
人
</span>
</div>
</div>
</footer>
<!-- Scripts -->
<script src="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.js"></script>
<link rel="stylesheet" href="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.css">
<script>
NProgress.configure({"showSpinner":false,"trickleSpeed":100})
NProgress.start()
window.addEventListener('load', function() {
NProgress.done();
})
</script>
<script src="https://lib.baomitu.com/jquery/3.6.4/jquery.min.js"></script>
<script src="https://lib.baomitu.com/twitter-bootstrap/4.6.1/js/bootstrap.min.js"></script>
<script src="/js/events.js"></script>
<script src="/js/plugins.js"></script>
<script src="https://lib.baomitu.com/typed.js/2.0.12/typed.min.js"></script>
<script>
(function (window, document) {
var typing = Fluid.plugins.typing;
var subtitle = document.getElementById('subtitle');
if (!subtitle || !typing) {
return;
}
var text = subtitle.getAttribute('data-typed-text');
typing(text);
})(window, document);
</script>
<script src="/js/img-lazyload.js"></script>
<script>
Fluid.utils.createScript('https://lib.baomitu.com/tocbot/4.20.1/tocbot.min.js', function() {
var toc = jQuery('#toc');
if (toc.length === 0 || !window.tocbot) { return; }
var boardCtn = jQuery('#board-ctn');
var boardTop = boardCtn.offset().top;
window.tocbot.init(Object.assign({
tocSelector : '#toc-body',
contentSelector : '.markdown-body',
linkClass : 'tocbot-link',
activeLinkClass : 'tocbot-active-link',
listClass : 'tocbot-list',
isCollapsedClass: 'tocbot-is-collapsed',
collapsibleClass: 'tocbot-is-collapsible',
scrollSmooth : true,
includeTitleTags: true,
headingsOffset : -boardTop,
}, CONFIG.toc));
if (toc.find('.toc-list-item').length > 0) {
toc.css('visibility', 'visible');
}
Fluid.events.registerRefreshCallback(function() {
if ('tocbot' in window) {
tocbot.refresh();
var toc = jQuery('#toc');
if (toc.length === 0 || !tocbot) {
return;
}
if (toc.find('.toc-list-item').length > 0) {
toc.css('visibility', 'visible');
}
}
});
});
</script>
<script src="https://lib.baomitu.com/clipboard.js/2.0.11/clipboard.min.js"></script>
<script>Fluid.plugins.codeWidget();</script>
<script>
Fluid.utils.createScript('https://lib.baomitu.com/anchor-js/5.0.0/anchor.min.js', function() {
window.anchors.options = {
placement: CONFIG.anchorjs.placement,
visible : CONFIG.anchorjs.visible
};
if (CONFIG.anchorjs.icon) {
window.anchors.options.icon = CONFIG.anchorjs.icon;
}
var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
var res = [];
for (var item of el) {
res.push('.markdown-body > ' + item.trim());
}
if (CONFIG.anchorjs.placement === 'left') {
window.anchors.options.class = 'anchorjs-link-left';
}
window.anchors.add(res.join(', '));
Fluid.events.registerRefreshCallback(function() {
if ('anchors' in window) {
anchors.removeAll();
var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
var res = [];
for (var item of el) {
res.push('.markdown-body > ' + item.trim());
}
if (CONFIG.anchorjs.placement === 'left') {
anchors.options.class = 'anchorjs-link-left';
}
anchors.add(res.join(', '));
}
});
});
</script>
<script>
Fluid.utils.createScript('https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.js', function() {
Fluid.plugins.fancyBox();
});
</script>
<script>Fluid.plugins.imageCaption();</script>
<script defer src="/js/leancloud.js"></script>
<script src="/js/local-search.js"></script>
<!-- 主题的启动项,将它保持在最底部 -->
<!-- the boot of the theme, keep it at the bottom -->
<script src="/js/boot.js"></script>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3240358922862141" crossorigin="anonymous"></script>
<noscript>
<div class="noscript-warning">Blog works best with JavaScript enabled</div>
</noscript>
</body>
</html>