文档章节

关于面向过程编程的一些思考

AlexTuan
 AlexTuan
发布于 2016/12/07 21:45
字数 945
阅读 28
收藏 0

关于面向过程编程与指针的一些思考

长期以来,虽然有C语言的基础,但对C的使用主要停留在书面例子的基础上,没有复杂的功能和调用关系,因此,对面向过程的理解并不深刻。而使用java、js编写功能的时候,通常都是面向对象的思想。

在本例中,会有大量使用指针的场景,使得多个函数作用于同一个变量,C中没有成员函数的概念,函数是公有的,靠指针区别变量。这一点也让我有些不适应。

既然是一些思考,并没有刻意组织结构,会非常杂乱无章,请看到的朋友谅解。

在开始阅读教程的时候,函数与函数之间的调用、输出都感觉异常的别扭。下面逐步的分析下这个程序。如果有同道朋友看到了这篇博文,请配合摘要中github库的代码阅读。

程序主要做了哪些事?

在教程中,包含一个解析库,和一个单元测试,单元测试会统计:

  1. 执行了多少次测试
  2. 通过了多少次
  3. 通过率
  4. 返回一个标记

解析库是实际上执行解析动作的部分,主要包含:

  1. 根据json的标准去分析传入的字符串
  2. 根据不同的数据类型,讲解析后的结果放入json结构体

程序执行过程

单元测试是怎么工作的?

本教程中,单元测试主要包含一个基础的比较和信息输出函数(宏),以及一个在此基础上的不同形式的比较函数。 单元测试会调用实际的处理函数。

测试解析string类型json值的流程

test_parse_string函数

这个函数是测试分割string单元的入口:

static void test_parse_string() {
  TEST_STRING("", "\"\"");
  TEST_STRING("Hello", "\"Hello\"");

TEST_STRING是一个宏,这里只是替换下代码:

#define TEST_STRING(expect, json)                                              \
  do {                                                                         \
    lept_value v;                                                              \
    lept_init(&v);                                                             \
    EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, json));                        \
    EXPECT_EQ_INT(LEPT_STRING, lept_get_type(&v));                             \
    EXPECT_EQ_STRING(expect, lept_get_string(&v), lept_get_string_length(&v)); \
    lept_free(&v);                                                             \
  } while (0)

注意在TEST_STRING函数的一开始,有一句lept_value v;这个变量会存在于整个解析过程中,使用指针对这个变量进行修改,而最终的结果,也在这个宏函数中进行比较。形参中的json同理。面向过程编程中,数据和方法是分离的

接下来是变量v的初始化,对我来说,这显得有些无章法,调用一个函数,传给它一个变量的指针,对其做出修改,显然,这是C语言中常用的方式。

lept_parse_string函数

static int lept_parse_string(lept_context *c, lept_value *v) {
  size_t head = c->top, len;
  const char *p;
  EXPECT(c, '\"');
  p = c->json;
  for (;;) {
    char ch = *p++;
    switch (ch) {
    case '\"':
      len = c->top - head;
      lept_set_string(v, (const char *)lept_context_pop(c, len), len);
      c->json = p;
      return LEPT_PARSE_OK;
    case '\0':
      c->top = head;
      return LEPT_PARSE_MISS_QUOTATION_MARK;
    default:
      PUTC(c, ch);
    }
  }
}

lept_parse_string函数是实际上分割字符串的函数,主要做了这些事:

  1. 往栈中压入字符
  2. 错误检测与处理
  3. 将解析成功的字符串放入lept_value *v

这个函数中仍然有很多疑难点,需要时刻牢记一点函数与数据是分离的,会有多个函数通过指针的方式对数据做出更改,因此关于这个函数第一句size_t head = c->top, len;head就是为了记录更改前的c->top的值,这一点应该是在设计的时候就确定的,遗憾的是我需要在后面需要用到的时候才想到。

© 著作权归作者所有

AlexTuan
粉丝 4
博文 27
码字总数 17966
作品 0
程序员
私信 提问
大家都在谈的scratch到底是什么?

     scratch是一款由麻省理工学院(MIT)设计开发的面向青少年的简易编程工具,能创作故事、动画、游戏、艺术等。青少年可以不会英语,也可以不会使用键盘,直接用鼠标拖动构成程序的命...

人工智能AI产品经理
2017/11/16
0
0
凌晨无聊,闲得蛋疼,发现个问题!

看了点C/C++的源码共享,C++的代码一律不看,面向对象思想我很久就丢弃了,外加C++一堆乱七八糟的方法和模板,所以干脆不评论了。仅就C的代码,看了几个,提了些意见,有些通病,这里说一说。...

中山野鬼
2012/09/16
1K
19
有必要澄清两个基本概念--算法和过程的关系以及关于程序设计方法论的一些看法

概述 前些天,在一个关于面向对象和面向过程的话题, 我的一句评论"算法说白了就是过程"引起了辩论.于是我有了写这篇随笔的想法: 一位园友善意地说这个评论太业余了.我没有为业余二字生气,因为...

mikelij
2008/11/30
0
0
思想交融,Android中的函数式编程(1):DiffUtil体验

前言 随着业务的急剧扩张,一些架构上的调整也随之破土动工。从最初的MVC,管他是唱、跳、Rap,还是打篮球。通通写在Activity里;再到MVP阶段的业务与View分离;然后就是现在的MVVM。 关于M...

MDove
07/02
0
0
不要用面向对象编程分散新手程序员的注意力

来源:Ackalrix博客【http://www.ackarlix.com】 编者按:原文作者James Hague是一位修复性程序员(recovering programmer),从上世纪80年代起开始设计视频游戏,属于发烧友级别,用汇编语言...

Ackarlix
2011/03/30
317
1

没有更多内容

加载失败,请刷新页面

加载更多

32位与64位Linux系统下各类型长度对比

64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。本文介绍的是64位下C语言开发程序注意事项。 1. 32 位和 64 位C数据类型...

mskk
21分钟前
6
0
Vue 实现点击空白处隐藏某节点(三种方式:指令、普通、遮罩)

在项目中往往会有这样的需求: 弹出框(或Popover)在 show 后,点击空白处可以将其 hide。 针对此需求,整理了三种实现方式,大家按实际情况选择。 当然,我们做项目肯定会用到 UI 框架,常...

张兴华ZHero
27分钟前
7
0
SpringBoot激活profiles你知道几种方式?

多环境是最常见的配置隔离方式之一,可以根据不同的运行环境提供不同的配置信息来应对不同的业务场景,在SpringBoot内支持了多种配置隔离的方式,可以激活单个或者多个配置文件。 激活Profi...

恒宇少年
29分钟前
7
0
PDF修改文字的方法有哪些?怎么修改PDF文件中的文字

PDF修改文字一直以来都是一个难以解决的问题,很多的办公族在办公的时候会有修改PDF文件中的文字的需要,可是PDF文件一般是不能进行编辑和修改的,难道就没有什么办法解决这个问题了嘛?不要...

趣味办公社
32分钟前
5
0
企业组织中采用服务网格的挑战

作者:Christian Posta 译者:罗广明 原文:https://blog.christianposta.com/challenges-of-adopting-service-mesh-in-enterprise-organizations/ 编者按 本文作者介绍了企业组织采用服务网...

jimmysong
41分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部