Zhi Wei 的个人博客
记一次闭门造车的迭代开发
记一次闭门造车的迭代开发

记一次闭门造车的迭代开发

大概是23年的这个时候,我自己撸了一个程序,给v加了给守护进程。虽然代码不伦不类,UI可以说是没有,但是好在运行一直还算稳定,唯一的诟病之处就是断开连接的时间比较长,还有跑在我的OpenWRT上会因为PPPOE重拨自动退出。

这一次迭代,就是为了解决这两个问题,当我打开了上一次打包的源码,仅仅看了一眼我就放弃了。没有备注、没有文档。实在是不想尝试解读这一串臃肿而又驴头不对马嘴的代码了。于是我选择了重构。粗略的回顾了一下,与其称之为程序,还不如称为Hello Word。

之前的版本

新版本

现代的软件工程学中,前人们已经总结出了多种开发模型,参考前人们的智慧,我在编码之前对需求进行了分析,并且画出了基本的业务流程图,继承了之前版本的一些设计思路,重新对代码进行了抽象和封装。

新的程序替换上后,切换的效率是立竿见影,如果对你有帮助或者想要源码,可以与我联系,欢迎对我的项目提出意见或者指正错误的地方。这里记录一下开发过程中遇到的一些问题和解决办法:

编译器的选择

在编码的时候,出于习惯和便利性的考虑,我一直都是在Windows上使用Visual Studio的跨平台功能在Linux环境下进行开发。由于这次将C/S分开实现,导致了一个问题,我在DEBUG的时候,没有办法在同一个Linux上监听同一个端口。所以,我需要在Linux上也部署一个开发环境。于是我选择了的Debian桌面加Visual Studio Code进行开发,体验也非常的不错。

与VS不同的是,VS Cdoe需要更多的手动配置,包括编译的顺序和编译的方法,这些都需要在tasks.json中定义好,这个是我Server项目中的配置文件。还有如果使用GDB调试还需要另外配置一个launch.json文件。

{
    "tasks": [
        {
            "label": "C/C++: g++ build all cpp files",
            "type": "shell",
            "command": "/bin/bash", //前置执行命令
            "args": [
                "-c",
                "g++ -g -c ${fileDirname}/*.cpp"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": "$gcc"
        },
        {
            "type": "cppbuild",
            "label": "C/C++: g++ 生成活动文件",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${fileDirname}/basic.o",
                "${fileDirname}/model_s.o",
                "${fileDirname}/v2dd_s.o",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "-lssl",
                "-lcrypto",
                "-lncursesw"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "dependsOn":[
                "C/C++: g++ build all cpp files"
            ],
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

NCURSES库

在上一个版本中,UI的实现参考了CRT显示器,一行一行的打印文字在屏幕上,简单实用,但缺点也很明显,输出的内容杂乱无章,缺乏逻辑控制。秉着不重复造轮子的观念,我询问了GPT,它告诉我了一个叫做NCURSES的 古老TUI框架库,有多古老呢?早在2001年就已经有前辈对官方帮助文档进行翻译。这是一份来自近25年前的NCURSES库中文帮助文档:NCURSES Programming HOWTO 中文版(简体中文)

这里记录一下NCURSES的使用技巧,与cout不一样的是,wprint函数并不会直接将数据输出到屏幕上,而是输出到缓冲区域,需要调用refresh()或者doupdate()函数才会将缓存区的数据打印到屏幕上,而且 NCURSES也可以同时创建多个缓冲区,可以实现一些比如多窗口切换的效果。在我的程序中,我只用到了Window库,并没有用到面板库。这里是ncurses-6.4版本的官方帮助文档:Welcome to ncurses,其中包括了英文版的NCURSES Programming HOWTO

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注