关于面向过程编程的一些思考
2019獨角獸企業重金招聘Python工程師標準>>>
關于面向過程編程與指針的一些思考
長期以來,雖然有C語言的基礎,但對C的使用主要停留在書面例子的基礎上,沒有復雜的功能和調用關系,因此,對面向過程的理解并不深刻。而使用java、js編寫功能的時候,通常都是面向對象的思想。
在本例中,會有大量使用指針的場景,使得多個函數作用于同一個變量,C中沒有成員函數的概念,函數是公有的,靠指針區別變量。這一點也讓我有些不適應。
既然是一些思考,并沒有刻意組織結構,會非常雜亂無章,請看到的朋友諒解。
在開始閱讀教程的時候,函數與函數之間的調用、輸出都感覺異常的別扭。下面逐步的分析下這個程序。如果有同道朋友看到了這篇博文,請配合摘要中github庫的代碼閱讀。
程序主要做了哪些事?
在教程中,包含一個解析庫,和一個單元測試,單元測試會統計:
解析庫是實際上執行解析動作的部分,主要包含:
程序執行過程
單元測試是怎么工作的?
本教程中,單元測試主要包含一個基礎的比較和信息輸出函數(宏),以及一個在此基礎上的不同形式的比較函數。 單元測試會調用實際的處理函數。
測試解析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函數是實際上分割字符串的函數,主要做了這些事:
這個函數中仍然有很多疑難點,需要時刻牢記一點函數與數據是分離的,會有多個函數通過指針的方式對數據做出更改,因此關于這個函數第一句size_t head = c->top, len;,head就是為了記錄更改前的c->top的值,這一點應該是在設計的時候就確定的,遺憾的是我需要在后面需要用到的時候才想到。
轉載于:https://my.oschina.net/alextuan/blog/801758
總結
以上是生活随笔為你收集整理的关于面向过程编程的一些思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在C/S下打印报表
- 下一篇: 简单说说你对Java内存模型的原子性的了