用C#实现一个Json解析器(3)——详细设计②

前言

上回我们已经得到了简单类图,这次就来细品一下每个类应该长什么样,需不需要再增加辅助类。

加入公有成员

首先来给每个类加入成员:

  1. Lexer:词法分析器的任务是把Json字符串转换成单词流,只有一个方法Analyze。
  2. Token:单词显然是一个值对象,只有Value和TokenType两个只读属性。考虑到值类型的效率比引用类型高,把Token设计成结构体会更好。
  3. Parser:语法分析器的任务是把单词流转换成C#对象,所以应该有一系列的ToObject方法。
  4. Serializer(序列化器):考虑到把序列化的责任也扔给Parser并不妥当,我们新加入一个负责序列化的类,这个类应该只有一个ToJson方法。
  5. JsonMapper:整个系统只做两件事:序列化和反序列化,因此JsonMapper应该包括序列化方法ToJson和反序列化方法ToObject(三个)。

添枝加叶

考虑一些实际情况,再次对系统结构进行调整:

  1. 词法分析器无状态,不需要多个实例,不需要使用多态,不需要暴露给外部,这样的类最适合直接实现为静态类。
  2. 大多数情况下,用户都只会使用基础功能,而不会用到自定义特性和委托这些高级功能,而高级功能的实现不免需要额外的时间和空间。如果把基础功能和高级功能糅合在一起,就会无形中增加那些只需要基础功能的用户的负担。所以我们使用多态将两者分离开,当用户只需要基础功能时,就可以省下一些时间和空间了。使用策略模式,提取出两个策略接口IParser和ISerializer,每个接口下面都有两个实现类PrimaryXXX和AdvancedXXX,分别实现ToObject和ToJson方法。
  3. JsonMapper的状态决定于关联的IParser和ISerializer,因此是有限个状态。使用单例模式,将JsonMapper的实例个数减少到2(一个基本映射器,一个高级映射器),避免用户做多次无意义的实例化操作。

最终成果

到目前为止,我们已经得到了系统的完整结构。有了类图之后,剩下的就是按部就班地实现每个方法了:
程序结构
系统的设计到目前为止就结束了,下回正式开始实现这个解析器。

发布了27 篇原创文章 · 获赞 41 · 访问量 2068

猜你喜欢

转载自blog.csdn.net/DIAX_/article/details/104323709