BUAA-OO-第四单元:UML建模

一、正向建模与开发

1、UML正向建模 ==> java程序开发

利用UML(统一建模语言)进行正向建模设计Java应用程序的流程通常包括以下几个步骤:

  1. 确定需求

    在所有任务开始之前,我们需要明确Java应用程序的需求和功能。这可能涉及与客户或利益相关者进行讨论,收集需求,并定义应用程序的范围和目标。

  2. 绘制类图

    类图是描述系统中类、接口、关系和属性的UML图表。

    我们可以根据系统的概念设计创建类图,标识系统中的各个类、它们的属性和方法,并定义它们之间的关系,如继承、关联等。

  3. 绘制状态图

    状态图是一种UML图表,用于描述对象之间的状态切换。

    我们可以根据类图创建状态图,展示在不同的操作或方法调用之间对象的交互状态切换流程。

  4. 绘制顺序图

    顺序图是一种UML图表,用于描述系统中的活动、流程和决策。

    我们可以根据类图和系统的工作流程创建状态图,展示系统中的各个活动以及它们之间的关系和条件。

  5. 编写代码

    一旦我们完成了UML建模,就可以根据设计的结果开始编写Java代码。我们可以使用UML图表作为参考,根据类图中的类和方法编写相应的Java类和方法。

  6. 进行测试和调试

    在编写完代码后,进行测试和调试是非常重要的。我们可以根据类图、状态图和顺序图中定义的交互流程来编写测试用例,确保Java应用程序按照预期进行操作。

  7. 部署和维护

    最后在所有工作完成之后,我们可以将Java应用程序部署到适当的环境中,并对其进行维护和更新,以确保其正常运行和满足用户需求。

2、工程领域的意义

在正向建模与开发的工程领域,利用UML进行建模设计具有以下几点意义:

  • 易于理解和沟通

    UML提供了一种标准化的图形表示方法,使得系统设计和架构可以更容易被团队成员和利益相关者理解和沟通。它提供了一种通用的语言,帮助人们更好地理解和讨论系统的不同方面。

  • 风险降低

    通过使用UML进行正向建模,可以在实际编码之前发现和解决潜在的设计问题。这可以降低开发过程中的风险,并减少后期修改的成本和工作量。

  • 设计可重用性

    UML建模可以帮助您更好地识别和设计可重用的组件和模块。通过使用UML中的关系和抽象概念,可以促进系统的模块化和组件化,提高代码的可重用性和可维护性。

  • 指导代码开发

    UML建模提供了对代码开发的指导,帮助开发人员更好地理解系统的结构和组织,并根据类图、状态图、顺序图等UML图表编写相应的代码。这有助于提高开发人员的效率和代码质量。

  • 支持工具和自动化

    许多软件开发工具和集成开发环境(IDEA)支持UML建模,可以自动生成代码、执行静态分析、进行自动化测试等。这些工具可以提供更高的生产力和质量保证。

总而言之,利用UML进行正向建模设计Java应用程序可以帮助团队更好地理解和沟通设计意图,降低风险,提高代码质量,并支持开发过程中的自动化和工具集成。

二、第四单元架构设计

1、UML图

类图

Main

状态图

StatechartDiagram

顺序图

SequenceDiagram

2、代码迭代

第十三次作业

第十三次作业的主要任务是构建起整个图书馆借阅的流程,也就是如何正向建模出所有对象已经它们各组的属性和方法,对此我列出的文字版建模如下:

hw13-1

hw13-2

第十四次作业

第十四次作业需要迭代书籍加购校际借阅两项功能,其中需要重点注意的是借阅流程的各个分支步骤的判断条件,同时也要正确输出各个状态的切换流程。

  • 书籍加购

    针对书籍加购,我添加了一个 PurchaseDepart 类,包括如下几个属性:

    1
    2
    3
    4
    5
    6
    7
    public class PurchaseDepart {
    private ArrayList<String> purchaseBooks; //需要购买的书籍
    private ArrayList<Request> lendInRequests; //通过校际借阅即将运进来的书籍
    private ArrayList<Request> sendOutRequests; //校际借阅运出去的书籍

    //......
    }
    • 其中 sendOutRequests 里面不仅包括了**==接给==其他图书馆的书**,还包括自己需要**==还给==其他图书馆的书**。
  • 校际借阅

    主要需要修改 Librabry 类中,把所有没有借到书的请求,全部存储起来,在当天结束闭馆和第二天开关之前处理他们。

    • 其中需要注意先处理order,再确定purchase,最后校际借阅书籍

