【项目重构】

软件设计和重构阶段(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去写一个项目。而在优化的过程中,以什么东西为标准,按照什么样的方式,采用什么样的方法,使用什么样的工具,要达到的怎么样的目的。这些就是所谓的开发经验

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值