具体描述
软件工程与C++和CASE工具,ISBN:9787506236287,作者:M.J.Pont
作者简介
目录信息
Introduction
1.Beginning at the eod
1.1 What is software engineering?
1.2 Engineering quality software
1.3 But hang on a minute
1.4 A thought experiment
1.5 Quality software in the real world
1.6 An offer you can't refuse
1.7 Why use C++?
1.8 SADIE and quality software
1.9 SADIE and CASE tools
1.10 Beginning at the end
1.11 Conclusions
2.Lelcxster Softwre Engineering
2.1 Introduction
2.2 LSE company structure
2.3 A typical scenario
2.4 A more realistic software devclopmcnt model
2.5 Threc different system types
2.6 LSE and SADIE
2.7 One mcthodology, three different methods
2.8 Conclusions
Excrcises
3.Goodbye, cruel worid!
3.1 Introduction
3.2 TheoriginsofC++
3.3 A first C++ program
3.4 Variable types and declarations
3.5 Manipulating data: some basic operators
3.6 Input and output
3.7 More on the declaration of variables
3.8 Conclusions
Exerciscs
4.Taking control
4.1 Introduction
4.2 Some important operators
4.3 Iteration
4.4 Selection statements
4.5 Advanced operators
4.6 Conclusions
Exercises
1 Process-oriented software deyelopment
5. Case study: Harry Hacker (Programmlng) Ltd
5.1 Introduction
5.2 Thc scenario
5.3 You need to use functions
5.4 Conclusions
6.Writing C++ functions
6.1 Introduction
6.2 Anotherlookatmain
6.3 A first simple function: Sadie
6.4 Declaration vs definition revisited
6.5 Calling a simple function
6.6 Call by value
6.7 Local and global scope
6.8 CaU by reference
6.9 ASIOE: Scope rules and storage ctass
6.10 Detecting and correcting errors
6.11 Using the consc modifier
6.12 Conclusions
Exercises
7.Pointers and arrays
7.1 Introduction
7.2 Memory ofganization
7.3 Assigning values to variables
7.4 Pointers
7.5 Arrays
7.6 Pointers and arrays
7.7 Strings
7.8 More advanced pointer topics
7.9 Conclusions
Exercises
8.closer look at functions
8.1 Introduction
8.2 Call by address
8.3 More on the const modifier
8.4 Arrays as function parameters
8.5 Retuming values from functions
8.6 Example: On strings, constants and functions
8.7 Macros and inline functions
8.8 Recursion
8.9 Flexible functions
8.10 Conclusions
Exercises
9.The standard Hbraries
9.1 Introduction
9.2 Pragmatics
9.3 Character and string handling
9.4 Mathematical functions
9.5 Graphics functions
9.6 Sorting and searching
9.7 Time and date functions
9.8 Abandoning the sinking ship
9.9 Interrupts
9.10 Conclosions
Exercises
10.The physical process model
10.1 Introduction
10.2 Structure charts
10.3 Process specifications
10.4 An altemative structure chart notation
10.5 Conclusions
Exercises
11.Implementation of the physkal process model
11.1 Introduction
11.2 Therecipe
11.3 The starting point
11.4 Building the system code framework
11.5 Creating robust functions
11.6 Fundamentals of testing
11.7 Using driver programs
11.8 Fieldtrials
11.9 Conclusions
Exercises
12.Process-oriented analysis
12.1 Introduction
12.2 Requirements analysis
12.3 The dataflow diagram
12.4 The DfD hierarehy
12.5 The process specification
12.6 The data dictionary
12.7 Balancing the system
12.8 Documentation
12.9 Conclusions
Exercises
13.Case study: Loughborough Bell Foundry
13.1 Introduction
13.2 Scenario
13.3 Overview of the analysis process
13.4 The business case
13.5 The Context diagram
13.6 The User interface
13.7 The process list
13.8 The walkthrough
13.9 The Level 1 dataflow diagram
13.10 The dataflow diagram hierarchy
13.11 The process specifications
13.12 The data dictionary
13.13 The balanced logical model
13.14 Conclusions
14.Process-oriented analysis of interactive systems
14.1 Introduction
14.2 State-transition diagrams
14.3 Control processes
14.4 The impact of the user interface
14.5 Relating STDs to C++ code
14.6 Some new guidelines
14.7 Conclusions
Exercises
15.Process-oriented design
15.1 Introduction
15.2 Review and refinement of the logical model
15.3 The software and hardware architecture
15.4 The physical process model
15.5 Review and refinement of the physical model
15.6 Reconciling the physical and logical models
15.7 Theteststrategy
15.8 Conclusions
Exercises
16.Case study: Birstall Bank
16.1 Introduction
16.2 Scenario
16.3 Analysis
16.4 Design
16.5 Implementation
16.6 Conclusions
Part 11 Data-oriented software development
17. Implementing isolated data in C++
17.1 Introduction
17.2 Creating new data types with structs
17.3 Creating struct variables
17.4 Accessing elements of struc variables
17.5 unions
17.6 Creating enumerated types
17.7 Example: A simple payroll program
17.8 A rose by any other name ...
17.9 Conclusions
Exercises
18.Dynamic memory allocation
18.1 Introduction
18.2 Simple dynamic memory allocation
18.3 Dynamic arrays
18.4 More complex data structures
18.5 Conclusions
Exercises
19.Saving data for posterity
19.1 Introduction
19.2 File access fundamentals
19.3 Opening and closing files
19.4 Sequential file access
19.5 Direct file access
19.6 Conclusions
Exercises
20.The relational database
20.1 Introduction
20.2 Fundamentals of database systems
20.3 Why use a relational data model?
20.4 Data normalization issues
20.5 Relationships between tables
20.6 Implementation of RDBs
20.7 Other types of database
20.8 Conclusions
Exercises
21.Entity-relationship diagrams
21.1 Introduction
21.2 Modelling general associations
21.3 Using attribute diagrams
21.4 How to create ERDs
21.5 Implementating from ERDs
21.6 Aggregation relationships
21.7 Conclusions
Exereises
22.Data-oriented analysis and design
22.1 Introduction
22.2 The analysis phase
22.3 Integration of process and data models
22.4 Decision support systems
22.5 The design phase
22.6 Data normalization and speed of data access
22.7 The implementation phase
22.8 Conclusions
Exercises
23.Case study: Laughing House
23.1 Introduction
23.2 Scenario
23.3 Analysis
23.4 Press cutting
23.5 Design
23.6 Implementation
23.7 Conclusions
Part 11 Object-oriented software development
24.Why we need objects
24.1 Introduction
24.2 A thought experiment revisited
24.3 Encapsulation
24.4 Polymorphism
24.5 Inheritance
24.6 Classes for courses
24.7 Conclusions
Exercises
25.Encapsulation
25.1 Introduction
25.2 Constructor functions
25.3 Being destructive
25.4 Functions, objects and copies
25.5 Copy constructors
25.6 Example: A new array type
25.7 Dealing with errors
25.8 Guidelines
25.9 Conclusions
Exercises
26.A flrst look at class relationships
26.1 Introduction
26.2 Aggregations (APO relationships)
26.3 Associations (NTKA relationships)
26.4 Relationships between objects
26.5 Conclusions
Exercises
27.Polymorphism
27.1 Introduction
27.2 The this pointer
27.3 Overioading binary operators
27.4 Copy constructors vs assignment
27.5 Overloading unary operators
27.6 Using friend functions for operator overloading
27.7 Guidelines
27.8 Conclusions
Exercises
28.Generic programming
28.1 Introduction
28.2 Generic functions
28.3 Generic classes
28.4 Guidelines
28.5 Conclusions
Exercises
29.Inheritance
29.1 Introduction
29.2 Single inheritance
29.3 Multiple inheritance
29.4 Virtual functions, pointers and polymorphism
29.5 Pure virtual functions
29.6 Guidelines
29.7 Conclusions
Exercises
30.Class-relationship diagrams
30.1 Introduction
30.2 Entities vs classes
30.3 Class-relationship diagrams
30.4 Identifying appropriate classes
30.5 Conclusions
Exercises
31.Object-oriented SADIE
31.1 Introduction
31.2 Why CRDs are not enough
31.3 Building the object model
31.4 The components of the object model
31.5 Implementing the object model
31.6 Testing object-oriented systems
31.7 A recipe for success
31.8 Conclusions
31.9 Appendix: Source code for mailing list
Exercises
32.Case study: BirstaU Bank revisited
32.1 Introduction
32.2 Scenario
32.3 Developing the object model
32.4 Implementation of the class model
32.5 Conclusions
Conclusions
33.EHding at the beginning
33.1 Introduction
33.2 Which method should you use?
33.3 Varying and mixing the recipes
33.4 Conclusions
34.Bibliography
Appendices
A CASE tool: Installation
B CASE tool: Managing a project
C CASE tool: Installing the sample projects
D CASE tutorial: General introduction
E CASE tutorial: Dataflow diagrams
F CASE lutorial: Data dictionary
G CASE tutorial: Process specifications
H CASE tutorial: State transition diagrams
1 CASE tutorial: Structure charts
J CASE tutorial: Entity-relationship diagrams and
class-relationship diagrams
Index
· · · · · · (收起)
读后感
用户评价
坦率地说,这本书在“C++特性”的应用深度上,似乎做了刻意的“降权”处理。虽然书名中提到了C++,但它更像是将C++视为一种实现软件工程原则的“载体”,而非深入探讨语言本身的特性。例如,对于C++17/20引入的诸多现代特性,如概念(Concepts)在模板元编程中的应用,或者并发模型(`std::jthread`等)在构建高可靠系统中的优势,书中提及得非常有限。我的预期是,既然聚焦于工程实践,那么在处理性能敏感的模块时,如何利用C++的底层控制力来优化内存布局和运行时效率,应该是重头戏之一。目前看来,它更倾向于使用现代C++的抽象能力(如智能指针、RAII)来确保软件的健壮性和可维护性,而不是深入挖掘其极限性能。这使得这本书更偏向于“大型系统设计与管理”,而非“高性能C++编程实践”。对于那些想从C++程序员转型为软件架构师的读者来说,这可能是恰到好处的平衡;但对于那些追求极致性能优化的底层开发者而言,可能需要搭配其他更专注于语言内核的书籍来补充知识了。
这本书的封面设计,坦白说,初看之下,给我的感觉是相当的“专业”与“严谨”,以至于有些许的刻板。深蓝色调为主打,配上一些几何图形和代码片段的模糊背景,虽然明确地指向了技术领域,但如果抛开书名,它似乎与其他同类书籍没有什么本质的区别。我当时在书店里翻阅了好几页,主要关注的是目录结构和前言部分。我个人对那种旨在构建坚实理论基础,同时又不失动手实践指导的著作抱有很高的期待。拿到这本书时,我希望看到的是对软件生命周期各阶段,从需求分析到部署维护,有一个清晰、逻辑严密的梳理。特别是关于现代敏捷开发流程与传统瀑布模型的对比分析,我希望能看到一些超越教科书式的、更贴近行业痛点的探讨。我拿起它,掂了掂重量,感觉内容量是相当扎实的,这至少说明作者没有敷衍了事,而是投入了大量的精力去构建知识体系。如果它真的能如其名所示,将C++这一强大而复杂的语言,与CASE工具的自动化能力紧密结合起来,形成一套行之有效的工程方法论,那它绝对值得我放下其他正在阅读的技术读物,全身心投入进去。目前看来,单凭外观和初步的触感,它传递出一种严肃的学术气息,吸引着那些渴望系统性学习软件工程理论的读者。
语言风格上,这本书的叙述节奏变化非常丰富,这使得长篇技术阅读不至于让人感到枯燥。在讲解基础概念,比如面向对象设计原则(SOLID)时,作者采用了非常清晰、简洁的数学逻辑推导风格,每一个论断都建立在前一个结论之上,如同严密的数学证明。然而,一旦进入到项目管理与团队协作的章节,笔锋一转,变得极其富有人情味和经验主义色彩。作者用了不少笔墨来描述“技术债的谈判艺术”,以及如何在跨职能团队中建立信任和共同的质量标准。这种在“冰冷的逻辑”与“火热的实践”之间的快速切换,极大地提升了阅读体验。特别是那段关于“代码评审中的建设性批评”的描述,引用了某个著名公司的内部培训材料,措辞委婉却直击要害,读起来让人感觉像是直接听取了一位资深技术总监的教诲,而非冷冰冰的文本记录。这种多维度的叙事策略,成功地将技术硬核内容包裹在易于吸收的软性框架之中。
关于工具链的整合部分,我体验下来,感觉是这本书的“双刃剑”所在。一方面,作者试图构建一个从UML建模到代码生成的无缝衔接流程,这在理论上是极其吸引人的——即,所有的设计决策都能自动映射到可执行的代码框架上。但另一方面,实践的复杂性也暴露无遗。我尝试按照书中的步骤,在特定的开源CASE套件上复现那个复杂的数据库迁移流程示例时,遇到了大量的环境配置和版本兼容性问题。这让我不禁思考,对于一本强调工程实践的书籍而言,它是否应该更侧重于介绍工具背后的核心思想和原理,而不是局限于某一个或某几个特定版本的工具操作指南?因为工具的迭代速度远超书籍的出版速度。不过,书中对“模型驱动开发(MDD)”的哲学思考倒是很有启发性,它强调了“模型即真相”的理念,并探讨了在敏捷迭代中如何平衡模型的准确性和开发速度的矛盾。这种对工具应用哲学层面的探讨,弥补了操作细节易过时的不足,让读者能够更灵活地适应未来工具的演变。
我花了整整一个下午的时间,沉浸在它关于“软件架构设计”这一章节中,这部分内容的深度着实让我有些吃惊。作者显然没有满足于罗列已有的设计模式,而是深入剖析了在特定约束条件下(比如高性能、高并发)如何权衡选择微服务架构与单体架构的优劣。书中对“架构债务”的阐述非常精彩,它不是简单地将其定义为技术上的妥协,而是将其提升到了商业决策和长期维护成本的高度来分析,这使得一个原本偏向技术的概念,立刻拥有了管理学的视野。我特别欣赏其中引用的一系列经典案例研究,这些案例并非是那种已经过时了的“Hello World”级别的示例,而是基于实际项目中遇到的瓶颈进行的反思与优化过程。举例来说,关于模块间的耦合度量,书里介绍了一种结合了信息熵和依赖反转原则的混合指标,这远比我们日常工作中凭经验判断要科学得多。这种深入到细节,并能提供可量化分析工具的方法论,是区分一本“好书”和一本“优秀参考书”的关键所在。如果后续章节能保持这样的水准,那么这本书无疑将成为我工作台上的常备工具书,而不是仅仅用来“了解一下”的闲书。