「BUAA OO Unit 1 HW1」 【面向对象的】入手思路及架构分享

本文分享了一位学生在BUAAOOUnit1HW1作业中的面向对象设计思路和架构。通过分析training,确定了Expr-Term-Factor的数据存储架构,其中Factor接口为可扩展的基元。Parser和Lexer的实现细节未展开,但提到了它们在架构中的作用。作者强调了识别类和建立协作关系的重要性,并感谢了指导和帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

「BUAA OO Unit 1 HW1」 【面向对象的】入手思路及架构分享


Part 0 前言


写作背景

实现本次作业过程中,笔者和助教及同学们讨论多次,对架构进行多次修改和重构,最终确定了当前设计,在此和大家分享作业入手思路架构设计

定位

基于本篇博客,您可以大致了解笔者从零开始对题意进行理解及架构设计的心路历程。

Part 1 作业入手思路

面向对象与面向过程的思想

经过假期Pre2和Pre3项目的迭代开发,我们已经初步接近了面向对象设计的一些特点。但是面向对象仍是较新鲜和陌生的东西,遇到第一次作业这种并不算轻松的任务很可能会下意识想回到面向对象的思路。然而,这并不是课程的训练方向,也大概率并不适合后续的迭代开发,因此,下面着重介绍如何以**(可能)较为面向对象**的思路理解和实现题目。

Training-advance

课程组提供的training对本次作业有相当的启示,事实上笔者的解析框架也基本借鉴自training,以下分析training的设计思路及架构。

核心思路
数据存储架构

Expr->Term->Factor,分别为表达式、项和因子,这也和题目的形式化表述相符合。其中,Factor接口被NumberExpr实现,即这两者都可以成为因子。

解析流程

Parser(语法分析)调用Lexer(词法分析),获取下一个,在training中主要是(,),+,*,NumberParser以标点符号+*区分当前层次。

(1+2)*8+9为例:

在这里插入图片描述

HW1作业实现思路

数据存储架构

首先给出笔者的UML类图:

在这里插入图片描述

面向对象的核心之一是识别类,并在类之间建立层次式协作关系(援引自Pre 2 Task 1 guidebook)。在本此作业中,识别类并设计合适的接口可以视作工作的核心。

在上面介绍的training架构和思路中,Expr->Term->Factor的架构一方面符合形式化语言描述的一个合法表达式拥有的结构,另一方面由于Factor以接口形式呈现,其具有良好的可拓展性,对于新的因子如a*x^b可以较好地支持。同时,Factor还内含了递归的支持,例如:Expr对象可以在有限次中展开至若干个Number对象。

基于以上分析,以下介绍笔者的数据存储架构:

在这里插入图片描述

类似上述training部分的树形结构,同样采用Expr->Term->Factor结构,其中Factor接口被UnitExpr实现。Unit储存了一个形如 a × x b a\times x^b a×xb的数据,并且被视作基元

上述架构可以实现将原始字符串解析为一个完整的树状结构,同时,对每个结点来说,其存储了本节点所拥有的所有信息,并且对外提供一个extend()服务接口,使得外部节点可以通过该服务获取该节点的基元信息

因此,只需要搭建好Expr,Term,Factor三个类,设计这三个类的对外服务extend()方法,并且在Parser中以合适的方法调用即可。

Part 2 架构设计

Part1中已经较为详细地描述和定义了数据信息的存储,以下介绍架构设计。

Expr
数据成员
  1. HashSet形式存储terms儿子结点们。
  2. HashMap<BigInteger, Unit>形式存储通过调用其terms儿子们extend()服务获得的基元们。
  3. 用变量index存储该表达式的指数,以应对如(1+x)**2的情况
方法成员
  1. 实现自己的extend()方法,并返回给调用者一个HashMap<BigInteger, Unit>,代表自己作为Factor时内部储存的结点信息。
  2. 实现MULT()方法,以应对当本对象index值不为1时,需要进行的乘法。
  3. 实现toString()方法,根据自己的基元HashMap输出作业要求的答案。

Term

数据成员
  1. HashSet形式存储factors儿子结点们。
  2. HashMap<BigInteger, Unit>形式存储通过调用其factors儿子们extend()服务获得的基元们。
  3. 用变量pos表示该项外面是否有负号,以应对如x*-3的情况。
方法成员
  1. 实现自己的extend()方法,并返回给调用者一个HashMap<BigInteger, Unit>,为自己内部储存的结点信息。
  2. 由于项的factor之间的关系是乘法(在training中有介绍),因此,也需要在这里实现MULT方法,和Expr类同。

Factor

接口,内部为空,仅表示实现该接口的类具有因子属性。

Unit

数据成员
  1. constent,表示 a × x b a\times x^b a×xb中的 a a a
  2. index,,表示 a × x b a\times x^b a×xb中的 b b b
方法成员
  1. 实现自己的extend()方法,事实上返回一个只有自己的HashMap
ParserLexer

基于training的架构,需要修改部分内容以适应本架构,此处不再展开。

Part 3 后记

本次作业能够完成,本架构可以得以实现并最终呈现在这里,离不开老师、助教和同学们的无私帮助,在此表示深深的感谢。

本架构仍十分稚嫩而不成熟,十分欢迎各位在此讨论和批评。

03-20
### BUAA 面向对象编程课程的核心内容 面向对象编程(Object-Oriented Programming, OOP)作为现代软件开发的基础范式之一,在BUAA的相关课程中得到了深入探讨。该课程不仅注重理论知识的学习,还通过实践项目强化学生对OOP的理解和应用能力。 #### 1. **课程目标** - 本课程旨在引导学生从传统的面向过程编程转向更加灵活高效的面向对象思维方式[^1]。 - 学生能够掌握核心概念如封装、继承与多态,并将其应用于实际工程项目中[^2]。 - 提升代码质量的同时降低维护成本,使开发者可以专注于解决复杂的业务需求而非纠缠于低效的实现细节[^3]。 #### 2. **主要教学模块** ##### (1) **基础概念介绍** - 封装:隐藏内部状态并提供接口访问机制;保护数据安全性和一致性[^4]。 - 继承:子类可以从父类获取属性和方法,减少重复编码量[^5]。 - 多态:允许同一操作具有多种表现形式,增强系统的灵活性和扩展性。 ##### (2) **工具和技术支持** - JUnit框架被广泛用于自动化测试环节,尽管部分同学对其强制性的覆盖率要求存在异议,但它确实有助于发现潜在缺陷并提高产品质量^。 ```java @Test public void testAddition() { Calculator calc = new Calculator(); assertEquals(4, calc.add(2, 2)); } ``` ##### (3) **实战演练——迭代作业体系** - 通过五个阶段逐步深化的知识点引入方式,帮助学员构建完整的OOP技能树。 - 初始阶段重点在于熟悉基本语法规则及简单类的设计思路;后期逐渐过渡至复杂场景下的综合运用能力培养。 #### 3. **常见反馈与改进建议** - 许多参与者反映JUnit学习曲线陡峭且缺乏足够的官方文档支撑,因此建议增设专门针对此主题的教学资源。 - 另外还有呼声较高的几点改进方向包括但不限于延长授课周期匹配现有任务负荷水平、提前阐明重要技术要点以便规避不必要的返工现象发生等等. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值