Author | Date |
---|---|
王晓强(QIndomitable) | 2018-07-26 |
王晓强-个人报告
目录
分工
- 回到顶部
- 第一轮迭代负责Model, ViewModel层, 完成ViewModel接收器, 和ViewModel命令
- 第二轮迭代负责Model, ViewModel层, 添加平衡二叉树, 伸展树, 左式堆
- 第三轮迭代负责Model, ViewModel层, 添加红黑树, 优化MVVM设计范式
第一轮迭代设计过程
- 回到顶部
设计任务
- Model设计
- 设计模型基类, 方便ViewModel层进行暴露属性
- 设计二叉查找树模型, 提供动态查找的基本操作(插入, 删除, 静态查找)
- ViewModel设计
- 设计ViewModel单例, 管理Model, 命令, 通知接收器, 通知发生器
- 设计通知接收器, 接受来自Model的属性改变的通知
- 设计命令基类, 方便ViewModel层进行暴露命令
- 设计
BSTInsert
,BSTErase
等命令
设计思路方案与实现简述
- 设计模型基类, 方便ViewModel层进行暴露属性
- 树提供共有的基本成员函数, 如中序, 层序遍历等
- 树节点提供共有的成员对象
left
,right
,key
,depth
- 继承属性通知发生器(
Proxy_PropertyNotification<T>
) - 设计
virtual
析构函数,virtual
清空函数(不同模型将使用不同清空动作) - 树模板声明
template <typename T, typename S = std::less<T>> class BaseTree : public Proxy_PropertyNotification<BaseTree<T, S>> { protected: BaseNode<T> *root; protected: void inorder(BaseNode<T> *cur, int *count); void levelorder(); public: BaseTree(); virtual ~BaseTree(); BaseNode<T> *getRoot(); virtual BaseNode<T> *getNIL(); void clear(); };
- 设计二叉查找树模型, 提供动态查找的基本操作(插入, 删除, 静态查找)
- 树节点继承基类树节点, 树继承基类树
- 实现插入, 删除, 查找算法
- 节点不需要增加其他属性
- 树不需要增加其他属性
- 模板声明(部分)
template <typename T, typename S = less<T>> class BST : public BaseTree<T, S> { public: BST(); virtual ~BST(); void insert(const T& key); BSTNode<T> *find(const T& key); void erase(const T& key); };
- 设计ViewModel单例, 管理Model, 命令, 通知接收器, 通知发生器
- 继承属性通知发生器(
Proxy_PropertyNotification<T>
) - 继承命令通知发生器(
Proxy_CommandNotification<T>
) shared_ptr<T>
维护BaseTree
, 构造时绑定对应Model
shared_ptr<T>
维护CommandBase
, 构造时绑定对应Command
- 私有维护
Model属性改变通知
接收器 - 提供方法绑定
Model
- 提供方法以
shared_ptr<T>
暴露Command
- 提供方法执行
Model操作/动作
(boolean 返回值), 将来用于Command
实现 - 详见
/project/ViewModel/ViewModel.*
- 继承属性通知发生器(
- 设计通知接收器, 接受来自Model的属性改变的通知
- 继承
IPropertyNotification
- 以指针方式引用
ViewMode
单例 override OnPropertyChanged(str)
成员函数- 详见
/project/ViewModel/Sinks/VMPropertySink.*
- 继承
- 设计命令基类, 方便ViewModel层进行暴露命令
- 以
shared_ptr<T>
存放参数 - 提供参数的
set()
, 和Exec()
纯虚函数 - 详见
/project/Common/CommandBase.*
- 以
- 设计
BSTInsert
,BSTErase
等命令- 继承
CommandBase
override Exec()
函数- 以指针方式引用
ViewModel
单例 - 详见
/project/ViewModel/Commands/*.*
单元测试
- 二叉查找树
#include "BST.h" int main() { BST<int> *bst = new BST<int>; bst->insert(5); bst->insert(3); bst->insert(4); bst->insert(6); bst->insert(2); bst->insert(1); bst->insert(7); bst->insert(8); bst->insert(9); bst->insert(10); bst->insert(11); bst->erase(5); bst->erase(4); bst->erase(3); bst->print(); delete bst; return 0; }
- 程序运行输出
- 继承
第二轮迭代设计过程
- 回到顶部
设计任务
- Model设计
- 设计平衡二叉树, 伸展树, 左式堆
- ViewModel设计
- 设计
AVLTreeInsert
,AVLTreeErase
等命令 - 设计
SplayTreeInsert
,SplayTreeErase
等命令 - 设计
LeftistHeapInsert
,LeftistHeapErase
等命令设计思路方案与实现简述
- 设计
- 设计平衡二叉树, 伸展树, 左式堆
- 设计方案同二叉查找树(见第一轮迭代)
- 设计
AVLTreeInsert
,AVLTreeErase
等命令AVLTree
,SplayTree
相关命令设计方案同二叉查找树(见第一轮迭代)LeftistHeap
相关命令的设计, 要注意无法实现find操作- 详见
/project/ViewModel/Commands/*.*
,/project/Model/*.*
单元测试
- 平衡二叉树 ```C++ #include “AVLTree.h”
int main() { AVLTree
*atree = new AVLTree ; atree->insert(1); atree->insert(2); atree->insert(3); atree->insert(4); atree->insert(5); atree->insert(6); atree->insert(7); atree->insert(8); atree->erase(8); atree->erase(5); atree->erase(7); atree->erase(6); atree->print(); delete atree; return 0; } ``` - 程序运行输出
第三轮迭代设计过程
- 回到顶部
设计任务
- Model设计
- 设计红黑树
- ViewModel设计
- 设计
RBTInsert
,RBTErase
等命令
- 设计
- MVVM设计范式优化
设计思路方案与实现简述
- 设计红黑树
- 设计方案同二叉查找树(见第一轮迭代)
- 设计
RBTInsert
,RBTErase
等命令RBT
相关命令设计方案同二叉查找树(见第一轮迭代)
- MVVM设计范式优化
- 重命名
ViewModel
提供的关于Model
的操作, 使其体现功能信息, 而不体现命令信息 - 详见
/project/ViewModel/Commands/*.*
,/project/Model/*.*
- 重命名
单元测试
- 红黑树
```C++
#include "RBT.h"
int main()
{
RBT<int> *rbt = new RBT<int>;
rbt->insert(3);
rbt->insert(4);
rbt->insert(1);
rbt->insert(2);
rbt->insert(5);
rbt->insert(10);
rbt->insert(9);
rbt->insert(7);
rbt->insert(8);
rbt->insert(6);
rbt->erase(4);
rbt->erase(1);
rbt->erase(2);
rbt->erase(3);
rbt->print();
delete rbt;
return 0;
}
``` - 程序运行输出
图表说明
- 回到顶部
- UML类图
个人课程心得体会
- 个人
CPP
工程技能收获- 初步了解大型程序的多人协作开发流程,
MVVM UI
设计模式可以充分解耦Model
,ViewModel
,Model
之间的关联, 通过基类, 通过接口协议, 可以实现高效的同时协作开发, 提高工作效率 - 对模板元编程技术有了新的理解和熟练, 对现代C++特性也有了进一步的了解
- 初步了解大型程序的多人协作开发流程,
- 个人合作精神收获
- 正确的框架, 高效的设计模式, 产品经理恰当的分工是一个开发团队成功的关键, 也是在平时的课程中, 在校园里很难学到的东西, 短学期让我受益匪浅!
- 分工之后, 并不是完全分割开发者, 开发者之间也要保持有效的沟通, 才能一起提高工作效率, 设计出令人满意的作品, 艺术品!
课程建议
- 回到顶部
- 在迭代前期能提供设计范式的
Demo
将更有利于学生的迭代和分工 - 更多介绍
C++
的经典工程和设计范式
- 在迭代前期能提供设计范式的
PREVIOUSJS引用与值