生成代码中使用的局部变量、表类型名称引用 可能会跟参数名、表类型扩展成员名称冲突
lookup-cat opened this issue · 9 comments
实体类型
@Table(tableClassName = "entity")
public data class Entity(
@PrimaryKey
public var id: Int?
)
生成表类型代码
public object entity : BaseTable<Entity>(tableName = "entity", entityClass = Entity::class) {
public val id: Column<Int> = int("id").primaryKey()
public override fun doCreateEntity(row: QueryRowSet, withReferences: Boolean): Entity {
return Entity(
id = row[this.id],
)
}
}
这个entity表名可能会跟多处生成代码发生冲突
我觉得不应该让用户指定 tableClassName,在这个例子里面,实体类是 Entity,表对象的名字就应该是 Entities,sequence 的名字是 entities,这不仅可以解决命名冲突的问题,而且可以限定用户的命名风格
Entity --> Entities --> entities
这是 Ktorm 推荐的命名风格,我们提供 tableClassName 这种配置,就会存在很多不符合我们命名规范的情况出现
Entity --> Entities --> entities
这是 Ktorm 推荐的命名风格,我们提供 tableClassName 这种配置,就会存在很多不符合我们命名规范的情况出现
现有的tableClassName自动生成方式,可能无法满足一些情况。例如child的复数应该是children,但是目前的逻辑只会自动转换成childs,如果不能自定义tableClassName的话其实也挺奇怪的
而且我认为命名只要在符合编程语言要求的范围内,就应该是约定俗成的而不是强制约束。毕竟语言层面都允许这种小写字母开头的类名。我们应该尽可能在默认配置下生成符合规范的命名,同时尽可能做到更多的可自定义配置
@lookup-cat child --> children 的问题很好解决,github 上有一些现成的英语名词复数转换的库,比如 atteo/evo-inflector,另外我注意到现在代码里面复数转换是自己写的,建议可以改成使用类库提高转换的准确性
问题是使用类库来转换名词复数也不是 100% 准确的,这个我同意你的观点,可以提供让用户自己指定
但是我坚持要统一命名风格的观点,即使我们允许用户自己指定名字,当他给出的名字不符合命名规范时,我们需要进行检查,并且给出警告
刚想可能需要做一个自动分配变量名称避免命名冲突的逻辑,结果发现kotlinpoet是有做这个功能的(这么有用的功能竟然没放到官方文档里
https://github.com/square/kotlinpoet/blob/master/kotlinpoet/src/main/java/com/squareup/kotlinpoet/NameAllocator.kt
v1.0.0-RC3已修复