软件设计和重构阶段(design_restructure分支)
StartUML
0x0 类图
ClassDiagram
:静态图,不会描述两个或多个对象之间
的互动关系,描述的是定义关系
,成员变量
,成员函数
SequenceDiagram
:时序图
类和类
的关系:
1.依赖
2.组合
3.关联 :包含
头文件
0x1 时序图
需要把握的原则:不需要
全部的代码
流程都画出来,循环
,判断
等分支不需要体现在时序图中,只需要把每个模块的核心的代码
分支体现出来即可
a.WindowAPI不需要把参数和返回值
都体现出现,简单体现
即可
b.判断条件
有时可以用中文表示
c.错误处理
不用体现出来
d.业务代码的语法逻辑
不需要体现出来
整体代码
时序图
命令号执行
时序图
服务端重构
不能为了设计而去设计,这次重构的
目的
(重构后的实际效果
)是提高程序的可扩展性
。(当要增加一个功能时,需要增加一个全局函数,然后在ExcuteCommand函数里面新增一个分支
,需要在一个文件里面反复横跳
)
0x1 增加CServerTool
类
这个类存放的是
静态的功能函数
,相当于全局函数,只不过调用的时候需要指明是哪个类
,就给了我们查找所有引用的机会。
0x2 增加CCommand
类
使ExcuteCommand函数变得简洁:
1.去掉switch语句
,当用户需求变化的时候,需要大改代码,映射表就可以解决这种可变的需求
总结:MFC的
消息循环
采用的机制
和我们的重构思路
有异曲同工之妙,两者的设计思想都是一样的,要慢慢去体会,领悟
现有架构
存在的问题
:网络模块在代码中
无处不在,设计网络模块的初衷是为了通信使用
的,而不是无所不在
希望达到的代码效果:不改变代码执行的流程,同时网络模块不要暴露给调用者,
解决方案1:回调函数
更新设计图,删除多余的函数,调试代码
bug的出现
说明自己对一些代码的理解不到位,需要透过现象,看日志,下断点。(潜意识认为发送还是以前哪个旧架构得到一个数据就发出去。)
总结:删除接口和保留接口一定要有很清醒的认识,这个接口和这个
类设计的初衷
是不是一致的。不是一致的就要删除它(删不掉就说明有耦合)
客户端重构
类图和时序图
存在的问题:界面层存在耦合,监控对话框不能直接去调用网络模块的函数,需要去通知父窗口
,然后再去调用网络模块
,违背了网络模块设计的初衷
。而导致这个耦合的根本原因
是IP和端口数据在主对话框的视图层
实现是
零散
的,复杂
的,繁琐
的,导致我们没有办法一眼看透
。大型项目,操作系统的代码更是成千上万
行。所以设计图的好处就体现出来了,设计图不需要把所有的代码逻辑
都体现出来,而是把核心的代码框架
体现出来。然后在战略上去进行优化,重构
,问题才能迎刃而解
。
总结:
1.业务逻辑
和流程
,是随时可能发生改变
的!!!
2.头文件的函数中如果太多代码
(一两句可以放在头文件
),需要放在cpp文件中,否则头文件显得太臃肿
客户端重构后出现的问题
问题:监控
子
线程,鼠标主
线程同时发送数据,会出现监控发送的数据,接收到的却是鼠标数据
。导致客户端数据处理阶段乱了秩序,由于服务器处理完一个命令
后才回去再次accept
,所以一次只能处理一个命令,当客户端两个命令同时发送
的时候,就容易出现一系列
的问题。而重构前的版本,我们通过消息驱动
的方式在主对话框集中发送数据
,相当于排队
在主线程
去处理网络模块,相当于在一个线程内
发送数据。所以我们必须去解决重构后
出现的两个隐患问题
解决方案:网络模块
子线程
(负责
去发送数据和接收数据)+事件
CreateEvent + WaitForSingleObject + SetEvent
新的问题:在多线程环境下,m_lstSend等
数据
是线程不安全的,如果两个线程同时在push_back
等操作,会导致你的机器死机
。
解决方案:
1.给数据
加锁,禁止他进行一个同时的操作
总结:做项目的意义是
遇到问题
有经验了,这些东西是没办法整理成一个文档的,每一个项目
,每一个情况
,每一个程序
他都有不同
的地方,不可能一个招式全部搞定。你只能反复去调试,去修改,在这个过程中找到这种调试和修改的感觉
(在哪下日志,断点,条件断点等,卡死的情况下应该怎么去处理,应该怎么去排查),这个需要你去自己动手去摸索才可能有所触动,关听课是不可能得到的感觉。
坐标问题:我们拿到的
坐标数据
是相对于红色框框左上角
,那么他进行转换的时候就会出现偏差
。所以我们的解决思路就是把获取到的坐标
转换成以图片控件
为参照图的客户区坐标
。(当我们对问题没有思路的时候,一定是自己对这个问题的本质
没有理解)
总结:
逻辑优化
是衡量一个程序员有没有在思考
的标准之一
网络模块的重构
:
重构原因:文件夹
显示
功能,文件下载
功能出现一系列的问题,究其原因,是现有的机制出现了问题
期望的效果
:
1.从函数调用
的耦合模式改成消息机制
的松散模式,从而使文件下载等业务功能和网络模块脱钩
2.把网络模块子线程改成消息
子线程,从而也不会出现需要数据同步处理
等情况(同步
→异步
)
https://www.cnblogs.com/IT-CPC/p/10898871.html
总结:程序员写代码
绝大部分
都是一个完善和优化的过程,很少说你从0到100
去写一个项目。而在优化的过程中,以什么东西为标准
,按照什么样的方式
,采用什么样的方法
,使用什么样的工具
,要达到的怎么样的目的
。这些就是所谓的开发经验