关于面向过程编程的一些思考
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
關(guān)于面向過程編程與指針的一些思考
長期以來,雖然有C語言的基礎(chǔ),但對(duì)C的使用主要停留在書面例子的基礎(chǔ)上,沒有復(fù)雜的功能和調(diào)用關(guān)系,因此,對(duì)面向過程的理解并不深刻。而使用java、js編寫功能的時(shí)候,通常都是面向?qū)ο蟮乃枷搿?/p>
在本例中,會(huì)有大量使用指針的場景,使得多個(gè)函數(shù)作用于同一個(gè)變量,C中沒有成員函數(shù)的概念,函數(shù)是公有的,靠指針區(qū)別變量。這一點(diǎn)也讓我有些不適應(yīng)。
既然是一些思考,并沒有刻意組織結(jié)構(gòu),會(huì)非常雜亂無章,請(qǐng)看到的朋友諒解。
在開始閱讀教程的時(shí)候,函數(shù)與函數(shù)之間的調(diào)用、輸出都感覺異常的別扭。下面逐步的分析下這個(gè)程序。如果有同道朋友看到了這篇博文,請(qǐng)配合摘要中g(shù)ithub庫的代碼閱讀。
程序主要做了哪些事?
在教程中,包含一個(gè)解析庫,和一個(gè)單元測試,單元測試會(huì)統(tǒng)計(jì):
解析庫是實(shí)際上執(zhí)行解析動(dòng)作的部分,主要包含:
程序執(zhí)行過程
單元測試是怎么工作的?
本教程中,單元測試主要包含一個(gè)基礎(chǔ)的比較和信息輸出函數(shù)(宏),以及一個(gè)在此基礎(chǔ)上的不同形式的比較函數(shù)。 單元測試會(huì)調(diào)用實(shí)際的處理函數(shù)。
測試解析string類型json值的流程
test_parse_string函數(shù)
這個(gè)函數(shù)是測試分割string單元的入口:
static void test_parse_string() {TEST_STRING("", "\"\"");TEST_STRING("Hello", "\"Hello\"");TEST_STRING是一個(gè)宏,這里只是替換下代碼:
#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函數(shù)的一開始,有一句lept_value v;,這個(gè)變量會(huì)存在于整個(gè)解析過程中,使用指針對(duì)這個(gè)變量進(jìn)行修改,而最終的結(jié)果,也在這個(gè)宏函數(shù)中進(jìn)行比較。形參中的json同理。面向過程編程中,數(shù)據(jù)和方法是分離的。
接下來是變量v的初始化,對(duì)我來說,這顯得有些無章法,調(diào)用一個(gè)函數(shù),傳給它一個(gè)變量的指針,對(duì)其做出修改,顯然,這是C語言中常用的方式。
lept_parse_string函數(shù)
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函數(shù)是實(shí)際上分割字符串的函數(shù),主要做了這些事:
這個(gè)函數(shù)中仍然有很多疑難點(diǎn),需要時(shí)刻牢記一點(diǎn)函數(shù)與數(shù)據(jù)是分離的,會(huì)有多個(gè)函數(shù)通過指針的方式對(duì)數(shù)據(jù)做出更改,因此關(guān)于這個(gè)函數(shù)第一句size_t head = c->top, len;,head就是為了記錄更改前的c->top的值,這一點(diǎn)應(yīng)該是在設(shè)計(jì)的時(shí)候就確定的,遺憾的是我需要在后面需要用到的時(shí)候才想到。
轉(zhuǎn)載于:https://my.oschina.net/alextuan/blog/801758
總結(jié)
以上是生活随笔為你收集整理的关于面向过程编程的一些思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在C/S下打印报表
- 下一篇: 简单说说你对Java内存模型的原子性的了