王晓强-个人报告

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;
       }
      
    • 程序运行输出

testBST

第二轮迭代设计过程

  • 回到顶部

    设计任务

  • 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;  }  ```  - 程序运行输出
    

testAVL

第三轮迭代设计过程

  • 回到顶部

    设计任务

  • Model设计
    • 设计红黑树
  • ViewModel设计
    • 设计RBTInsert, RBTErase等命令
  • MVVM设计范式优化

    设计思路方案与实现简述

  • 设计红黑树
  • 设计RBTInsert, RBTErase等命令
  • 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;
   }
   ```    - 程序运行输出

testRBT

图表说明

个人课程心得体会

  • 回到顶部

  • 个人CPP工程技能收获
    1. 初步了解大型程序的多人协作开发流程, MVVM UI设计模式可以充分解耦Model, ViewModel, Model之间的关联, 通过基类, 通过接口协议, 可以实现高效的同时协作开发, 提高工作效率
    2. 对模板元编程技术有了新的理解和熟练, 对现代C++特性也有了进一步的了解
  • 个人合作精神收获
    1. 正确的框架, 高效的设计模式, 产品经理恰当的分工是一个开发团队成功的关键, 也是在平时的课程中, 在校园里很难学到的东西, 短学期让我受益匪浅!
    2. 分工之后, 并不是完全分割开发者, 开发者之间也要保持有效的沟通, 才能一起提高工作效率, 设计出令人满意的作品, 艺术品!

课程建议

  • 回到顶部
    1. 在迭代前期能提供设计范式的Demo将更有利于学生的迭代和分工
    2. 更多介绍C++的经典工程和设计范式