\documentclass[实验报告模板]{subfiles}

\renewcommand{\mydate}{
    2023/10/20
}
\renewcommand{\mychapternum}{3}

\begin{document}
    \mytitle
    \begin{enumerate}
        \myitem{实验目的}{
            \item 使用第三章知识解决链表队列问题。
        }
        \myitem{实验内容}{
            \item 使用链队列模拟银行窗口业务。假设每位客户有 2 项信息：序号、金
            额。早上开张后，按随机时间有客户上门办理业务，假设携带的现金是
            1-20 万之间的随机数。来一位客户，就将其加入队列，等待办理业务。
            假设办理业务所需要消耗的时间和金额成正比（可设置一个系数），位
            于队头的客户办理完业务后，就从队列中移走。请编写程序动态模拟这
            个过程。
            \item （选做）在第一题的基础上，如果银行有多个窗口。
            \begin{enumerate}
                \item 客户过来时挑队列最短的排队，后面不会换队列。
                \item 如果排队过程中，出现相邻队列比自己所排队列短，则可以重新
                选择队列。
            \end{enumerate}
        }
        \myitem{实验原理}{
            \item 程序设计原理。
        }
        \myitem{实验步骤}{
            \item 问题抽象
            \item 编写程序
            \item 调试程序
            \item 完善总结
        }
        \myitem{调试过程、结果和分析}{
            \item C++采用面向对象的方式设计复杂程序时，要处理非常多的类型，因此可能会比较复杂；
            \item 传参数有引用传递、指针传递、值传递；
            \item 类的模板是静态多态，类的继承是动态多态；
            \item 子类对父类函数的重写、重载、覆盖；
            \item 私有、保护、公共、友元的成员访问权限；
            \item 比起Python和JavaScript，C++的各种类型、各种限制、各种访问权限非常复杂，由于初次调试这种复杂的程序，出现各种错误时也需要查资料解决，导致花费大约三天时间才完成这次作业；
            \item 但也许这就是C++这种强类型语言的特点，编写代码时需要对类型进行非常确定的定义（模板可能是例外），但这也保证了运行效率和安全性；
            \item 此次作业没有尝试使用异步、多线程、多进程等并发执行方式来提升执行效率并改善图形（命令行）界面体验，之后可以尝试加入；
            \item 也是初次使用cmake进行程序的构建、测试、打包，cmake用来管理这种多文件的复杂程序时确实比较方便。
        }
        \myitem{总结}{
            \item 对于这种较为复杂的程序，首先考虑它的架构，由于此程序需要使用到链队列的模型，而且还需要进行图形化或命令行的展示，因此考虑采用MVC架构，但又由于程序功能较少，因此不想使用多线程或异步的事件循环，因此尝试是否能在单线程同步的架构下实现MVC架构；
            \item 事实证明是可以在单线程同步的架构下实现MVC架构的，但是可能一些细节会有所更改，例如：
            \begin{enumerate}
                \item MVC中的Controller接受用户事件并通知Model，这种行为在没有事件循环的情况下采用了View直接调用Model来实现；
                \item Model通知View进行修改的行为，改为View直接依赖Model，之后更改View的时候只需调用View::refresh的方法，View就会从自己已经绑定的Model中获取数据并进行刷新。
            \end{enumerate}
            但是这样造成了View依赖Model，Controller依赖View和Model，也许可能不太符合MVC。
            \item 之后就需要考虑如何拆分各个模块，这里采用了面向对象的思想：
            \begin{enumerate}
                \item Model:    链队列的实现、客户对象；
                \item View:     背景界面、排队的显示、客户的显示、走路过程中的客户的显示；
                \item Controller:实现主循环，单个Controller绑定Model和View，调度Model和View的更新；
                \item MVC:      调用主循环，综合多个Controller，统一调度所有Controller的更新，之后所有View一起更新；
                \item main:     实现根据用户输入进行调整调用参数，是入口文件。
            \end{enumerate}
            每个文件中也有类之间的继承关系：
            \begin{enumerate}
                \item SingleQueueModel继承了Model；
                \item SimpleQueueView继承了QueueView，QueueView继承了View；
                \item SingleQueueController继承了Controller，DriftingController也继承了Controller。
            \end{enumerate}
            \item 虽然采用面向对象，总体是成功实现了，但各个模块之间的职责划分仍不是特别清晰，并且产生了很多依赖关系，因此仍需改进。
            \item 由于时间有限，暂未实现相邻队列换位的模拟。
        }
        \item \textbf{附件}\\
            运行时截图：\\
            \includegraphics[width=1\linewidth]{imgs/2023-10-29-10-52-02.png}
            \begin{enumerate}
                \item 单个队列\\
                \includegraphics[width=1\linewidth]{imgs/2023-10-29-10-38-47.png}
                \item 多个队列\\
                \includegraphics[width=1\linewidth]{imgs/2023-10-29-10-40-00.png}
                \item 自定义\\
                \includegraphics[width=1\linewidth]{imgs/2023-10-29-10-53-57.png}\\
                \vspace{1em}\\
                \includegraphics[width=1\linewidth]{imgs/2023-10-29-10-45-41.png}
            代码：\\
            \begin{enumerate}
                \itemsep 5em
                \item constants.h
                \inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/include/constants.h}
                \item model.hpp
                \inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/include/model.hpp}
                \item view.hpp
                \inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/include/view.hpp}
                \item controller.hpp
                \inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/include/controller.hpp}
                \item MVC.h
                \inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/include/MVC.h}
                \item MVC.cpp
                \inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/src/MVC.cpp}
                \item main.cpp
                \inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/src/main.cpp}
                \item CMakeLists.txt
                \inputminted[linenos=true,breaklines=true]{cmake}{../C++/第三章作业/CMakeLists.txt}
            \end{enumerate}
            \end{enumerate}
    \end{enumerate}
\end{document}