focus-creative-games / luban

luban是一个强大、易用、优雅、稳定的游戏配置解决方案。luban is a powerful, easy-to-use, elegant and stable game configuration solution.
https://code-philosophy.com/
MIT License
3.41k stars 541 forks source link

`namingConversion.{codeTarget}.type` 不生效 #176

Closed hu-chia closed 1 month ago

hu-chia commented 1 month ago

现象

配置指定 namingConversion.{codeTarget}.type 后生成代码中的类名和文件名没有按照预期转换为期望的名称风格。

期望

该配置可以开箱即用(即配置即生效,不需要修改模板或C#代码)。

原因

该配置项用来构造luban的ICodeStyle的实例,该实例会在渲染模板时注入上下文中。但存在以下问题:

  1. luban并没有主动直接或间接调用ICodeStyle中的成员方法格式化原始数值配置中的命名,因此需要用户在模板的实现中主动调用;
  2. luban使用的模板引擎是scriban,该模板引擎出于安全考虑不允许直接调用对象的成员方法,因此ICodeStyle中的方法并没有暴露给模板;
  3. luban提供了一个Luban.TemplateExtensions.TypeTemplateExtension,提供了一组静态方法,可以在模板中使用,传入模板上下文的__code_style对象,由用户自己对标识符进行格式化,但这组静态方法缺少FormatType,除了Type以外的其他五种标识符都有对应方法(不知是有意为之还是无意缺失);
  4. 对文件名的处理,luban并没有提供合适的机制,代码风格不会影响到文件名。

综上,这个配置目前而言是一个无效配置,对于特定用户而言,标识符的处理仍然需要在模板中实现,可以自己实现,也可以采用luban提供的format_xxxx_name这组方法来实现,这组方法会尊重配置中的代码风格。对于生成代码的文件名,似乎并没有合适的机制来实现此类需求。

如果以上行为属于设计的一部分,请随意关闭该issue。

pirunxi commented 1 month ago

QQ群里解释了。

hu-chia commented 1 month ago

搬运一下作者的解释,以防后续翻到这个问题的同学郁闷:

scriban不能直接调用某个对象的成员函数,所以用了这个委婉的办法 至于类型名不支持格式化,那是因为确实觉得类型名没必要再格式化了,就没提供支持 至于说期望模板不用主动调用format这些命名约定就能智能生效,这个我们觉得至少在scriban引擎下是做不到的,就算做到了也很费劲。因为它不允许调用成员函数,所以起码得对Name之类返回一个Formatted包装类后再调用属性才行

hu-chia commented 1 month ago

我的理解是设计上没有考虑支持类型名称的代码风格转换,这个配置不生效是设计预期内的内容。

感谢作者的迅速回复并表示接受。