【问题标题】:Sonar rules - method name too long声纳规则 - 方法名称太长
【发布时间】:2017-03-10 20:52:21
【问题描述】:

我想定义一个 Sonar 规则,以避免在接口中指定的方法名称的长度大于 25,同时如果在接口中定义方法,它必须以单词“run”开头。我一直试图弄清楚如何做到这一点,但我不知道到底该怎么做。我认为它应该是一个 checkstyle 规则,但我不知道如何定义它。

有人可以帮我定义它吗?

非常感谢您。

【问题讨论】:

    标签: java sonarqube checkstyle


    【解决方案1】:

    这比乍看之下要困难得多。当然MethodName检查是要使用的检查,但问题是将检查限制在接口中定义的方法。

    MethodName 检查应该这样配置:

    <module name="MethodName">
        <property name="id" value="methodNameInInterface"/>
        <property name="format" value="^run(?=.{0,22}$)[A-Z][a-zA-Z0-9]*$"/>
    </module>
    

    注意id 属性,该属性用于在抑制过滤器配置中识别此规则,因为您将定义其他MethodName 检查。这是最简单的部分。

    为了抑制除接口中定义的方法之外的所有方法生成的警告,您可以使用suppression filter。但这只有在您有接口的命名约定时才有效(例如,常见的IF 后缀)。如果您没有这样的命名约定,那么您将不得不:

    • 实现一个custom filter,它可以根据文件类型过滤消息,或者
    • 实现一个custom check,可能是MethodName的子类,它添加了一个选项来将警告限制在某些类型的文件中。

    如果你有接口的命名约定,你可以像这样配置抑制过滤器:

    <!DOCTYPE suppressions PUBLIC "-//Puppy Crawl//DTD Suppressions 1.1//EN"
        "http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
    <suppressions>
        <suppress id="methodNameInInterface" files="(?!IF)..\.java$"/>
    </suppressions>
    

    【讨论】:

    • 非常感谢托马斯的回答。我有某种命名约定,因为接口的名称将有四个字母,后跟一个“U”,并以 3 个字符/数字结尾。另一方面,实现将具有相同的结构,但最后有一个 impl。因此,我认为使用如下过滤器就足够了: files="\D{4}U\w{3}.java$" 对吗?此外,是否需要注明包名?再次感谢您的帮助
    • 是的,应该不错。请注意,\w 包含下划线。包名可以使用,但不是必须的。
    • 我刚刚注意到抑制正则表达式中有一个错误。上面更正了。在你的情况下,你需要它是(?!\D{4}U\w{3}).{8}.java$。很抱歉造成混乱。
    • 太棒了!非常感谢您的帮助。你真的很有帮助
    • 你好托马斯!我一直在做一些测试,我认为对于我想要测试的情况,最好像这样定义过滤器 ^([A-Z]{4}[U]{1}[A-Z0-9]{3 }).java$ 你怎么看?你认为它会失败吗?是否会发生它检测到具有先前模式作为子字符串的类?非常感谢您的帮助
    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多