MOOC课程作业http://mooc.study.163.com/course/USTC-1000002006

软件工程学习总结

张伟--《软件工程(C编码实践篇)MOOC课程作业http://mooc.study.163.com/course/USTC-1000002006 

1、对软件工程的理解和学习软件工程的心得

         软件在当前世界发展迅猛,软件工程在我们开发软件的过程中显得举足轻重,都说程序员需要多动手实践,但是,作为一门理论,软件工程也同样有着重要的地位,所以我今年选修孟宁老师的《软件工程(C语言编码实践篇)》,学到的东西还是不少的。

        首先是对软件工程的理解:软件工程学是一门理论性较强的课程,一是它用分阶段的生命周期计划进行严格的管理,一个软件产品的生命周期可划分为若干个互相区别而又有联系的阶段。二是坚持进行阶段评审,每个阶段都要进行严格的复审,进行不断的停工或返工,实现软件生产工程化。三是实行严格的产品控制软件的不可见性是软件产品的固有特点之一。四是采用现代程序设计技术,根据软件生产工程化的需要,开发软件所用语言也多种多样。五是软件工程结果应能清楚地审查各阶段的任务彼此间应尽可能相对独立,这样便于逐步完成每个阶段的任务,能够简化每个阶段的工作,容易确立系统开发计划。六是开发小组的人员应该少而精为了使开发项目能在规定的时间内、不超过预算的情况下完成,成本预算和严格的管理控制就不可能被忽视,而开发小组人员成为项目成本预算中主要参数。

        学习孟宁老师的课后,知道了软件工程的作用,发展历史。后面又知道软件工程的开发模型:瀑布模型、增量和迭代模型、V模型等等。从why soft engineering 到software Testing

        受益匪浅,这个过程中,我学会了UML的建模,包括用例图,领域类图,时序图等等。同时线上的网易云课堂——《软件工程(C语言编码实践篇)》也收获很大,在线学习敲Linux代码,然后用git命令等等,都是之前鲜有的。内容上,学习了call back函数,可重用子系统,孟老师用很多形象的比喻(其中就有一家人早上起来抢厕所的例子)。总之,孟老师的课上着不乏味,且能学到知识。

        对这门课学习的最大的遗憾就是课程时间分配较少,没有能完全吸收老师上课的知识点和精华,就这样匆匆的上完了这短暂的11周的课程。

2、下面是我在实验楼的实验报告链接地址:








3、对代码层面的软件工程的理解

        软件工程本是一本理论的课程,外加上代码层面其实就会变的实际了,也就是在实践中加入了软件工程的思想。首先在代码的规范上,需要项目组统一格式,注意代码风格的原则:简明、易读、无二义性缩进、命名、注释等代码编排的风格规范。其次软件工程要求写出的代码要具备高内聚低耦合,要可靠,安全,易读,包容变化,这就需要在代码设计时对模块的理解要透彻,实验三就是在这个基础上体现软件工程的思想的,实验三中将linktable.h作为一个接口文件,一个模块单独的分离出去,以后在修改这块的需求是,只需要修改.h文件即可,可以省去程序员大量的时间。

linktable.h文件:


<span style="font-size:14px;">#define CMD_MAX_LEN 128 
#define DESC_LEN 1024 
#define CMD_NUM 8 
typedef struct DataNode 
{
    char cmd[CMD_MAX_LEN]; 
    char desc[DESC_LEN]; 
    int (*handler)(); 
    struct DataNode *next; 
}
tDataNode; tDataNode* FindCmd(tDataNode* head , char cmd[]); 
int ShowAllCmd(tDataNode * head);</span>

再比如实验五中,用callback增强链表模块来实现函数的回调,很清楚的记得老师说到卧底,对相关信息进行隐藏,然后对卧底进行补给,通过卧底调用函数。

最后是实验七,这个实验是将main主函数都设计为可重用子系统了,以后直接在ExcuteMenu()方法中调用main函数。这也是包容变化的一个体现。

ExcuteMenu()代码:

