เริ่มทำ Code Review ด้วย ktlint กันเถอะ
เนื่องด้วยทำงานบริษัท startup ที่เปลี่ยนแปลง requirement ได้บ่อย จนเดฟไม่มีเวลาทำ Unit Test แล้วไม่รู้จะทำ Code Review ยังไงอีก อ่ะงั้นเราค่อยๆเริ่มทำสักอย่างก็แล้วกัน
แน่นอนว่า Android Kotlin Developer นั้น มักจะใช้ ktlint ทำ Code Review กัน อ่ะเรามาลองทำความรู้จักและใช้งานกันเถอะนะ
ปล. เป็น version update จากใน blacklens pub อีกรอบนึงเนอะ
รู้จักน้อง ktlint กันเถอะ!
Lint คือ ตัวที่ช่วยตรวจสอบโค้ดของเรา เพื่อแก้ไขโครงสร้างของโค้ด โดยที่ไม่ต้อง execute app ของเราหรือเขียน test case แต่ละปัญหาจะถูกระบุไว้โดย tool ตัวนี้โดยบอก description และ level ของปัญหานั้นๆที่พบ ทำให้เราแก้ไขปัญหาได้ไวขึ้นนั่นเอง
หลายๆคนคงจะทราบกันอยู่แล้ว ว่า Android Studio สามารถทำ lint check ได้ ทำง่ายๆโดยผ่าน command line เลยหล่ะ
./gradlew lint
ผลที่ได้จาก Android Studio จะมีเรื่อง lint และมีหัวข้ออื่นๆอีก เช่น Correctness, Security, Performance, Usability, Accessibility, Internationalization และมี Disabled Checks ด้วยแหะ
ดังนั้น ktlint นั้น ย่อมาจาก Kotlin Linter ก็คือ tool ที่ช่วยตรวจสอบ Kotlin Code Style ของเรา ให้ถูกสุขอนามัยในแบบฉบับของ Kotlin นั่นเอง
มาลองใช้ ktlint กันเถอะ!
วิธีการลงมี 3 แบบ นั่นก็คือ Command Line, Maven และ Gradle
ในที่นี้จะเป็น Gradle นะ ใส่ไปใน build.gradle
ของ module :app
.
ในนี้จะมี task 2 ตัวเพิ่มมานั่นคือ
ktlint
เอาไว้ตรวจว่าโค้ดของเรานั้นเป็นไปตาม Kotlin Code Style หรือไม่ การใช้งานนั้นสุดแสนจะง่ายมาก นั่นก็คือ./gradlew ktlint
นั่นเอง- ส่วน
ktlintFormat
เป็นการเปลี่ยนโค้ดบางไฟล์ที่ยังไม่ถูกหลักอนามัย ให้ถูกต้องนั้นเอง โดยไม่ต้องแก้มือ อารมณ์แบบซักเครื่องอ่ะ ไม่ต้องใช้แรงมือ การใช้งานคือ./gradlew ktlintFormat
จากนั้นเราก็นำไฟล์ที่ทำการแก้แล้ว ไป commit และ push ลง repo ของเราได้เลยจ้า
หรือถ้ามองว่าใส่ใน build.gradle
ใน module app แล้วมันรกเกินไป สามารถสร้างไฟล์ที่ชื่อว่า ktlint.gradle
ได้เช่นกัน แล้วเอาไฟล์ ktlint.gradle
มา apply ใน build.gradle
ของ module app
.
ส่วน Rule ในเว็บเขามี 10 ข้อด้วยกัน ที่ทำการ Code Inspection
Code Inspection เป็นการตรวจสอบ format ของโค้ด ตามที่ทีมกำหนดไว้
indent ห่างกัน 4 spaces : อันนี้อาจจะเหวอๆ เนื่องจาก data class เราจะให้ตัวแปรใน object นั้นอยู่ตรงเส้นกัน
- ไม่มี Semicolons : แหงหล่ะ เราเขียน Kotlin นี่เนอะ ยกเว้นกรณีที่เขียนบรรทัดเดียวกันแล้วอยากจะแยกส่วนคำสั่งที่ต้องทำในบรรทัดนั้นๆ
- ไม่มีการ import library ที่มี * ต่อท้ายแบบเอาทั้งหมดก้อน ทั้งๆที่ใช้ตัวเอง และมีการ import library เท่าที่ตัวเองใช้เท่านั้น
- ไม่มีบรรทัดว่างต่อเนื่องระหว่างกัน : มีแซะด้วยว่าไม่ใช่ python นะเตง
- แน่นอนว่าห้ามมี space ท้ายบรรทัด : โดนกันเยอะแน่แบบไม่ได้ตั้งใจ
- ห้าม return เป็น Unit
- ห้ามใส่ {} เปล่าๆ ให้เอาออก สำหรับ empty class
- ใช้ String template
- การเรียงลำดับของ modifier ก็คือเรียงพวก Modifiers ให้ถูกต้อง เช่น suspend ต้องอยู่หน้าสุด สามารถเข้าไปอ่านเพิ่มเติมได้ที่
https://kotlinlang.org/docs/reference/coding-conventions.html#modifiers
- ระยะห่างที่สอดคล้องกัน จากตัวอย่าง เช่น บางคนชอบให้ = วางตรงกันตอนประกาศตัวแปร จริงๆควรเว้นแค่ 1 space หน้าหลัง = ก็พอ พวกเครื่องหมายทางคณิตศาสตร์ก็เช่นกัน บางคนชอบวางติดๆกัน จริงๆควรห่าง 1 space เช่นกัน, หลัง if ก็ห่าง 1 space เช่นกัน และอีกหลายตัว ขอแคปจากหน้า Document ของ ktlint ให้ดูประกอบด้วยกว่าเนอะ
อันไหนที่เจอบ่อยๆในโปรเจกเรากันนะ
- Unexpected indentation (expected 8, actual 23)
- Missing newline before “)”
- Parameter should be on a separate line (unless all parameters can fit a single line)
- Trailing space(s)
- Missing spacing before “{“
- Unexpected blank line(s) before “}”
- Imports must be ordered in lexicographic order without any empty lines in-between
- Unused import
- Wildcard import (cannot be auto-corrected)
- Unexpected spacing before “:”
- Missing spacing after “/”
- Missing space after //
- Needless blank line(s)
- Line must not begin with “&&”
ความงงคือ มันก็ทำงานบอกว่าอันไหนผิดหลักอนามัย แต่ดัน build failed ตรงนี้
เพราะเรา apply plugin: “java”
แล้วมันไม่สามารถ build ได้ พอไม่ใส่มันทำงานได้นะ ทั้งตอน ktlint
และ ktlintFormat
นะ
เมื่อเราทำการ ./gradlew ktlint
ผลที่ได้จะมี 2 แบบ คือ
- BUILD FAILED : เจอสิ่งที่ผิดหลักอนามัย ซึ่งเราจะไปแก้มือเองก็ได้ หรือใช้
./gradlew ktlintFormat
- BUILD SUCCESSFUL : โค้ดเราถูกหลักอนามัยของ Kotlin แล้วนะ ยินดีด้วย เย้ๆ
เราสามารถเอาไปใส่ใน CI ได้นะ แต่ขอแยกเรื่อง CI ไปอีกบล็อกแล้วกันเนอะ
กด follow Twitter เพื่อได้รับข่าวสารก่อนใคร เช่น สปอย content ใหม่ หรือสรุป content เร็วๆในนี้จ้า
ติดตามข่าวสารและบทความใหม่ๆได้ที่
download แอพอ่านบล็อกใหม่ของเราได้ที่นี่