如何细化开发过程 [原]

我和一个研究生一起开发一个新项目。主要是读取gerber文件,并且要在屏幕上绘制这个文件,然后将该文件保存为0/1制的图形文件,工人利用给文件在光绘机上印刷为胶片,再利用此胶片制造电路板。我的主要任务是编写绘图部分和保存文件的代码,而那个研究生主要负责从gerber文件读取文件并将数据保存早一个定义好的数据链表中用于数据传递给我。开始工作很顺利,我已经可以绘制出大部分的图形了,(我自己构造的模拟数据),当我要开始做图形文件存贮的时候,那个研究生的朋友却突然告诉我,他那部分有问题,读取数据的代码经常出问题,而且很难调试。需要我过去帮忙。
   我到了他那里,看了一下他的代码。发现他的代码层次设计的不是很合理,主要是函数的功能比较复杂,代码段都比较长,试着运行了一下他的程序,发现各种问题很多,而且后时候连他自己也说不明白是怎么回事,针对这种情况,我认为主要是他的体系结构设计有问题。在问了一下他的开发过程,发现主要在实现的开始阶段,他没有做详细的分析,而又希望一下子完成任务,所有就胡子眉毛一把抓,将所有的问题都集中在一起解决,这样,问题的难度一下子增加了很多。
   针对这种情况,我决定放弃他原来的所有代码,带着他编写一段程序,帮他养成一个比较好的编程习惯。
