เริ่มทำ Code Review ด้วย ktlint กันเถอะ

Android Jul 2, 2020

เนื่องด้วยทำงานบริษัท startup ที่เปลี่ยนแปลง requirement ได้บ่อย จนเดฟไม่มีเวลาทำ Unit Test แล้วไม่รู้จะทำ Code Review ยังไงอีก อ่ะงั้นเราค่อยๆเริ่มทำสักอย่างก็แล้วกัน

https://ktlint.github.io/

แน่นอนว่า 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 ด้วยแหะ

อันนี้เป็นตัวอย่างจากที่เราได้มา ในส่วนของการที่ต้องอัพเดต dependency ต่างๆ แคปแค่นี้ก็พอเนอะ

ดังนั้น 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 ไปอีกบล็อกแล้วกันเนอะ

ทำ Jenkins pipeline ใน Android project ของเรากันเถอะ
ทีมมาใช้ Jenkins ในการรัน CI/CD ต่างๆในทีม แต่ด้วยความที่ฝั่ง Android ไม่ได้ทำแบบ pipeline แบบ iOS เราเลยต้องมาศึกษาและหาทำกันจ้า

กด follow Twitter เพื่อได้รับข่าวสารก่อนใคร เช่น สปอย content ใหม่ หรือสรุป content เร็วๆในนี้จ้า

ติดตามข่าวสารและบทความใหม่ๆได้ที่

อย่าลืมกด like กด share บทความกันด้วยนะคะ :)

Posted by MikkiPastel on Sunday, 10 December 2017

download แอพอ่านบล็อกใหม่ของเราได้ที่นี่

MikkiPastel - Apps on Google Play
First application from “MikkiPastel” on play store beta feature- read blog from https://www.mikkipastel.com by this application- read blog content by chrome custom tab- update or refresh new content by pull to refresh- share content to social network
https://play.google.com/store/apps/details?id=com.mikkipastel.blog

Tags

Minseo Chayabanjonglerd

I am a full-time Android Developer and part-time contributor with developer community and web3 world, who believe people have hard skills and soft skills to up-skill to da moon.