XenoAmess/p3c

为什么使用x8l而不是一个更普遍使用的格式?

Shawyeok opened this issue · 5 comments

首先感谢作者花精力维护第三方版本。

我理解,配置文件不是应该让用户学习成本越低越好么?例如YAMLJSON等。若论表达能力,YAML似乎也不输x8l。

<com.alibaba.p3c.pmd.config version=0.0.1>
    <rule_config>
        <ConstantFieldShouldBeUpperCaseRule>
            <LOG_VARIABLE_TYPE_SET>Log&Logger>
            <WHITE_LIST>serialVersionUID>
        >
        <LowerCamelCaseVariableNamingRule><WHITE_LIST>DAOImpl>>
        <PojoMustOverrideToStringRule><POJO_SUFFIX_SET>DO&DTO&VO&BO>>
        <UndefineMagicConstantRule><LITERAL_WHITE_LIST>0&1&""&0.0&1.0&-1&0L&1L>>
        <MethodReturnWrapperTypeRule>
            <PRIMITIVE_TYPE_TO_WRAPPER_TYPE>
                <int>Integer>
                <boolean>Boolean>
                <float>Float>
                <double>Double>
                <byte>Byte>
                <short>Short>
                <long>Long>
                <char>Character>
                <void>Void>
            >
        >
        <CollectionInitShouldAssignCapacityRule><COLLECTION_TYPE>HashMap&ConcurrentHashMap>>
        <ClassNamingShouldBeCamelRule><CLASS_NAMING_WHITE_LIST>Hbase&HBase&ID&ConcurrentHashMap>>
    >
    <rule_blacklist>>
    <class_blacklist>>
    <rule_class_pair_blacklist>>
>

1. 设计和实现x8l的原始动机

在两三年以前,我曾经试图制作一款2D(后续有对接龙骨的计划,不过以2D为核心,非2D部分计划只做一些渲染,不做物理)游戏引擎。底层使用lwjgl。对标竞品是天闻角川的rpg maker系列。目标是更高的性能,更好的书写手感(毕竟js……我就不放那张“谢谢你创造js”的图了,写过的都懂)

我需要一门语言用于描述配置、地图、角色信息等数据文件

但是找了一圈没发现很适合的

json的问题是json不支持注释

(虽然json5(一个json的方言)支持,以及事实上很多json解析库作为可选特性支持)

而且json的属性间存储顺序是与表意无关的,这也是很恶心的一点

xml的问题是xml太过冗长

yaml存在同样的问题,甚至在冗长的程度上比xml更加过分。毕竟对齐……

(虽然当然压缩一下可以解决很多问题,但是终究我还是希望在原始文件上就不要过分膨胀)

另外,还有一个问题,处于某些原因,最好最终采取的格式的语义能够描述xml的全部语义(DTD除外,DTD去死吧)的同时,还能描述json的全部语义。

所以最终的需求汇总是:1. 语义表达能力强 2. 可以同时存在人类可读高压缩两种模式,并且一定程度下可以转化。

2. 在p3c-tpm版中使用x8l的动机

emm 随手拿来就用了 没想太多

3. 针对贵方提出的难以配置的问题的解决方案

3.1 增加json格式配置文件支持

感谢耐心解答。

我不太懂游戏制作,仅停留在player阶段,不太清楚游戏引擎对于配置文件的特殊要求,下面是本人一点拙见:

json的问题是json不支持注释

(虽然json5(一个json的方言)支持,以及事实上很多json解析库作为可选特性支持)
而且json的属性间存储顺序是与表意无关的,这也是很恶心的一点

注释可以在JSON解析之前预处理,大致类似于grep -vE '^\s*//'(仅支持单行注释),至于存储循序一般JSON库都支持一个Ordering的特性。

yaml存在同样的问题,甚至在冗长的程度上比xml更加过分。毕竟对齐……

yaml相对xml节省了结束标签、尖括号,付出的代价也就是多了一个冒号而已,当然yaml的缩进是强制的,另外我一般使用tableSize: 2的缩进,避免配置快速发展成子弹型。

另外一个很重要的点是语言的生态,validator、formatter以及代码提示等。

@Shawyeok
总算抽出来时间了!!
搞定!
然后 这周内会发一个新版本

az 一不小心搞成编辑了 抱歉

至于存储循序一般JSON库都支持一个Ordering的特性。

是的,但是这是实现,而不是语法约定。

同json5不是json一样,强行用实现的顺序性特性约束语法的话,那么得到的就不是json,而是json的变体

yaml相对xml节省了结束标签、尖括号,付出的代价也就是多了一个冒号而已,当然yaml的缩进是强制的

一个缩进就是至少两个字符。一层缩进就是额外对每个缩进加两个字符。

另外一个很重要的点是语言的生态,validator、formatter以及代码提示等。

生态我做了 https://plugins.jetbrains.com/plugin/13915-x8l

至少包含转化器、格式化器、代码高亮。

校验器目前没有。