-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local

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
-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local