开发与设计
设置模式之于面向对象就像算法之于数据结构
数据结构与算法
容器的接口完备性
1 不能重叠:多了误导别人不知道调用哪个好,增加思维负担,代码冗余;出了Bug你好统一改,你还要搜两遍;
GetSlice == GetSliceVec
2 不能少:少了就是残疾,无法完成某些功能;
GetSlice(string sliceId) GetSlice(int sliceOrderNumber)
QTVector.at(int position)
QTVector.IndexOf(ObjPtr)
3 多与少的衡量标准取决于是否需要。
UserDataMgr()::Instance()->ClearEveryThing(); //太极端
MarkSahpeMgr::Instance()->ClearAllMarkShape(); //双刃剑
4 内部辅助接口不应该公开到外部
设计模式
单一职责原则
一个类只有一个职责,不应既做这又做那,这样的好处是:降低了类的复杂性提高了代码的可读性,可维护性降低了因变更带来的风险,为复用打下基础。
一个类的成员函数也应该只做一件事。
1 Display2D -> m_currentDisplaySliceId -> SliceBrowser
2 A -> ACallBack <- B
A-> ABCallBack <- B
A-> ACallBack
B-> BCallBack
3 SetType(type)
{
m_type = type;
AInstance()->InitRender(m_render);
}
---------------------------------------------------
SetType(type) { m_type = type;}
AInstance()->InitRender(B->GetRender());
--------------------------------------------------
SetTypeAndInitRender(type)
里氏替换原则
一个子类必须实现父类的所有方法一个子类可以拥有父类没有的方法在所有需要父类对象的地方都可以用子类的对象替换而不会出现问题
依赖倒置原则
高层模块不应该依赖底层模块
抽象不应该依赖于细节
实现应该依赖于抽象
接口隔离原则
1 一个类可以有多个方法,但如果打算向外部提供部分方法,则把这些方法实现为接口,返回基类接口类型;所有接口皆为虚函数。
(1)减少类型耦合;(2)减少工程耦合
IMarkShape* -> MarkShapeBase -> MarkShape
2 面向接口编程:调用的地方使用接口类,使用多态来实现横向扩展
迪米特法则
最少知识法则只与你直接的朋友通信一个类不应该与过多的类发生联系如果一个类需要调用第三个类的方法,可以加入中间者,转发调用这个方法
CHttp -> Request() -> CGetData -> GetAFromA() GetA2FromB() GetCFromC()
开关原则
1 最重要的一个核心原则一个软件实体应该对扩展开放,对修改封闭
2 把变与不变的事务分开
组合优先于继承
1 使用继承什么情况下是不利的呢?
Display2D -> SeriesPrivewer / SliceBrowser / PatientBrowser
Display2D -> (SeriesPrivewer ->PatientBrowser) / SliceBrowser
2 组合的优点是什么呢?
你不会用到它
1 用原型迭代而不是一开始就庞大
2 不为不需要的功能付出任何代价
(1) SliceData slice;
slice.m_sliceId;
(2)
slice.GetSliceId()
slice.SetSliceId(id)
(2)
SeriesData::AddSlice(slice)
{
m_sliceMap[slice.m_sliceId] = slice;
m_sliceIdMap[sliceOrderNumber] = slice.m_sliceId;
}
软件的规模与技术的演化
1 模块化与分层是解决任意复杂度软件的不二之选。
2 业务模型和市场要求软件架构。
3 Web网页的发展
(1) 静态网页 HTML
(2) 动态网页 ASP JSP Servlet
(3) 部分ajax WebService
(4) 前端:前端框架Vue/React/Angular Node
(5) 服务端:微服务 Spring Boot Node
复杂业务系统的开发:分层与模块化
上层依赖底层;
底层不依赖上层;
模块化是为了复用;
类型尽量不传递:使用基础类型和无类型的字符串类型来解耦,来实现数据传递,int,float,std::string,json,xml