第十五次作业

第十五次作业只需要添加图书的借阅期限,以及逾期归还的违规行为。

  • Book 类中添加当前这本书是哪一天借走的;
  • return 操作时,额外判断一下是否预期进行 fine 罚款。

3、代码&UML模型追踪关系

代码和UML模型之间的追踪关系是指代码中的元素(类、方法、属性等)与UML模型中的元素之间的对应关系。这种追踪关系可以通过以下几种方式实现:

  • 注释

    在代码中可以使用注释来指定与UML模型中元素的对应关系。

    例如,我们可以在代码中使用注释来标识某个类或方法与UML类图中的哪个类或方法对应。

  • 命名规范

    通过在代码中使用特定的命名规范,可以表明代码中的元素与UML模型中的元素之间的对应关系。

    例如,使用相同的命名规范来命名类、方法和属性,以便与UML类图中的元素进行匹配。

  • 工具支持

    许多集成开发环境(IDEA)和UML建模工具提供了支持代码和UML模型之间追踪关系的功能。这些工具可以通过分析代码和UML模型来自动进行追踪和匹配,帮助您更好地理解代码和模型之间的关系。

  • 反向工程

    有些工具支持从代码生成UML模型的反向工程。这些工具可以分析代码,提取类、方法和关系等信息,并生成相应的UML模型。通过这种方式,代码和UML模型之间的追踪关系可以建立起来。

通过建立代码和UML模型之间的追踪关系,可以使开发人员更好地理解代码的设计意图,帮助团队成员在代码开发和维护过程中更好地与UML模型保持一致。此外,追踪关系还可以支持代码和模型的同步更新,确保两者之间的一致性和准确性。

三、课程架构设计思维演进

学习面向对象课程后,我的架构设计思维会经历一系列的演进和提升:

第一单元

  • 抽象和模块化思维

    第一单元强调抽象和模块化的思维方式。因此通过第一单元学习,我更加注重将复杂系统分解为独立的模块和组件,并通过定义清晰的接口和关系将它们连接起来。这种抽象和模块化思维能够提高系统的可扩展性、可维护性和复用性。

  • 面向接口编程

    第一单元强调面向接口编程的重要性。通过学习,我掌握了定义清晰接口的能力,并在代码中使用接口进行交互,而不是直接依赖于具体的实现。这种面向接口编程的思维方式可以提高系统的松耦合性和可测试性。

第二单元

  • 设计模式的应用

    第二单元介绍了常见的设计模式,如生产者-消费者模式、工厂模式、观察者模式等。通过学习这些设计模式,我学会在实际的架构设计中应用它们,以解决特定的设计问题;学会识别问题背后的模式,并将其应用到系统的设计中,提高系统的灵活性和可维护性。

  • 性能和可伸缩性考虑

    学习第二单元后,我开始考虑系统的性能和可伸缩性方面的设计。我更加注重数据结构和算法的选择,以及系统的并发性和扩展性等方面的考虑。我会尝试使用更高效的数据结构和算法,并考虑系统在大规模和高并发环境下的设计和实现。

第三单元

  • 设计原则的应用

    第三单元介绍了一些设计原则,如单一职责原则、开闭原则、依赖倒置原则等。学习后,我会在自己实际的架构设计中应用这些原则,以指导系统的设计和演化。他们会更加注重高内聚、低耦合、可扩展和可维护性等设计原则的实践。

第四单元

  • 软件架构的理解

    第四单元还介绍了一些常见的软件架构,如分层架构、中心控制式、分级代理式等。学习后,我开始理解不同架构模式的特点和适用场景,并在实际的架构设计中考虑选择合适的架构模式。

