编程思维训练(一)

最近以提问的形式发了几条关于编程思维的微博,有的获得了粉丝的响应,有些却无人问津。今天突然想到可以将我对这些问题的思考整理成一篇博文,以便与大家分享。另外,我计划以“编程思维训练”为名写一些系列文章,希望通过这类文章与读者分享我在编程活动中的一些思考。

问:有一对内存管理函数MemAlloc和MemFree,使用形式分别是:分配时为“void *p = MemAlloc (6)",释放时为“MemFree (&p)”。你能看出什么问题吗?有什么建议?
答:一谈到内存分配与释放函数,我们很自然地会想到来自C库的malloc和free函数。然而,MemFree与free在入参类型的定义上却存在很大的差别,前者需要传入的是指针的指针,而后者所需的却是指针。由于MemFree函数的入参形式与free存在区别,这就容易造成使用者容易因为忽视这种区别而在初次使用时犯错。

尽管MemFree的函数参数定义成指针的指针存在一定的好处 — 可以在MemFree函数中对所释放内存的指针变量置NULL,但由于它违背了malloc/free的使用常识,因而不可取。我的建议是,定义API名称时,应尽可能符合“常识”。

问:malloc与free是C库中用于从堆中分配和释放内存的函数。这两个函数在命名上有什么问题?如果给你重新命名的机会,你会如何做?
答:很显然,malloc函数是“memory allocate”的简写,那相应的内存释放函数应是“memory free”,如果采用一致的命名,free函数的名称应是mfree。因此,C库中的malloc/free函数存在命名一致性问题。

问:在Linux操作系统中,所有的外设都位于/dev目录之下以文件的形式进行管理的,能否将socket也纳入到/dev目录之下呢?如果是你,你会如何做?为什么要这样做?
答:将外设放入/dev目录,使得在Linux中操作外设(或设备)与操作文件是相似的。这种设计一方面减少了API的数量,另一方面,使得程序员很容易掌握设备的操控编程。然而,Linux中的socket却采用了完全不同的设计实现。

在Linux中如要打开一个socket,则必须调用socket函数,且在函数中指定是流类型(stream),还是数据报类型(datagram),以及所需打开的端口号。然而,从TCP/IP协议的角度来看,我们知道“流”对应的是TCP协议,而“数据报”对应的是UDP协议。这种映射关系尽管简单(但并不易懂),但不可避免的是,它仍然引入了“映射”这一行为(复杂化了)。

如果将socket也按目录的方式进行管理,那么打开一个socket也可以用open函数,且目录结构可以考虑采用协议名进行组织。比如,采用“open (“/net/ipv4/tcp/3344”, O_CREAT)”的形式打开一个端口号为3344的TCP socket,而采用“open (“/net/ipv4/udp/3344”, O_CREAT)”的形式打开一个UDP的socket。很显然,这种方式并不需要引入“流”与“数据报”的概念,且简少了API的数量。总体说来,基于目录结构的socket设计将使得Linux在概念上更加一致。

实际上,目前的Linux中socket也是一种类型的fd(file descriptor),尽管造成目前的现状有很多历史原因,但它仍可以向前迈进一步。

时间: 2024-10-01 15:19:07

编程思维训练(一)的相关文章

编程思维启蒙(Raptor)课程主页

查看贺老师更多课程- [关于Raptor] "没有思路",这是不少程序设计初学者挂在嘴边的问题.在用编程解决问题的过程中,让自己具备编程的思维,这是我一直倡导的做法,不少同学坚持了,也找到了感觉. 有没有好的方法让同学们具备编程思路?传统的程序设计学习,是"学语言"与"学程序设计"同时进行的,这种学习路径的"认知负荷"的确有些大.如果能在不涉及语言细节的情况下,能够对编程思路进行训练,那就好了. 这样的方案是有的.2013年8

编程基本功训练:流程图画法及练习

对于"程序设计"的工作,许多初学者的理解就是"写代码".同样,新手们苦恼的问题是,他们只会"写代码".当接到一个新的任务,不少人总是在第一时间就爬到键盘上去敲代码.敲着敲着,就把自己绕糊涂了.头晕脑胀地坚持下来,程序能运行,阿弥托佛,赶紧撤.这样做出的程序,并不可靠. 在程序设计中,最重要的不是写程序,而是设计.就像建筑.机械等行业的要画设计图.施工图,程序设计的思路也有必要用图的形式画出来.画图的过程就是思考的过程,由于其直观性,画图的过程本身

CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括使用方式,及相关介绍,都容易引人误解. 为此,我打算重新写个系列来介绍最新的版本,让大伙从传统的ORM编程过渡到自动化框架型思维编程(自已造的词). 于是:这个新系列的名称就叫:CYQ.Data 从入门到放弃ORM系列 什么是:CYQ.Data 1:它是一个ORM框架. 2:它是一个数据层组件. 3

标准-考察Developer对面向对象编程思维的理解

问题描述 考察Developer对面向对象编程思维的理解 需求:某工厂需要一个 产品检测系统,需对每个产品配置该物料的的标准检验单及其对应的标准数据,在根据生产的产品检验单和标准检验单对照,判断该产品是否合格 注:工厂可能生产多种产品 解决方案 产品种类-产品指标 1对1 产品种类-产品标准单 1对1 产品-产品检测单 1对1 产品种类-产品 1对n 产品标准单-产品标准数据 1对多 产品检测单-产品检测数据 1对多 说明一下产品指标,是需求中没有描述的: 产品指标描述了产品需要检测哪些项目,产

由扩展方法引“.NET研究”申出的编程思维

1. Helper大爆炸上海闵行企业网站设计与制作g> .NET Framework为我们提供了丰富的类库,但是这并不是万能地,在大部分的时间,我们都需要为我们的项目特殊定制我们的通用类库. 常常,我们都可以构造一个类,类里封装一些方法.但是对于很多时候,我们并没有办法提取出这样一个类,举一个小例子,我们在很多时候,需要把url给保存到数据库里,作为一个唯一标识,但是我们知道url所占空间很大,如果用url来建立索引的话是非常耗费空间,而且影响效率的,那么我们最常用的办法就是把url做一个Has

一起谈.NET技术,由扩展方法引申出的编程思维

1. Helper大爆炸 .NET Framework为我们提供了丰富的类库,但是这并不是万能地,在大部分的时间,我们都需要为我们的项目特殊定制我们的通用类库. 常常,我们都可以构造一个类,类里封装一些方法.但是对于很多时候,我们并没有办法提取出这样一个类,举一个小例子,我们在很多时候,需要把url给保存到数据库里,作为一个唯一标识,但是我们知道url所占空间很大,如果用url来建立索引的话是非常耗费空间,而且影响效率的,那么我们最常用的办法就是把url做一个Hash来作为索引的替代品. 这个时

Scalaz(22)- 泛函编程思维: Coerce Monadic Thinking

 马上进入新的一年2016了,来点轻松点的内容吧.刚好年底这几天抽空重审了一遍,这时才真正认识到让一个老资格OOP程序猿去编写一段FP程序时会发生什么事情:他会用FP语法和数据类型按照OOP的思维编写程序.其结果就是一段尴尬的代码,让人看得不知怎么去形容,更不用提FP程序的精简高雅了.我在前面博文的示范程序正是落入了这个OOP思维陷阱. 我们先把源代码搬过来看看: package Exercises import scalaz._ import Scalaz._ object reader3 {

C语言实践(2016级第5周):编程思维启蒙

[项目1-Raptor程序设计]用Raptor编写程序,完成下面的任务 (1)输入圆的半径,计算并求出圆的周长. 参考解答 (2)输入矩形的长和宽,计算并输出矩形的面积. 参考解答 (3)从键盘输入任意整数N,当N小于或等于0时显示"low!",否则显示"high!" 参考解答 (4)编程序,计算下面函数的值并输出(x取整型即可) 参考解答 (5)从键盘输入x的值,根据下面的公式计算并输出y的值. 参考解答 (6)编程序,求sum=1+2+-+100 参考解答 (7

高等代数思维训练-从一道例题看高等代数的常用方法[河北师范大学麻常利教授]

  链接: http://pan.baidu.com/s/1bn4jOlD 密码: w6kg   这是pdf文件,网上随便就可以找到阅读器,比如 foxit reader 等绿色软件.