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

Posted by saltyfishyjk on 2022-03-05
Words 1.4k and Reading Time 4 Minutes
Viewed Times

「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\times x^b$的数据,并且被视作基元

上述架构可以实现将原始字符串解析为一个完整的树状结构,同时,对每个结点来说,其存储了本节点所拥有的所有信息,并且对外提供一个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\times x^b$中的$a$。
  2. index,,表示$a\times x^b$中的$b$。

方法成员

  1. 实现自己的extend()方法,事实上返回一个只有自己的HashMap

ParserLexer

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

Part 3 后记

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

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


This is copyright.