设计模式,面向对象的一些思考
国庆这两天在家里看了<<面向模式的软件体系结构>>,加上之前看过<<Head First设计模式>>和<<设计模式>>这两本书,总觉得原来高端的东西似乎也没那么神秘,里面的模式自己在工作中也都用到过,并没有怎么特意地去学习,都是自己写代码总结出来的,看了三本设计模式的书,最终记住的模式也没几个,或者说,最终自己也没学到什么东西
谈设计模式一定要谈到面向对象,面向对象的本质是多态,封装和继承,设计模式则能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力
更多的来看,设计模式更像是对于面向对象编程的一种补充,是为了代码的重用性、灵活性和扩展性。但是,不管是重用,灵活,扩展,最起码的基本要求是代码的可读性
为什么C++会遭人唾弃,C语言能受到人们的追捧,一个原因就在于代码的可读性,特别是C++的模板有很多的戏法,有看过<<C++设计新思维:泛型编程与设计模式之应用>>的都知道:C++很酷,但也很复杂。大量的模板技巧写成的库节省了我们大量的时间,但同时出问题也给我们带来了大量的麻烦,因此在工作中,我一直把模板当作一种宏来使用,当然我确实忘记了很多模板的高级技巧,即使知道,我也会尽量避开,模板的作用在于可以帮助我们快速地生成代码,比如教科书的例子:
1 2 3 4 5 | template < class T1, class T2> bool Max(T1 t1,T2 t2) { return t1 > t2; } |
这样无论我们使用的是float或者int,模板都能帮我们生成代码,但是,一旦模板使用开始复杂化,带来的将会是令人晦涩的代码,有兴趣的可以去看看我上面说的这本书,或者STL和BOOST里面的很多技巧,这种戏法对于写基础库的或许需要,但是对于我们工作中,我想还是尽量少用,据说BOOST在C++ 0X之前就已经实现了lambda,惰性求值之类的,网上也有人利用C++实现了反射机制,但是我想,如果语言本身不支持,我们应该去写一些工具来自动生成代码,而不是利用一些戏法来实现,特别是模板
宁愿多写几行代码,也不要去使用一些别人难以看懂的技巧来实现
设计模式中有一些模式是使用多态的,多态是在运行时决定要调用哪个类的,虽然很多人说会降低效率,但是我觉得在现代来说这种效率并不是我们所该关心的,多态能导致的一个问题就是在写成库的时候的问题,具体看这里避免使用虚函数作为库的接口
继承,http://kbasm.iteye.com/blog/1012547,对于继承我觉得并没有什么可以批判的,我觉得合适地选择而非滥用继承,特别是多继承和虚继承最好别用,在现代的高级语言里面,如C# JAVA已经废除了多重继承,一旦C++里面觉得你需要用到多重继承,基本要重新设计类的结构了
封装实际上我觉得更多的事情是在做隔离,在大部分模式中,大部分代码都在隔离原有的代码,将A代码和B代码给隔离,中间件只是一个代理,很简单,因为我一直觉得所有的设计模式都可以归结于代理模式
无论是设计模式还是面向对象,更多的是在做类之间的管理,似乎很多人忘记了编程的本质是对于数据的操控,数据结构+算法=程序,虽然很多人都能说出这一点,但是至今很少的书能专门讲这一部分,面向模式的软件体系结构有一卷就是专门讲这个的
如果要去关心设计模式,不如去关心数据的管理,这对于程序才是最重要的,写了这么多的代码,总觉得无论是设计模式还是面向对象都是虚的,设计的本质就是管理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述