Revision Chapter1

本文总结了软件构造的三维视图概念,包括构造和运行阶段的代码与组件视角,以及软件质量的内外部参数,如正确性、鲁棒性和可扩展性等关键指标。
快要期末了,顺带总结一下各章的重要内容。

1 软件构造的三维视图

这是贯穿整个课程的内容,也是重点中的重点。把握这个三维视图对于宏观把握软件构造很有必要。 

我们分成这样的三个维度:
Moment(时刻)——Period(阶段)
Code(代码)——Component(模块)
Build-time(构造)——Run-time(运行)

1.1 三维视图表格

在这里插入图片描述
我们需要知道哪些内容对应的是哪一个维度。

1.2 Build-time 构造阶段

1.2.1 Code

包含了
代码(code)->方法(method)->类(class)

1.2.1.1 Moment
  • source code :源代码
  • AST:软件执行的流程树(语法结构树)
    ->语法结构
  • Class-dia:有哪些类,以及类与类之间的关系
    ->语义结构
    UML语言就是一个例子
1.2.1.2 Period
  • code churn:代码变化,版本控制工具

1.2.2 Component

包含了
package、file、lib、test case

1.2.2.1 Moment

反映代码的组织情况:这些类和文件是如何组织起来的?

  • Library 库:编写、构造、测试阶段都会用到
    1. 找lib:javac -classpath ./lib/*.jar
    2. 将lib链接到程序中:
      static linking 静态链接:将lib拷贝到代码中(执行时就不用提供了)
  • Component dia:多个类如何组成package
1.2.2.2 Period

Component层面的东西是如何变化的

  • SCI
  • 针对Component层面的版本控制工具

1.3 Run-time运行阶段

1.3.1 Code

1.3.1.1 Moment

在某个时刻有什么对象?值是什么?

  • snapshot diagram※ 描述上述的问题
  • memory dump:内存信息转储——看当前内存的使用情况
1.3.1.2 Period
  • Sequence dia 时序图:类和方法的调用顺序与规划
  • .exe tracing 执行跟踪:在某个时间点执行的是哪个类哪个方法
1.3.2 Component
1.3.2.1 Moment
  • deployment dia:在不同的运行位置的配置情况
1.3.2.2 Period
  • event log:事件日志

2 软件构造的质量标准

2.1 主要目标:

  • 易于理解
  • 易适应变化
  • 开发成本低:考虑代码的复用
  • 健壮性:非法输入软件不至于崩溃
  • 运行效率:特别是对于有大量数据需要处理时

2.2 外部质量参数

这部分参数影响用户的使用

2.2.1 ※正确性

首要因素!!!!

  • 正确形式有条件的:即符合软件规格说明书。
    对于分层的软件系统来说,应当保证本层及以下都是正确的。
  • 保证手段:测试

2.2.2 鲁棒性

即健壮性,针对的是规格说明书之外的情况。
也就是说软件应当有一定的面对异常时做出适当反应的能力。

2.2.3 易扩展性

易于调整和适应变化

  • 软件规模紧密相关,理论上规模越大越难以扩展

  • 两个原则

    • 体系结构尽量简单
    • 体系模块尽量自治(即对其他模块的影响和牵连尽量小)

2.2.4 复用性

2.2.5 兼容性

某个软件在A环境下可用,在B环境下依旧可用的能力。
这个性质主要在于设计的“一致”和“标准化”,要首先明确一个可以适应于很多情况的标准

2.2.6 效率

对于硬件资源尽可能少的需求

2.2.7 可移植性

将软件移到各种硬件和软件环境,比如从Mac OS到Win,从iOS到Android等。

2.2.8 易用性

  • 便于用户使用,使用户有良好的使用感。
  • 以“容易掌握”作为评价标准。
    这就要求要做到结构简洁,并站在用户的角度去设计软件。

2.2.9 功能性

  • 质量优先!尤其是要保证主要功能的质量,再去考虑其他功能的附加。
  • 功能不是越多越好,过于复杂的功能也会导致软件使用起来比较复杂。

2.2.10 时效性

即在ddl之前完成软件开发

2.2.11 其他

此外软件还应做到:
易于验证、未经授权保证完整的能力、可修复、在预算内完成等等

2.3 内部质量参数

内部质量参数影响软件本身和开发人员。
!内部质量参数影响和控制外部质量参数!

2.3.1 LOC

代码行数和复杂性

2.3.2 耦合度

2.3.3 内聚度

我们应当尽量做到高内聚,低耦合

2.3.4 可读性

2.3.5 复杂度

2.3.6 大小

2.4 面对质量因素应当做的

  • 质量因素之间可能存在矛盾的情况,面对这样的情况,我们应当在质量因素之间权衡、折中、妥协。

    • 给出标准,并根据标准和实际情况做出选择。
    • 正确性永远是首要的!!!
  • 强调模块化编程。

<think>我们正在解决一个LaTeX排版问题:使用fancyhdr设置页眉时,`\section*{Revision}`这样的无编号节标题不会出现在页眉中。这是因为`\section*`命令不会设置用于页眉的标记(mark),而fancyhdr通常依赖于这些标记来显示节标题。 解决方案的核心是手动设置页眉标记。我们可以使用`\markboth`或`\markright`命令来为无编号的节设置标记。这样,fancyhdr就可以获取到这些标记并显示在页眉中。 具体步骤: 1. 在`\section*{Revision}`之后,立即使用`\markboth{Revision}{}`(如果该节是左页眉或右页眉的内容)或`\markright{Revision}`(如果该节出现在右页)。通常,对于article类,我们使用`\markboth`,其中第一个参数是左页眉,第二个参数是右页眉。但具体取决于我们定义的页眉样式。 2. 如果我们希望这个无编号的节标题出现在所有页的页眉中(直到下一个节标题改变页眉),那么我们可以这样设置。 3. 另外,我们也可以重新定义`\section*`命令,使其自动设置标记,但这样可能会影响其他无编号节。因此,我们选择在需要的地方手动设置。 示例代码: 假设我们使用`fancyhdr`包,并设置了页眉显示当前节标题(在右页眉显示节标题,左页眉显示章标题)。对于无编号节,我们可以在节命令后添加标记设置: ```latex \section*{Revision} \markboth{Revision}{} % 设置左页眉为Revision,右页眉为空(或者根据实际需求调整) % 或者如果我们的页眉设置是右页眉显示当前节,那么我们可以用: % \markright{Revision} ``` 但是,请注意,`\markboth`和`\markright`的具体使用取决于文档类和页眉设置。在book类中,通常左页眉(偶数页)显示章标题,右页眉(奇数页)显示节标题。而在article类中,可能只设置一个页眉。 因此,我们需要根据实际页眉设置来调整。如果我们使用`fancyhdr`的`\fancyhead`设置,例如: ```latex \fancyhead[L]{\leftmark} % 左页眉显示章标记 \fancyhead[R]{\rightmark} % 右页眉显示节标记 ``` 那么,`\leftmark`对应`\markboth`的第一个参数,`\rightmark`对应第二个参数。但通常,`\section`命令会设置`\rightmark`为当前节,而`\chapter`设置`\leftmark`为当前章。 对于无编号节,我们可以这样设置: ```latex \section*{Revision} \markright{Revision} % 如果我们只希望设置右页眉(即节标题所在位置) % 或者,如果我们同时需要设置左页眉(例如,我们希望在左页眉也显示这个无编号节),那么: % \markboth{Revision}{Revision} ``` 但是,请注意,`\markboth`会同时设置左右标记,而`\markright`只设置右标记(并且会清除左标记?实际上,`\markboth`用于设置两个标记,而`\markright`只设置右标记,同时保持左标记不变?)实际上,LaTeX的标记机制是: - `\markboth{left}{right}` 设置左标记和右标记。 - `\markright{right}` 设置右标记,左标记保持不变。 然而,在标准文档类中,`\section`命令通常使用`\markright`来设置右标记。因此,对于无编号节,我们模仿这一行为: ```latex \section*{Revision} \markright{Revision} ``` 这样,在右页眉就会显示“Revision”。 但是,如果我们的文档是双面(twoside)的,那么页眉设置可能更复杂。通常,在双面文档中,左页(偶数页)和右页(奇数页)的页眉内容不同。例如: ```latex \fancyhead[LE,RO]{\thepage} % 偶数页左,奇数页右显示页码 \fancyhead[RE]{\leftmark} % 偶数页右显示章 \fancyhead[LO]{\rightmark} % 奇数页左显示节 ``` 在这种情况下,无编号节应该设置`\rightmark`,因为它在奇数页左显示。我们可以使用: ```latex \section*{Revision} \markright{Revision} % 这样会设置\rightmark为Revision ``` 但是,注意`\markright`实际上会设置`\rightmark`,并且同时将`\leftmark`设置为空?不,`\markright`不会改变`\leftmark`。在标准文档类中,`\chapter`命令使用`\markboth{章标题}{}`,而`\section`使用`\markright{节标题}`。因此,`\leftmark`还是上一次由`\chapter`设置的章标题,而`\rightmark`被设置为当前节标题。 所以,在双面文档中,我们只需要设置`\markright`即可。 总结:在无编号节(`\section*`)后,使用`\markright{...}`来设置节标题,这样页眉就会显示。 另外,我们也可以自定义一个命令来简化操作: ```latex \newcommand{\mysection}[1]{ \section*{#1} \markright{#1} } ``` 然后使用`\mysection{Revision}`来代替`\section*{Revision}`。 但是,请注意,如果文档中还有其他的节(有编号的节),它们会自动设置标记,所以不需要这样做。只有无编号节需要。 如果问题仍然存在,请检查页眉设置是否使用了`\rightmark`。另外,注意`\section*`不会出现在目录中,也不会影响页眉,所以手动设置标记是必要的。 最后,我们还需要考虑在文档中可能存在的其他标记设置(比如下一个节会覆盖标记),所以这个手动设置只对当前节有效。 因此,解决方案是:在`\section*{Revision}`命令后立即添加`\markright{Revision}`(或根据页眉设置选择`\markboth`)命令。 注意:如果页眉设置使用的是`\leftmark`(比如在article类中,我们可能将节标题放在`\leftmark`),那么我们就需要设置`\leftmark`。但是,在article类中,`\section`命令通常设置`\markboth{\sectionname\ \thesection\ -- \sectiontitle}{}`,其中`\sectiontitle`就是节的标题。对于无编号节,我们可以设置`\markboth{Revision}{}`。 所以,具体使用哪个标记命令,取决于我们的页眉设置和文档类。一般来说,我们可以先尝试`\markright`,如果不行再尝试`\markboth`。 下面是一个完整的示例(假设使用article类,双面页眉设置): ```latex \documentclass{article} \usepackage{fancyhdr} \pagestyle{fancy} \fancyhead{} % 清除所有页眉设置 \fancyhead[L]{\leftmark} % 左页眉显示\leftmark \fancyhead[R]{\rightmark} % 右页眉显示\rightmark \fancyfoot{} % 清除页脚 \fancyfoot[C]{\thepage} \begin{document} \section{Introduction} % 有编号的节,会自动设置标记 一些文本... \section*{Revision} % 无编号节,不会自动设置标记 \markboth{Revision}{Revision} % 这里我们同时设置左右标记,因为article类通常没有双页差异,但我们希望左右都显示Revision?或者根据需求,我们可能只需要设置一个。但注意,如果之前有章节,那么\leftmark可能还是之前的章节标题,所以这里我们同时设置左右,确保左右页眉都变成Revision。 修订内容... \end{document} ``` 在article类中,由于没有chapter,所以通常`\section`设置`\markright`,而`\leftmark`可能为空。因此,如果我们希望左页眉也显示,那么设置`\markboth{Revision}{}`(这样左页眉显示Revision,右页眉为空)或者`\markboth{Revision}{Revision}`(这样右页眉也显示Revision)。但是,根据我们的页眉设置,`\fancyhead[L]{\leftmark}`和`\fancyhead[R]{\rightmark}`,所以我们需要同时设置两个标记。 因此,在article类中,我们可以这样: ```latex \section*{Revision} \markboth{Revision}{Revision} ``` 这样,左右页眉都会显示“Revision”。 综上所述,解决方案的关键在于理解`\markboth`和`\markright`的作用,并根据页眉设置来手动设置标记。 最后,注意:如果文档有多个无编号节,每个都需要这样设置。 如果用户希望一劳永逸,可以重新定义`\section`和`\section*`命令,但这样可能会影响其他部分。这里我们提供一个针对无编号节的重新定义: ```latex \let\oldsection\section \renewcommand{\section}{\@ifstar{\starsection}{\nostarsection}} \newcommand{\starsection}[1]{ \oldsection*{#1} \markboth{#1}{#1} % 或者根据需要选择 \markright } \newcommand{\nostarsection}[1]{ \oldsection{#1} } ``` 但是,这个重新定义可能会干扰文档的其他部分,因此要谨慎使用。 我们建议在需要的地方手动设置标记,除非有很多无编号节。 因此,针对用户的问题,我们给出两种解决方案: 1. 在`\section*{Revision}`后立即添加`\markboth{Revision}{Revision}`(或`\markright{Revision}`)命令。 2. 重新定义`\section*`命令,使其自动设置标记(需要谨慎使用)。 根据用户的具体需求选择。 相关问题: 1. 如何在LaTeX中设置页眉以显示当前章节标题? 2. 在LaTeX中,`\markboth`和`\markright`命令有什么区别? 3. 如何自定义LaTeX中的节命令(包括无编号节)?</think>### LaTeX fancyhdr 设置页眉时 section*{Revision} 不显示的解决方案 当使用 `\section*{Revision}` 时,无编号节标题不会自动出现在页眉中,这是因为 `fancyhdr` 依赖 LaTeX 的标记系统(mark mechanism),而无编号节默认不设置标记。以下是三种解决方案: #### 方法 1:手动设置标记(推荐) 在无编号节后添加 `\markboth{}{}` 或 `\markright{}` 命令: ```latex \section*{Revision} \markboth{Revision}{} % 双页文档 % 或 \markright{Revision} % 单页文档 ``` #### 方法 2:自定义节命令 创建自动设置标记的新命令: ```latex \newcommand{\mysection}[1]{ \section*{#1} \markboth{#1}{} % 双页文档 % \markright{#1} % 单页文档 } ... \mysection{Revision} % 使用自定义命令 ``` #### 方法 3:修改页眉抓取逻辑 在导言区重定义 `\sectionmark` 以处理无编号节: ```latex \usepackage{etoolbox} \makeatletter \patchcmd{\@sect}{\@mkboth{\markboth{#1}}}{\@mkboth{\markboth{#1}{}}}{}{} \makeatother ``` ### 完整示例 ```latex \documentclass{article} \usepackage{fancyhdr} \pagestyle{fancy} \fancyhead[L]{\leftmark} % 左页眉显示章/节标题 \begin{document} \section*{Revision} \markboth{Revision}{} % 手动设置标记 这里是修订内容... \end{document} ``` ### 关键原理 1. **标记机制**:LaTeX 通过 `\markboth{左}{右}` 或 `\markright{右}` 设置页眉内容[^1] 2. **无编号节问题**:`\section*` 不触发 `\@mkboth` 命令 3. **fancyhdr 依赖**:`\leftmark`/`\rightmark` 变量从标记系统获取值 [^1]: LaTeX 内核机制要求显式设置标记才能更新页眉内容
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值