GitHub - ozgunozerk/state-shift: 用于在你的结构体和方法上实现类型 - 状态 - 模式的宏

主要观点:

  • state-shift可将结构体和方法转换为类型状态版本,避免丑陋代码,兼具类型安全和良好的开发体验。
  • 类型状态模式利用类型安全在编译时强制特定方法仅在特定状态下可调用,有诸多好处,如更好的开发体验、更少的运行时错误等。
  • state-shift库提供了隐藏丑陋类型状态模式样板代码的功能,还具有类型安全、密封特质、清晰文档、欢迎建议和贡献等优点。

关键信息和重要细节:

  • 完整代码对比:无state-shift时需编写大量样板代码,有state-shift时可简化代码结构,如#[type_state]#[impl_state]宏。
  • 隐藏丑陋代码方面:包括结构体和impl块的样板代码,以及中间特质和结构体的代码,state-shift能使代码更清晰可读。
  • 类型状态模式解释:通过类型安全而非运行时检查来确保方法在特定状态下的调用,避免无效方法调用,提高代码安全性和性能。
  • 状态相关方法:确保方法尊重逻辑状态转换,防止不合理操作,如Player结构体的die()方法,且不会被 IDE 自动补全建议。
  • 字段/方法顺序及依赖:强制用户按顺序设置字段,避免无效设置,如PlayerBuilderrace字段需先于level字段设置。
  • 其他优点:如提供简洁清晰的语法实现类型安全、使用密封特质增强安全性、有清晰文档、欢迎建议和贡献等。
  • 高级技巧和规则:避免在方法签名和体中使用Self,除特殊情况外..self不被支持,若选择不使用宏需提供隐藏的_state字段,不要在不同结构体中使用相同的状态名称等。
  • 跟踪多个状态:通过多状态槽可分别跟踪每个状态,避免丑陋的代码结构和方法名重复。
  • 传递玩家到函数:可传递PlayerBuilder,若要指定特定状态需显式指定类型。
  • 方法中可使用复杂类型如ResultOption等,也可使用asyncconst方法。
  • requireswitch_toimpl_state宏处理,无需在代码中显式导入。
阅读 10
0 条评论