Skip to content
This repository has been archived by the owner on May 15, 2024. It is now read-only.

生成代码中使用的局部变量、表类型名称引用 可能会跟参数名、表类型扩展成员名称冲突 #6

Closed
lookup-cat opened this issue Jun 29, 2022 · 9 comments
Labels
bug Something isn't working

Comments

@lookup-cat
Copy link
Member

lookup-cat commented Jun 29, 2022

实体类型

@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表名可能会跟多处生成代码发生冲突

  • 生成的序列扩展名称和类型名冲突
    image
    考虑把sequenceOf的参数改成全限定类名,可以解决此问题(除非这个表类型的包名是空的)
  • 和生成的addupdate方法参数冲突
    image
    参数名和表类型名称都是entity导致报错,在其他生成方法也会出现这种情况,需要考虑将其参数改成不容易发生冲突的名称
@lookup-cat lookup-cat added the bug Something isn't working label Jun 29, 2022
@vincentlauvlwj
Copy link
Member

我觉得不应该让用户指定 tableClassName,在这个例子里面,实体类是 Entity,表对象的名字就应该是 Entities,sequence 的名字是 entities,这不仅可以解决命名冲突的问题,而且可以限定用户的命名风格

@vincentlauvlwj
Copy link
Member

Entity --> Entities --> entities

这是 Ktorm 推荐的命名风格,我们提供 tableClassName 这种配置,就会存在很多不符合我们命名规范的情况出现

@lookup-cat
Copy link
Member Author

Entity --> Entities --> entities

这是 Ktorm 推荐的命名风格,我们提供 tableClassName 这种配置,就会存在很多不符合我们命名规范的情况出现

现有的tableClassName自动生成方式,可能无法满足一些情况。例如child的复数应该是children,但是目前的逻辑只会自动转换成childs,如果不能自定义tableClassName的话其实也挺奇怪的

@zuisong
Copy link

zuisong commented Jun 29, 2022

#4 这个PR 可以自定义生成的序列扩展名称

@lookup-cat
Copy link
Member Author

而且我认为命名只要在符合编程语言要求的范围内,就应该是约定俗成的而不是强制约束。毕竟语言层面都允许这种小写字母开头的类名。我们应该尽可能在默认配置下生成符合规范的命名,同时尽可能做到更多的可自定义配置

@vincentlauvlwj
Copy link
Member

@lookup-cat child --> children 的问题很好解决,github 上有一些现成的英语名词复数转换的库,比如 atteo/evo-inflector,另外我注意到现在代码里面复数转换是自己写的,建议可以改成使用类库提高转换的准确性

@vincentlauvlwj
Copy link
Member

问题是使用类库来转换名词复数也不是 100% 准确的,这个我同意你的观点,可以提供让用户自己指定

但是我坚持要统一命名风格的观点,即使我们允许用户自己指定名字,当他给出的名字不符合命名规范时,我们需要进行检查,并且给出警告

@lookup-cat lookup-cat changed the title 生成的方法参数/扩展属性名称 可能会跟表类名冲突 生成代码中使用的局部变量、表类型名称引用 可能会跟参数名、表类型扩展成员名称冲突 Jul 7, 2022
@lookup-cat
Copy link
Member Author

刚想可能需要做一个自动分配变量名称避免命名冲突的逻辑,结果发现kotlinpoet是有做这个功能的(这么有用的功能竟然没放到官方文档里
https://github.com/square/kotlinpoet/blob/master/kotlinpoet/src/main/java/com/squareup/kotlinpoet/NameAllocator.kt

@lookup-cat
Copy link
Member Author

v1.0.0-RC3已修复

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants