关于json解析器的总结

该解析器在教程:https://zhuanlan.zhihu.com/json-tutorial下完成,非常感谢Milo大神的指导!才回忆起来,原来我看C++ primer 5th 的时候那个审校就是本人!

值得理解学习的知识有如下:

1.重构的观念

       重构就是在不改变软件系统外部行为的前提下,改善它的内部结构。首次遇到重构,是在解析null和boolean类型的时候,对这三类解析操作都具有相似的结构(包括在测试当中),于是在不改变功能前提下,简练的总结代码功能步骤和提炼重写它,这也是对重构的理解。

再说一遍:在不改变功能的前提下,提炼一个区块的代码功能的步骤,使得原有代码缩减,更明确简练。

2.单元测试

软件开发的一个方法论:测试驱动开发(test-driven development, TDD)

1.加入一个测试。

2.运行所有测试,新的测试应该会失败。

3.编写实现代码。

4.运行所有测试,若有测试失败回到3。

5.重构代码。

6.回到 1。

从具体的代码编写中,可以看出来,一般是:确定对外函数(接口)功能,编写之(该函数实现未完成),而后编写单元测试,从一般值,到边界值确定输出结果与预期是否一致。

3.VS下的内存泄漏定位CRT技术

      该解析器,在windows下的vs2017社区版的环境下编写,该技术细节参考:https://docs.microsoft.com/zh-cn/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2017&redirectedfrom=MSDN

4.unicode编码

      该解析器完全支持utf-8,让我熟悉utf-8编码的规则具体参考维基百科,该解析器在处理/u(U)XXXX的部分是对二进位操作运算的炉火纯青的运用!我在对四位16进制字符串的解析的时候,使用了一般思维下的方法,没有想到(实际上我以前接触过,你根本不知道什么时候有用啊!!!还是too young!)每四位二进制位代表一位十六进制位,运用该方法可以极大的优化时间和让代码简练,以至于我直接抛弃我那个臃肿的代码,还是milo大神写的好!

5.对C的了解和使用

      因为我是C++入门的,我并不太了解C,学习对宏的编写和其中的机巧,让我更明白了C++为什么要尽可能的替代宏,果然是实践出真知啊!还有一些库函数的使用,比如 strtod可以将某个进制数据的字符串转换为long类型,这给了我一个启示:当你需要完成一项编写功能函数工作的时候,你要尽可能了解有没有相关库函数可以帮助你完成它,毕竟前人的无敌经验是可以让速度和空间都是极致的平衡优化的!这里在数值型解析的时候也是一个坑,如果你要自己完成一个类似strtod的工作,并且要考虑大数问题,非常具有挑战性,以后回看可以尝试!

最后关于写本解析器的一些感悟:

      我几乎没有看教程的解疑篇和源码就通过了大部分编写的单元测试(单元测试的例子我倒是没有思考,照搬全收了),但是因为有各种臃肿,考虑不周全,一些内存泄漏问题,我觉得还是milo的代码写得好,我就修改过来了,因为他写得实在太好了!该json解析器我做了非常多的注释,方便理解透彻。实际上,我是在CPP编译环境下写C,在写到json对象的解析的时候,我曾尝试用std:unordered_map()而不用动态数组,虽然最后也搞出来了,但是于是它变成了两不像,不像C不像C++,纯粹娱乐,但是这倒是挺符合我看Effective C++时候第一个条款说的,C++有时候是C有时候才是C++,题外话了。要写出简洁,功能明确,优质的代码,路漫漫其修远兮,谢谢milo在这条路上的一臂之力。

posted @ 2020-04-27 21:26  Royzzzzz  阅读(313)  评论(0)    收藏  举报