c++逻辑层大量使用函数对象是否符合面向对象?

小竹z 2017-06-07 09:17:05
最近看一个项目源码,使用了boost asio作为网络库。业务逻辑层也沿用了这种函数对象回调方式来编写代码,通过bind函数将类成员函数变为函数对象,有一个类负责管理业务请求消息到处理函数对象的映射,请问这种方式是否符合面向对象?至少我觉得变成了函数式编程了,而且过多暴露了类处理函数。
...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-06-08
  • 打赏
  • 举报
回复
引用 4 楼 zgxyz2010 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:] 面向对象只是一种编程思想。 再抽象的编程语言,最后不都变成汇编代码了吗?我们完全可以说汇编语言是面向对象、脚本化、动态化、泛函化、并行化、分布化的语言。 [/quote确实是一种思想,但是这种思想要落地,要反应到代码中、反应到代码结构中。
是吗?! 请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。 意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。 试对比 图书馆(对图书的分类够结构化了吧) 和 搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索) 哪个处理信息更方便、更高效。 所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。 结构越复杂,越难修改,越难除错。 有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。 程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George 前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题;他觉得前同事们应该用这些问题来问自己;实际上不管在哪里工作的开发者们都应该经常问问自己这些问题: ◆“要保证这个问题不会再出现,我该怎么做?” ◆“要想少出些Bug,我该怎么做?” ◆“要保证Bug容易被修复,我该怎么做?” ◆“要保持对变化的快速响应,我该怎么做?” ◆“要保证我的软件的运行速度,我该怎么做?” 如果大多数团队都能不时问一下自己,必定会从中得益,因为这些都是真正强而有力的问题。
小竹z 2017-06-08
  • 打赏
  • 举报
回复
看来没多少人对这个话题感兴趣,可能是大家对面向对象理解不一样又或许面向对象其实只存在于书本或闲暇闲聊领域,实际中真的是不管黑猫还是白猫,抓到老鼠就是好猫
sdghchj 2017-06-07
  • 打赏
  • 举报
回复
基于事件的系统除了观察者模式还有什么更好的吗? 函数对象包括lambda相对于之前的类接口指针或者回调函数而言,使用上更方便,代码紧凑一点,虽然用多了代码比较臃肿,看自己怎么用了。 nodejs框架比这个狠多了,websocket基本全是这样。
赵4老师 2017-06-07
  • 打赏
  • 举报
回复
面向对象只是一种编程思想。 再抽象的编程语言,最后不都变成汇编代码了吗?我们完全可以说汇编语言是面向对象、脚本化、动态化、泛函化、并行化、分布化的语言。
小竹z 2017-06-07
  • 打赏
  • 举报
回复
[quote=引用 2 楼 zhao4zhong1 的回复:] 面向对象只是一种编程思想。 再抽象的编程语言,最后不都变成汇编代码了吗?我们完全可以说汇编语言是面向对象、脚本化、动态化、泛函化、并行化、分布化的语言。 [/quote确实是一种思想,但是这种思想要落地,要反应到代码中、反应到代码结构中。
小竹z 2017-06-07
  • 打赏
  • 举报
回复
引用 1 楼 Cy_Chance 的回复:
面向对象只是一种思考方式,让程序更具可读性和系统性,有的语言特性囊括了这种思想,但这也只是那语言的某一方面而已。语言特性和语言的拓展(例如这里的boost)比这一个特性丰富得多。你只是选择这些提供的资源达到一个需求目的,你可以让你的程序都面向对象,但是有更好的东西为什么不用喃? 简单的说,不要为了面向对象而面向对象,运用语言特性和成熟优秀的东西达到自己的目的。
我的理解boost只是属于网络层东西,不应该拿到业务层呢。在做程序的时候,往往需要先设计比如画个类图,如果使用函数对象,那程序展现出来的结构就跟类图中呈现类之间关系不是很对应,代码中将会看到的大量callback形式,变成了消息->处理函数,这种关系了
C4Fun 2017-06-07
  • 打赏
  • 举报
回复
面向对象只是一种思考方式,让程序更具可读性和系统性,有的语言特性囊括了这种思想,但这也只是那语言的某一方面而已。语言特性和语言的拓展(例如这里的boost)比这一个特性丰富得多。你只是选择这些提供的资源达到一个需求目的,你可以让你的程序都面向对象,但是有更好的东西为什么不用喃? 简单的说,不要为了面向对象而面向对象,运用语言特性和成熟优秀的东西达到自己的目的。

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