为什么C/C++开发人员很少明确用设计模式的思想交流,而Java开发人员非常重视用设计模式的“官话”进行交流?这是近期有人问我的问题。
一些激进的观点是C不适合做大的工程,只能捣鼓小程序,所以遇不到复杂的设计场景。这显然是片面的。在C中,同样会遇到涉及类似生产者、消费者吞吐、线程追随、轮询等等场景。只是较少看到C项目文档中出现“基于代理模式模式实现了数据缓冲器向A模块的功能传递”的论述。
其实不光是C,强大一点的C++也类似。开发者在面试时,也很少被专门问到设计模式的问题。C开发者在交流时不喜欢用设计模式的官话,而会用具体语境来交流,比如:“信号量sWatermark在水位达标瞬间被激活,触发UDP队列处理。线程Dealer会处理1/4水位以上的所有数据。”。
反倒是Java开发人员会非常重视用设计模式的官话来交流,比如“这个类库采用了适配器模式解决与你们平台的兼容性问题”。我觉得这是一种良好的习惯,使得双方很快就能理解问题的全貌。设计模式是对程序员经验的总结,进行归纳后形成的方法论。使用这种方法论指导开发工作,能够迅速帮助程序员成长。
谁知道这是为啥子呢?
我感觉你的理解是片面的。
首先,C 是面向过程的程序设计,语言的本身就注定了无法想C++、Java 那样通过灵活的对象来进行各种引用,到后面我们也可以看到C 中struct 也慢慢的偏向了C++ 风格,在struct 中添加一些函数指针,方便struct 的指针变量进行引用,这些在kernel 中尤为明显。
另外,所谓的设计模式设计针对的是面向对象的一种程序设计,四人组的设计模式其实是基于C++ 开发,不知道我看的书是不是盗版,里面是实例大多数都是C++ 实例。
用原文的话:
The design patterns in this book are
descriptions of communicating objects and classes that are customized to solve
a general design problem in a particular context.
e. The standard way to inherit an interface
in C++ is to inherit publicly from a class that has (pure) virtual member functions.
Pure interface inheritance can be approximated in C++ by inheriting publicly from
pure abstract classes. Pure implementation or class inheritance can be
approximated with private inheritance.
那,之所以说你片面,其实我的理解是,当我们在进入C++ 开发之前,都会花费大量的时间在设计上面,流程的设计、功能的设计、代码设计、测试模块的设计等等,只有搞定了这些前提,才是我们开发人员动笔的时刻。而这期间的代码、框架绝对离不开设计模式,好的设计模式会为后期的测试、维护等留下很多的可能的buffer。
所以,无论是C++、Java 对于设计MVC 相关的、或面向对象相关的,在开发过程中都离不开设计模式。。。
此上,只代表个人的鄙见,也希望路过的大佬一起来探讨~~~但勿喷,心理防线差~~~
C/C++编写的大多是系统级、功能型的代码,很多甚至连显示界面都没有,不适用于设计模式;而Java开发的大多是涉及数据库、显示界面/页面的应用,适用于设计模式技术。当然了,如果有人用VC开发一款可视化的应用软件或者信息系统,也可能会用设计模式技术,所以呢,主要是因为所写代码功能的缘故,而非语言的缘故。
市场环境导致的,资本为了圈钱, 导致大量BS架构程序需要更短的更新周期,需要快速更新,就需要大量框架和模式做中间的适配桥接, 总不能每家一个小功能就到处各种地方的更改代码,然后延长开发周期,失去市场,公司倒闭,所以大量应用各种模式, 一个东西不好使了 通过模式快速更换,快速迭代,
C/C++ 团队级别的项目 大部分都是底层软件, 一年一版更新,都没关系, 而且上层开发者也不希望底层软件频繁更新导致他们频繁适配, C/C++也是有各种模式的 只是模式在C的开发中 不是主要的问题
设计模式的目的是提供可拓展性和可维护性。
C/C++开发的项目,大部分都是固定的系统,针对具体的需求,解决的大部分是一些业务逻辑,很少用到设计模式。
但是Java就不同的了,Java的框架必须适应不同的项目,能适应各种不同的环境,具备高弹性和拓展性。因此,设计模式在Java中经常见到。
在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。
四位作者合称 GOF(四人帮,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则。
个人拙见,设计模式在C++应该是有的,但是在C应该不大会说,感觉设计模式里面很多都是面向对象的思想。
1,在C++中,其实也有好些地方用到设计模式的,比如单例、工厂、观察者访问者、命令模式等。多见于后台服务程序中。
2,在C中,也可以模拟实现面向对象中的多态,就是对函数指针、指针列表的灵活运用。
我认为应该先明确下概念,设计模式与语言是两个东西。
设计模式:是人们为了代码的可扩展性、以及维护性等提取出来的一种方法,并不局限于那种语言。
普遍认为c是面向过程的语言,c++、java是面向对象的语言,无论是那种语言都会或多或少有相似之处,比如linux内核通过c语言实现,也可以通过函数指针实现出类似c++类的功能;
java多用于应用型软件,而c/c++多用于系统级别的软件,设计模式中如工厂模式、状态模式等等,每一种语言都可以实现,只是实现的成本不一样,有些语言实现简单,有些实现稍微复杂而已,至于为什么在java中更提及设计模式,因为系统级别的软件linux系统的架构你就可以参考了,没必要单独设计,当然c/c++用于应用代码的时候也会涉及设计模式,只是java做应用更多而已,所以提及的多。