怎样去平衡C++项目的设计?

简介:
   前些日子,再看了看一个自己曾经编写过的项目的源码。此前,由于处理核心的增加,实践中发现的问题不断地参入代码,某些模块的代码已经相对混杂,一直想找时间重构但是苦于没有时间。于是,由另一个同事重构后交至我手中。从大局上看代码,确实做到了高度的解耦,也引入了设计模式的一些概念,代码结构比较清晰。可是仔细跟踪分析后才发现,和我重构的思路不太一样,至少要比我想到的要多两层,而且其中复杂数据结构的大量应用,导致我再看代码确实比较费力,调试跟踪往往要推进好几层才可以进入主要的逻辑处理层。心中不禁产生了一个矛盾,是自己想得简单了,还是同事过度设计了。带着这个疑问把问题抛到了“知乎”。下面给大家看看几条讨论:

孙立伟,17岁开始玩电脑,并以此为生。十年软件开…:
    首先从语言层面来说,Java语言比C++语言封装得更好,比较纯粹的面向对象语法和一套标准的开发库,大大简化了开发的难度。而C++语言比较底层,再加上它需要对C保持兼容,导致使用C++语言做开发时,对以前使用C开发,刚刚转入C++没几年的人,很难把思路从面向过程转向面向对象上来,这是我在实际工作中常常看到的现象,例如频繁的使用单例模式,习惯使用printf, sprintf,习惯使用FILE和宏,参数全部使用指针等等。不过,这里无意引起一个老套的争论,C++好还是Java好,或者面向对象好还是面向过程好。我个人的观点是,任何一种计算机语言都有解决问题的能力,针对不同的项目,不同的问题域,甚至是针对个人习惯,采用哪种语言都行。说句极端的话,你要使用脚本如JavaScript, Python, Ruby来开发,只要你写得好,也是可以的。区别可能只是在于具体到某个项目上值不值得,或者可不可行的问题。
    其次,我们码农做程序开发,有一个很大的误区,认为某项特定的技术(如设计模式、C++模版、多线程技术)能够解决所有的问题。有一句话是这样形容的,“手里有一把锤子,看哪里都有钉子”。尤其是刚刚学习到的知识,总是有一股冲动,一有机会就想去使用它。说实话,本人也是如此。但是,从软件项目的角度来看,这种做法是十分有害的,这里就不展开谈了(时间太晚了Zzzzzz....)。
    想要对业务逻辑解耦,必须对代码进行进一步的抽象,但是并不意味这抽象程度越高,代码逻辑就会变得复杂,也不意味着代码越来越难读。代码的复杂程度应该和业务逻辑的复杂程度有一个正比的关系。只有需求复杂度上去了,代码才应该越来越复杂。为了抽象而抽象,为了解耦而解耦是没有意义的。
    总之一句话,代码复杂,抽象程度高,并不意味着你的代码就理所当然的难以理解,变得很难读。关键还是在于设计功力和编码功力。

陈硕,Linux C++程序员,muduo网络库作者,weibo.com/giantchen…:
    《 朴实的C++设计 》 http://www.iteye.com/topic/736269
    《关于Java开发不明白的一些问题》“ 解耦不过是一个用来迷糊人的手段,是追求过度设计的人显摆的工具 。只有真正的内聚,没有绝对解耦,但凡你在某个地方切断联系,那么你必然会在另一个地方重新产生联系” http://www.iteye.com/topic/947017

白顺龙,码农,使用C C++ java工作:
    多层封装,采用 复杂 的数据结构,代码更直观,易理解-----自己容易理解,不等于别人容易理解,或者你再过一段时间看看,说这话的人基本都是思维没有扭转过来。习惯了局限于自己代码习惯,可能看优雅的代码都不习惯。
引入(设计模式)后虽然做到了高度的解耦,------设计模式不是为了解耦,解耦只是带来的效果,关键是清晰的功能分割,容易扩展。但基本不变的东西,或者本来就是耦合的东西就不需要引入一些模式。
    但是代码逻辑复杂了,怎么平衡好?-----我问你,加法复杂还是乘法复杂,微积分呢,人们有了加法为何还要发明乘法这样复杂的东西? 从1加到N 你愿意一个一个加起来得出结果,还是用(1+n)*n/2直接得出结果?
    不要把自己停留在小学生水平,觉得初高中的东西复杂,那样你永远只能做小学生的题。到了初中,乘法就是小孩子游戏,根本不需要特别注意什么时候用乘法,到了大学生水平,知道什么时候该用微积分,简单的方程是再显然不过的事情。该用什么数学工具就用什么数学工具。

余天升,看似工科生的文科生,计算机技术研究生
    如果不能平衡,我认为可以牺牲易用性,逻辑复杂一些也不要紧,以代码质量为先。有可能是你的设计模式选错了,尝试一下有没有一起解决的好方法。

Edwin,C++程序员
   “但是代码逻辑复杂了”又不是什么缺点,关键写出可复用性强而质量高的代码。
    要说到平衡的话,项目进度会有一个压力,会影响到代码质量吧。不过从长远看,质量高的代码还是降低成本的。

郑书清,系统架构师
    设计模式,能否发挥价值,还要看整个团队是否都能认同,并且掌握。
代码是写给入看的,人不爽了,就会破坏结构,最终导致无法维护。
    模式也是为了统一风格,关键还是看团队是否能达成一致标准,提高代码质量。

   很精彩的讨论,观点也都有自己的道理,大家会怎样平衡呢?
本文转自永远的朋友博客51CTO博客,原文链接http://blog.51cto.com/yaocoder/793035如需转载请自行联系原作者

yaocoder
相关文章
WK
|
11天前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
33 1
|
29天前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
244 3
|
2月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
40 3
|
4月前
|
Rust 测试技术 编译器
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
|
3月前
|
编译器 C++ 开发者
Visual Studio属性表:在新项目中加入已配置好的C++库
通过以上步骤可以确保Visual Studio中新项目成功地加入了之前已配置好的C++库。这个过程帮助开发者有效地管理多个项目中共享的库文件,提升开发效率。
83 0
|
4月前
|
算法 测试技术 C++
【C++高阶】掌握AVL树:构建与维护平衡二叉搜索树的艺术
【C++高阶】掌握AVL树:构建与维护平衡二叉搜索树的艺术
35 2
|
4月前
|
Java C++ 开发者
如何根据项目需求选择使用C++还是Python进行内存管理?
【7月更文挑战第2天】如何根据项目需求选择使用C++还是Python进行内存管理?
47 0
|
6月前
|
存储 C++ UED
【C++】飞机大战项目记录
通过上面的设计,我们实现来看飞机大战的主要功能
89 4
|
6月前
|
存储 机器学习/深度学习 算法
【C++入门到精通】C++入门 —— AVL 树(自平衡二叉搜索树)
【C++入门到精通】C++入门 —— AVL 树(自平衡二叉搜索树)
37 2
|
6月前
|
存储 算法 编译器
【C++入门到精通】C++入门 —— 红黑树(自平衡二叉搜索树)
【C++入门到精通】C++入门 —— 红黑树(自平衡二叉搜索树)
35 1