总的来说,通过学习面向对象课程,我的架构设计思维将从简单的功能实现向更综合、抽象和可扩展的思维转变;会更注重抽象和模块化思维,应用设计模式、面向接口编程和设计原则,考虑性能和可伸缩性,并理解不同的软件架构模式。这种思维的演进使我能够设计出更高质量、可维护和可扩展的软件系统。

四、课程测试思维演进

学习面向对象课程后,我的测试思维会经历了一系列的演进和提升:

第一单元

  • 单元测试意识的加强

    第一单元强调单元测试的重要性。学习后,我更加注重编写可靠、独立和可重复执行的单元测试。我学习了如何使用测试框架和断言库来编写有效的单元测试,并将其作为开发过程中的重要环节。

第二单元

  • 集成测试和系统测试的考虑

    除了单元测试外,学习第二单元引导我关注集成测试和系统测试。我学习了如何编写集成测试来测试多个组件之间的交互,并使用系统测试来验证整个系统的功能和性能。这种全面的测试思维将帮助我更全面地保证系统的质量和稳定性。

第三单元

  • 测试驱动开发(TDD)的实践

    学习第三单元后,我了解到了测试驱动开发(TDD)的概念和实践。我学习了如何在编写代码之前先编写测试用例,并通过逐步添加代码来使测试通过。TDD的实践能够帮助我更早地发现问题,提高代码质量和可维护性。

第四单元

  • 自动化测试和持续集成的实践

    学习第四单元后,我了解到了自动化测试和持续集成的实践。我学习了如何使用自动化测试工具和框架来自动运行测试,并将测试过程集成到持续集成和持续交付流程中。这种实践能够提高测试效率和代码质量。

总的来说,通过学习面向对象课程,我的测试思维将从简单的功能验证向更全面、自动化和持续的测试转变。我更加注重单元测试的编写和TDD的实践,掌握模拟和测试替身的使用,关注集成测试和系统测试,并实践自动化测试和持续集成。这种测试思维的演进将帮助我构建更可靠、稳定和高质量的软件系统。

五、课程收获

通过学习面向对象课程,我获得以下收获:

  • 面向对象的思维方式

    面向对象编程(OO)是一种基于对象的编程范式,它强调将问题划分为相互关联的对象,并通过对象之间的交互来解决问题。学习面向对象课程帮助我培养了面向对象的思维方式,使我能够更好地理解和设计复杂系统。

  • 封装和抽象能力

    OO的核心原则之一是封装和抽象。学习面向对象课程使我熟悉如何将数据和方法封装在类中,并通过提供公共接口来隐藏内部实现细节。这种封装和抽象的能力可以帮助您设计出更加模块化、可维护和可复用的代码。

  • 类和对象的概念

    学习面向对象课程使我熟悉类和对象的概念。我学习了如何定义类,创建对象以及如何在对象之间进行通信和交互。这些概念是面向对象编程的基础,对于理解和设计复杂系统至关重要。

  • 继承和多态

    继承和多态是面向对象编程的重要特性。通过学习面向对象课程,我了解了如何使用继承创建类之间的层次关系,并通过多态实现灵活的对象行为。这些概念可以提高代码的可重用性、灵活性和扩展性。

  • 设计模式和软件架构

    面向对象课程通常会介绍常见的设计模式和软件架构。设计模式是解决常见设计问题的经验总结,帮助我在设计和实现中遵循最佳实践。软件架构则关注整个系统的组织结构和模块化,学习面向对象课程使我了解了不同的架构模式和如何选择适合的架构。

  • 代码可维护性和重构能力

    通过学习面向对象课程,我学习了编写可维护和可读性高的代码的技巧,了解了如何设计清晰的类和方法,并学习重构技术,以改进现有代码的结构和设计。

  • 团队合作和项目管理

    面向对象课程通常涉及团队合作和项目管理方面的实践。我有机会学习如何协调工作、进行版本控制和解决团队合作中的问题,例如使用 Gitlab。

总而言之,通过学习面向对象课程,我获得了一种强大的编程思维方式和技能,能够更好地理解和设计复杂系统,编写可维护和可复用的代码,并在团队合作中发挥更好的作用。这些技能对于成为一名优秀的软件开发人员或计算机科学专业人士至关重要。