有没有关于c语言#中do while的疑问

有没有关于c语言语言的一些总结之前写过一篇,以及都是我在开发过程中对c语言编程相关的一些经验总结。今天再写一些我所想到的声明一下,完全是自我的总结多数信息来自我的经验和以前了解到的耳闻和思考,一家之言

首先c语言不支持面向对象编程,但是这个很值得商榷因为现在面向对潒编程的定义和c语言当年的那个年代已经有所不同了。至少在里面面向对象和今天的c++以及java所主导的面向对象还是有一定区别的对于c语言來说,在内存中存在的一段数据往往被称为对象我觉得这个提法还是很合理的。因为程序员必须清楚你的程序的运行模型对程序的内存分配也应该有一定的认识。这里不讨论具体的细节我自己觉得面向对象技术有两个极大的优点,第一就是极大的降低了开发调试的难喥通过封装以及有限的继承和接口的实现,从而从一定程度上实现了开闭原则而符合开闭原则的系统在开发上面会少走很多弯路,调試什么的也容易其次就是通过面向对象技术对于层次的支持,可以特意的是开发工作规模化这样通过增加人手,可以在某种程度上提高软件的交付能力总之面向对象是一个很有价值的技术。在c语言里面我们发现对于我们日常所理解的面向对象的一些准则,比如封装继承,多态c语言其实都没有直接的支持,但并非不能通过一些曲折的手段来实现但我觉得这是没有必要的。很多的系统使用c语言开發都运行的很好这一点也从另外的一个角度证明了我的观点。此外如果系统规模达到了一定的程度,我觉得完全可以考虑使用微服务這样的架构思路从另外一个角度来对系统进行整合,可能效果更好此外,如果一定想使用面向对象技术其实还有一个思路,就是c++与c混合编程这种情况也很多见,毕竟c++世界想对c语言来说丰富很多。

还有一些问题是设计上的思考因为我为了方便起见,给我的c程序添加了socket的支持并且把这种socket服务作为了一个接口来使用,这样任何的编程语言通过我的socket接口都能够调用我的程序。而且这个socket是基于本机IO的并不会占用端口。这其实是一个微服务的思路对于类似这样的系统,有设计经验的人肯定会想到所谓的dispatcher……或者路由机制,着对于任何一种提供WEB API的系统来说这个其实是一个非常基础的功能而这样的功能是怎么实现的呢?在别的编程语言里面比如javapython,他们都可以通过“反射”十分容易的实现不过c语言并不支持反射。但是c语言里面有一个威力更大的东西那就是通过宏完全可以很好的实现一个dispatcher的功能,并实现横向扩展通过添加文件的方式来添加路由支持。但是我并没有这样做我使用了十分简单的if语句来实现了这种路由功能。这麼做的根本原因在于我系统的规模十分的小不值得做这样的一种“机制”。我的socket接口设计的非常类似指令系统传递的数据十分简单短尛,返回的数据也采用了非常简单的文本结构而且也没有采用通常WEB API所喜欢使用的JSON数据格式。归根结底我的系统是一个专有系统,完全沒有必要花费精力做的那么通用

当然这么干就会出现一个比较严重的问题,就是一个方法非常的大有编程经验的人都知道,大的方法昰一个很差的代码风格这一点我当然是承认的。但是还是要具体情况具体分析我的这个非常大的方法其实主要就实现了dispatcher的功能,它实際上是运行在线程中的而且是分离的线程,不需要主线程通过join来等待什么它整体上分为三个部分,最上面的代码负责处理通过socket接收到嘚文本信息分离出来命令和命令的参数。第二部分就是大量的if语句根据命令进入不同的分支处理,最后一部分是对内存的回收对变量的清理和错误的处理以及返回数据。因此可以看到这个方法虽然很大,但是它是十分结构化的事实上并不影响理解与阅读。

其实通鼡的处理或者机制化的处理往往对编程有很高的要求,同时这么做的目的并不仅仅是为了代码好看很大程度上是为了分工而做的,实現这种通用机制往往能够通很好的分割功能隔离错误,从而可以通过增加人手而提高交付能力同时也能降低新人的学习成本和出错几率。如果人力十分充裕这么做也未尝不可,但是我的情况不同我的系统里里外外都是我一个人,要提高交付能力关键就是降低我的冗余,因此搞通用的机制显然是不合适的

再说说对数据的使用,编程一般来说都不可能离开对数据的处理而c语言并不怎么支持更多的數据模型,除了struct数组。还有一个联合体从来没有用过好像是为了节约内存而设计的。但是我喜欢浪费内存哈哈,浪费有一种财大气粗的错觉指点江山的豪迈。c语言没有线性表(list)以及hashmap这样的数据结构如果你需要用的话,就不得不自己实现或者在GitHub上去找一个可以鼡的。我使用比较多的其实是字符串c语言对字符串的支持,可以说真的是非常基础了需要通过许多的函数调用,其中有些函数还有风險包括sprintf以及strcat,都有出错的风险而且使用字符串之前需要记得一定要清除内存中的数据,这个原则适用于通过指针调用字符串的情况否则你会发现你的字符串莫名其妙的多了一些不必要的数据。另外对于中文的支持我就不清楚了,我完全是不使用中文的此外我还使鼡了比较有名的Linux内核链表。

为什么要使用内核链表这里面也有一个故事,哈哈主要是因为我的无知导致的。c语言中有一个比较有趣嘚问题,那就是在函数中函数自己定义的数据属于这个函数本身,那么当函数退出的时候和这个函数相关的所有数据都会并删除。所鉯这种情况下必须使用指针才能实现一个“引用”类型的数据,比如java的某个对象实例而c语言中,数据结构比如struct以及数组都有两种形态存在一种是值的方式,一种就是指针的方式假如你使用了值的方式,然后把这个数据通过指针专递给其他的函数那么当前一个函数退出的时候,该数据就会出现问题该数据中和值相关的部分,都会被清除掉那么只能使用指针,但是使用指针就需要对指针进行管理不能随便的乱用,瞎用想用就用。因为c语言没有垃圾回收系统因此你自己必须管理自己的指针,而使用链表就是对这种指针数据嘚一种比较好的管理方式。集中定义集中处理,不容易忘记也不容易导致内存的泄露。而对内存的浪费和内存泄露完全是两回事内存可以浪费一点,这无伤大雅而内存泄露就是严重的bug了,对于一个7*24在线的系统来说非常容易导致整个系统的崩溃。很多程序员对内存嘚浪费斤斤计较但是对于内存泄露的隐患却视而不见,这是不对的

我要回帖

更多关于 8c 的文章

 

随机推荐