<span style="font-size:14px;">int ExecuteMenu() 
{ //InitMenuData(&head); //char cmd[81]; /* cmd line begins */ 
    while(1) 
    { //char cmd[CMD_MAX_LEN]; 
        int argc = 0; 
        char *argv[CMD_MAX_ARGV_LEN]; //char cmd[CMD_MAX_LEN]; 
        char *pcmd = NULL; 
        printf("Input a cmd number > "); //scanf("%s", cmd); 
        pcmd = fgets(cmd, CMD_MAX_LEN, stdin); 
        if(pcmd == NULL)
        { 
            continue; 
        }
        pcmd = strtok(pcmd, " "); 
        while(pcmd != NULL && argc < CMD_MAX_ARGC_LEN) 
        { 
            printf("%s\n", pcmd); 
            argv[argc] = pcmd; 
            argc++; 
            pcmd = strtok(NULL, " "); 
        } 
        if(argc == 1) 
        { 
            int len = strlen(argv[0]); 
            *(argv[0] + len - 1) = '\0'; 
        } 
        tDataNode *p = FindCmd(head, argv[0]); 
        if( p == NULL) 
        { 
             printf("This is a wrong cmd!\n "); 
             continue;
         } 
         printf("%s - %s\n", p->cmd, p->desc); 
         if(p->handler != NULL) 
         { 
              p->handler(argc, argv); 
         } 
    } 
}</span>

改写ExcuteConfig

int MenuConfig(char *cmd, char *desc, int (*handler)(int argc, char *argv[])) 
{ 
    tDataNode *pNode = NULL; 
    if(head == NULL) 
    { 
        head = (tLinkTable *)CreateLinkTable(); 
        pNode = (tDataNode *)malloc(sizeof(tDataNode)); 
        pNode->cmd = "help"; 
        pNode->desc = "Help List"; 
        pNode->handler = Help; 
        AddLinkTableNode(head, (tLinkTableNode *)pNode); 
} 
    pNode = (tDataNode *)malloc(sizeof(tDataNode)); 
    pNode->cmd = cmd; pNode->desc = desc; 
    pNode->handler = handler; 
    AddLinkTableNode(head, (tLinkTableNode *)pNode); 
}

编写test.c文件:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include "linktable.h" 
#include "menu.h" /* int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt; */ 
int Quit(int argc, char* argv[]); 
int main(int argc, char* argv[]) 
{ 
    MenuConfig("version", "Menu Program V3.0", NULL); 
    MenuConfig("quit", "Quit from Menu Program V3.0", Quit); 
    ExecuteMenu(); } int Quit(int argc, char* argv[]) 
{ 
    int oc; 
    char *b_opt_arg; 
    while((oc = getopt(argc, argv, "cl:\n")) != -1) 
    { 
         switch(oc) 
         { 
              case 'c': 
              printf("Clean Success,exiting\n"); //delay(2000); 
              sleep(2); 
              break; 
              case 'l': 
              b_opt_arg = optarg; 
              printf("Log :%s\n",optarg); //delay(2000); 
              sleep(2); 
              break; 
              case '\n': 
              break; 
         } 
    } 
    exit(0); 
}


名词解释

这里解释下上面的几个名词:

1、可重入函数:可重入函数是线程安全函数的一种,其特点在于它们被多个线程调用时,不会引用任何共享数据。

2、线程安全:一个函数被称为线程安全的(thread-safe),当且仅当被多个并发进程反复调用时,它会一直产生正确的结果。如果一个函数不是线程安全的,我们就说它是线程不安全的(thread-unsafe)。我们定义四类(有相交的)线程不安全函数。

3、他们的关系:

可重入和线程安全(Thread-Safe)是两个不同的概念:可重入函数一定是线程安全的;线程安全的函数可能是重入的,也可能是不重入的;线程不安全的函数一定是不可重入的。

名词解释参考:

http://blog.sina.com.cn/s/blog_a9303fd90101dilj.html

http://www.cnblogs.com/xiangshancuizhu/archive/2012/10/22/2734497.html


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值