首先是分析需求,因为我自己在编程的时候已经将所有的gerber的文件中数据元素分析的比较细致了,所有这部分的工作不是很重,只要将从网络上下载的gerber文件规范给他再讲解一下,他就明白了所有的gerber文件中数据定义,他犯的一个错误是虽然也用了很大的心思去琢磨gerber文件的格式,但对其中很多的细节问题了解的不是很细致,很多地方的数据定义是相互关联的。比如圆这个图形元素就分为实心圆和空心圆,而这两种圆的定义的数据个数,数据排列的先后顺序是不一样的。我们花了2个小时首先将所有这些图形元素的数据的表示方法都统一了(这里有几个问题需要大家注意一下,1要勇于放弃不好的代码,放弃自己编写的代码是一件很痛苦的事情,但实践证明这是很关键和重要的一步,重新编写代码往往比修改一个很糟糕的代码花的时间少,2对需求一定仔细,不能存在开发人员说不清楚的地方,凡是说不清楚的地方,就是实现的时候出问题的地方,3开发人员的表示方法一定要一致。我们用了两个小时统一对数据的认识和形成了统一的表示方法,对以后的交流有很大帮助。)
    然后是建立一个基本框架。由于程序比较简单,我没有写文档,而直接用代码实现,首先我编写了一个函数readgerberfile(GerberFirstpoint  *gerberpoint); gerberpoint是一个头指针,用于将所有的读取的gerber数据保存在这个文件中。函数体是这样的
{
    FILE *fp1=NULL;
    if(openGerberfile(fp1)==0){
        readGerberData(fp1,gerberpoint);
        fclose(fp1);
    }else{
        printf(“文件打开失败!/n”);
    }
}
   这个函数的主要做作用是定义我的主要工作内容,将文件的读取分为文件打开的文件读取,在这里需要注意的文件可能打开失败,所以一定要做错误处理------打开文件失败的处理。
   这个函数函数编写完之后,我做的下一个工作是利用其他的gerber制作工作,做一个简单的gerber数据文件。我做了一个只画一个圆的(注意几个问题,我先做一个gerber文件主要是验证我之后的代码是否可以运行,而只做一个圆是为了简化工作,没有必要上来就将所有的gerber图形都定义好,这样不但浪费时间而且难度也比较大)。接着我扩充了openGerberfile这个函数,这个函数比较简单就不说了,readGerberData的函数的扩充比较复杂,它的结构如下:
{
    int loop=0;
    string tempstring1 = “”;
    Gerberstruct *gerberstruct = NULL;
    while(readlin(fp1,tempstring1)){
        if(length(tempstring1)>0){
            处理一行数据函数(tempstring1, gerberstruct);
            if(gerberstruct != NULL){
                 将新建立的gerberstruct放到gerberpoint链表中(gerberstruct,gerberstruct)   
            }
            loop++
         }
         if(loop == 0){
             printf(“该文件为空文件!/n’)
         }
    }
}
这个程序主要从gerber文件中读取一行数据,如果文件一行数据都不存在或者不存在一行符合标准的数据,程序都可以检查出来,并提示用户知道(这也是一种错误处理,而且一般新的开发人员总会忽视这种情况。
下一步是扩充处理一行数据函数。这个函数主要是,先对读入的一行的数据进行词法分析,或的数据的类型,参数的多少,并构造出新的数据结构。其结构如下
{
   获得数据类型函数(tempstring1);
   if(是一个圆类型){
       构造一个圆的函数(tempstring1, gerberstruct)
   }else if(是一个线段类型){
       构造一个线段类型函数(tempstring1, gerberstruct)
   }else{
       非法的类型处理函数;
   }
}
这个函数,我第一次编写的时候只有圆类型和线段类型的判断,其他的类型没有加入,因为我主要是为了构造出一个框架,所以很多想类似的部分都省略了。但以后补充起来都很简单。所以可以先不写。另外大家也看到了这个函数也有一个错误处理函数,这个函数可以不写内容,但在调试的时候可以将该函数编写出来,在调试的时候可以方便你的错误定位。另外还是要提醒大家的是任何时候都要做错误处理,虽然有时候这种可能性不是很高,但这绝对是个好习惯,为什么用if, else if  而不有用case,我也说不太明白,原来一个老鸟告诉我要这样做,说结构比较好,估计他是吃过很多亏,所以我也养成了这个习惯。
下边的程序在扩充就是一些纯技术问题了,我这里不再细说了,我们用了2个小时基本确定了这个框架,后边的工作只是在这个框架上扩充了,这个部分的开发基本框架也确立了,
总结一下,首先要对需求进行比较详细的分析,不过系统是都简单,都可能有你不清楚的地方,检查的方法就是自己提问,看是否和开发有关的所有问题你都可以回答,(不要自己骗自己,否则你肯定吃亏),第二,不要太急于编码,先做框架设计,我之所以敢不先做设计一个是这个部分很简单,另外一个是12年的经验的积累,所以不要看一些靠同志不做设计,你也不做设计。先设计可以让你的代码更完善。通过设计可以让你的程序有一个比较好的架构,这样不用总是重构,而不断重构是新开发人员要花费很多时间的一个重要原因。第三将复杂问题简单化,简单化的方法两个,一个是将处理步骤逐步分解,开始的时候不要管下边的细节问题。新同志在开始这么做的时候容易考虑不周全,但做几次考虑问题就会全面了,会增加设计的成功率。另外一个是不要胡子眉毛一把抓。比如我做这个程序就只做了读圆这个类型的数据,其他类型的读取只要在适当的地方添加一些函数和对最后一个函数做一些修改即可,而这些函数的添加和修改对整体框架的影响都不是很大。至于增量开发和新版本发布,就不用在说了,我本身就是分了一个步骤,而且由于有了一个简单的gerber数据文件,不但可以测试,而且也可以发布新版本,我的版本分为几个,1个是可以读取文件(只要打开就算成功)2个是读出一个字符串(必须是正确的)3个是读取一个圆,并放到链表中。4个是读取好几个圆(当然需要修改gerber数据文件)5个读取含有线段的文件(多个线段元素,别忘了改文件),最后一个是,交叉含有圆和线段的数据文件。当我完成了第六个版本的时候,到了下班的时间,于是,我告诉哪个研究生,下边的都是他的了,我回家了,(不好意思)。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值