Xoá tan tranh luận

Có lẽ trong quãng thời gian làm dev của chúng ta đã không ít lần chúng ta tranh luận với đồng nghiệp của mình rằng các code này tốt hơn, cách code kia tốt hơn, sử dụng tab hay space, khai báo final hay không final bla bla. Chính những tranh luận này sẽ trở thành một rào cản và lâu dần sẽ làm mất đi mối quan hệ tốt đẹp mà chúng ta đã dày công gây dựng. Vậy nên không có cách nào khác ngoài việc chúng ta hãy nên thống nhất với nhau code style (coding convention) ngay từ đầu dự án, sử dụng công cụ để giúp chúng ta kiểm tra tự động việc này, và một trong những công cụ rất hữu dụng đó chính là maven checkstyle.

Giới thiệu

Khác với sonar là một service độc lập để kiểm tra coding convention thì checkstyle chỉ là một maven plugin được cấu hình trong file pom.xml, mỗi lần bạn build dự án source code sẽ phải vượt qua được checkstyle thì mới được coi là build thành công.

Cài đặt

Để cài đặt checkstyle đơn giản hơn rất nhiều so với sonar, chúng ta chỉ cần thêm một plugin và một file cấu hình là xong:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>3.1.2</version>
    <dependencies>
        <dependency>
            <groupId>com.puppycrawl.tools</groupId>
            <artifactId>checkstyle</artifactId>
            <version>8.42</version>
        </dependency>
    </dependencies>
    <configuration>
        <encoding>UTF-8</encoding>
        <consoleOutput>true</consoleOutput>
        <violationSeverity>error</violationSeverity>
        <configLocation>checkstyle.xml</configLocation>
    </configuration>
    <executions>
        <execution>
            <id>verify</id>
            <phase>verify</phase>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Và cấu trúc dự án của chúng ta sẽ thế này:

+ project
+ ----checkstyle.xml
+ ----pom.xml

Trong dự án của mình, mình sẽ chỉ in ra cảnh báo nếu có vi phạm checkstyle, nếu bạn muốn báo lỗi khi build bạn có cấu hình như này:

<violationSeverity>warn</violationSeverity>

Chi tiết hơn bạn có thể tham khảo dự án test-util của mình.

Một số cấu hình quan trọng

Mặc dù có rất nhiều coding convention cần kiểm tra nhưng mình sẽ liệt kê ra một số mà mình nghĩ là quan trọng nhất.

Độ dài 1 dòng

Một dòng chỉ nên có tối đa 100 đến 120 từ mà thôi

<module name="LineLength">
    <property name="fileExtensions" value="java"/>
    <property name="max" value="100"/>
    <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
  </module

Cấu hình độ dài lớp, hàm

Các cấu hình về độ dài hàm tối đa, số hàm tối đa, độ dài tối đa của một file

<module name="MethodLength">
    <property name="tokens" value="METHOD_DEF" />
    <property name="max" value="60" />
</module>

<module name="MethodCount">
    <property name="maxTotal" value="30" />
</module>

<module name="FileLength">
    <property name="max" value="1500" />
</module>
Cấu hình tên trường, hàm
<module name="MemberName">
  <property name="format" value="^m[A-Z][a-zA-Z0-9]*$"/>
  <property name="applyToProtected" value="false"/>
  <property name="applyToPackage" value="false"/>
</module>

<module name="MethodName">
    <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$" />
    <message key="name.invalidPattern"
        value="Method name ''{0}'' must match pattern ''{1}''." />
</module>

Và còn rất nhiều loại cấu hình nữa, bạn có thể xem ở phần tham khảo để tìm cho mình những cấu hình phù hợp cho nhóm hoặc tổ chức của bạn nhé.

Tổng kết

Nếu không có các công cụ kiểm tra coding convention, có lẽ sẽ không có cách nào để nhóm hay tổ chức của chúng ta có thể thống nhất được quy chuẩn code, và ác mộng xảy ra các thành viên xảy ra tranh cãi và làm ảnh hưởng tới tiện độ dự án. Vậy hãy sử dụng các công cụ như checkstyle này, kết hợp với CI (Continuous integration) để đảm bảo tất cả mọi người sẽ đều theo một quy chuẩn nhất định nhé.

Tham khảo

  1. Apache checkstyle
  2. Các loại cấu hình
  3. Ví dụ