热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

软件开发中的理想与现实(九)——三个臭皮匠,顶个诸葛亮

我说过要介绍一下项目组成员的,既然马上要真正开始做项目,那么互相好好了解一下还是很有必要的。项目组包括我一共四人,分别是realdodo(我)、chanjinn、wumaomao、Xop
我说过要介绍一下项目组成员的,既然马上要真正开始做项目,那么互相好好了解一下还是很有必要的。
项目组包括我一共四人,分别是realdodo(我)、chanjinn、wumaomao、XophiiX。
我自不用多说,在项目中以项目流程的引导者身份出现,同时也参与开发。
chanjinn是我的学长(噢,忘说了,我们四个都是学生),做过好几个项目,编过很多代码,嵌入式、Linux都有不少研究,做项目很有思想,唯一只是C++基础相对差一点,不过不要紧,软件开发中的经验和悟性很重要。他笑起来很可爱(^______^),就像括号里面那样,很和蔼可亲。
wumaomao是团队中少有的C++高手,了解不少C++和设计模式的东西,有很强的编程能力,绝对将是项目中的中坚力量。而且他写得一手好字,有深厚的文化内涵,令我十分佩服。
XophiiX是项目组中最年轻的同学,比我小整四岁,但在编程方面已经很有感觉,并且酷爱游戏编程,对新东西非常感兴趣。我见到他之后就马上感觉到后生可畏,他超过我只是时间问题了!
在团队中能够拉到这么强大的阵容真是十分难得,我相当知足了。不过,如果放到更大的范围内比较,我们都是菜鸟中的菜鸟,我们的能力还远没有值得骄傲的地步。这不,2月20日,项目正式开张的第一天,我们就遇到大难题了。
我们项目的第一个迭代目标是,将用ASN语法描述的消息转换成C语言数据结构。至于什么是ASN、为什么要自己开发而不用现成的ASN到C的转换工具、为什么不用yacc、为什么用C++开发这些功能等问题我都不想回答,反正我们有自己的理由(呵呵)。写一个最简单的例子,假设有下面的消息:
     A ::= SEQUENCE
    {
        b BOOLEAN,
        c INTEGER
    }
那么转换成C语言之后应该是:
    typedef struct tagA
    {
        BOOL b;
        LONG c;
    }A;
相信一看这个例子就能够明白,SEQUENCE和struct相对,BOOLEAN和BOOL相对,INTEGER和LONG相对,只要处理好这个对应关系就问题不大了。
根据这个想法,XophiiX提出一种设计(白板上画的草图,我把它稍微整理了一下):
第一版设计
当然,这是一种有效的做法,但是扩展性实在太差,因为ASN的语法可不比C语言简单!例如这个消息:
    Sample ::= CHOICE
    {
        b BOOLEAN,
        c INTEGER
    }
那么换成C语言之后应该是:
    enum Sample_E
    {
        I_B,
        I_C
    };
   
    typedef struct tagSample
    {
        ULONG ulIndex;
        union
        {
            BOOL b;
            LONG c;
        }choice;
    }Sample;
噢,这是什么东西,根本就没有办法简单的进行对应了!如果用刚才简单对应的方式来处理,这个系统真的就会变成一个怪物了!所以这个方案就被否定了,啊,XophiiX不要伤心,在最开始这是很常见的事情。
为了方便确定设计的方向,我根据需求画出这个系统最基本的处理流程图(好了,大家终于知道我有多么菜了):
第二版设计
但是我还没有想好如何把它变成可分解的类,所以就算大家都比较认同这样的流程也没有用,不过作为一个大体思路,起码有助于指明方向。
马上,我们就把上面这个做了一个精简,并准备对各部分进行细化。精简图如下:
第三版设计
大家心里都明白,最重要也是最麻烦的就是如何收集词元信息,但是如何做最好呢?不知道!眼看着上午就要结束,白板上的图画了又擦,方案往往提出几分钟就被否,然后所有人都陷入一种抓狂之中。
OK,it's lunch time。人是铁饭是钢,还是去休息一下吧。
午餐的时候大家都比较沉默,虽然我一直安慰大家,每个项目开始的时候都是这样的,设计的灵感会突然冒出来的,不过大家还是不太相信。
嗯,不管怎么样,灵感还真的就出来了。不知道是谁提出了一个“作坊”模型,让大家眼前一亮,简单的说就是,把处理ASN文件得到的词元当作零件,收集词元信息当作零件分类,修饰词元信息当作零件组装,输出C文件则是最终包装,那么“作坊”(就是收集词元信息)负责进货(得到零件)和销售(零件分类输出)。按这样的说法,为了进货,我们需要一个库存;为了分类,我们需要工人;为了管理工人,我们需要一个经理。他们的职责也很清楚,库存负责存放零件,经理负责根据库存情况划定工作范围并“雇佣”合适的工人,工人则仅仅专注于工作。他们的关系如下:
第四版设计
这个图并不详细,甚至有些明显地错误,但是我们已经可以按照中央的想法进行工作了!综合来看,现在可以把整个处理过程表达如下:
第五版设计
下面我们就可以针对这种设计,具体规定这几部分之间的接口了!在规定接口时我们发现,这个流程并不具有弹性,因为作坊必须知道它的顾客(修饰词元信息)的情况才能工作,而我们是想实现一个面向广大人民群众的作坊,所以我们引入了一个代理商来解决这个问题。嗯,代理商具体是什么呢?哦,直接用main来做这样的代理其实就可以了!
最终,今天的框架如下:
第六版设计
至于接口,我们也慢慢的一一确定,此处不再赘述。今天的晚餐吃得特别香。
好了,喘口气,今天收获很多,等会我们来好好总结一下。

推荐阅读
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • C语言的经典程序有哪些
    本篇内容介绍了“C语言的经典程序有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼*madebyebhrz*#include#include#include#include#include#include#include ... [详细]
  • C语言学习笔记—链表(二)链表的静态添加及动态遍历
    链表的静态添加及动态遍历我们知道数组中的数据存储是有序的,而链表中的数据是无序的但是存在某种联系使之组成链表。那么我们如果向一组数据中添加一个数据元素, ... [详细]
  • [置顶]        C++类的构造函数与析构函数的调用顺序
    1构造函数的调用顺序[1]构造函数按此顺序执行工作:按声明顺序调用基类和成员构造函数。如果类派生自虚拟基类,则会将对象的虚拟基指针初始化。如果类具有或继承了虚函数,则会将对象的虚函数指针初始化。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • 利用空间换时间减少时间复杂度以及以C语言字符串处理为例减少空间复杂度
    在处理字符串的过程当中,通常情况下都会逐个遍历整个字符串数组,在多个字符串的处理中,处理不同,时间复杂度不同,这里通过利用空间换时间等不同方法,以字符串处理为例来讨论几种情况:1: ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
author-avatar
一克拉白勺的眼泪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有