logging
ในการสร้างระบบงานนั้น สิ่งหนึ่งที่ขาดไปไม่ได้เลยคือ
logging การทำงานต่าง ๆ ของระบบ
ดังนั้นทำให้เกิด code ที่เกี่ยวกับ logging จำนวนมาก
เผลอ ๆ อาจจะมากกว่า code ส่วนอื่น ๆ ของระบบอีกต่างหาก
ซึ่งผมชอบเรียกระบบเหล่านี้ว่า Logging application !!

ผลที่ตามมาก็คือ
code อุดมไปด้วย log อ่านยากมาก ๆ
code จะทดสอบยากมาก ๆ
บ่อยครั้งไม่สามารถเขียน unit test ได้เลย
code ดูแลยากอีก !!

ดังนั้นนักพัฒนาควรใส่ใจวิธีการจัดการ log มาก ๆ ด้วยนะ
มาดูกันว่าทำอย่างไรได้บ้าง

เริ่มต้นด้วย code สวยงาม clean clean

แต่เมื่อต้องเพิ่ม logging เข้าไป ก็จะเป็นดังนี้ !!

ลองคิดดูสิว่า

  • ถ้าเขียน unit test ไว้ น่าจะพัง แต่อาจจะแก้ด้วยการดักจับ error แล้วไม่ทำอะไรเลย
  • การเขียน log ต้องกระทำกับไฟล์ ซึ่งผ่าน I/O นั่นเอง ไม่น่าจะดีต่อ unit test นะ
  • จะลบออกไปก็ไม่ได้ เพราะว่า product manager ต้องการแบบนี้ !!
  • จะลบออกก็ไม่ได้เพราะว่า เราต้องการข้อมูลเพื่อ audit และ เป็นข้อมูลในการแก้ไขปัญหา

คำถามที่เกิดขึ้นมาคือ

  • เราจะจัดการกับปัญหานี้อย่างไรดี ?
  • ต้องการให้ code มัน clean clean !!
  • ต้องการให้มีการเขียน log
  • ต้องการให้สามารถทดสอบ unit test ได้

มันมีวิธีการหรือเทคนิคอะไรบ้าง ?

  • เปิดปิด log ตาม mode/profile ในการ build ซึ่ง code ต้องเปลี่ยนตามไปด้วย ซึ่งขึ้นอยู่กับตัวภาษาที่ใช้อีกด้วย
  • นำแนวคิด Dependency Injection มาใช้
  • สร้าง Logging สำหรับเรื่องนั้น ๆ ขึ้นมาเลย ทำให้เลือกได้ว่าจะใช้หรือไม่
  • นำแนวคิด AOP มาใช้
  • สร้าง Library เกี่ยวกับ log มาครอบการทำงานของเราอีกชั้น

มาดูตัวอย่างการใช้งาน Dependency Injection

ซึ่งเราสามารถส่ง object ของ Logger เข้ามาได้เอง
ทำให้ง่ายต่อการทดสอบ
ทำให้ง่ายต่อการเปลี่ยน logger

หรือทำการสร้างไฟล์ใหม่ที่ extends มาจาก class เดิม
ซึ่งเป็นวิธีการที่แยกการทำงานของแต่ละ class ออกมา
ตามแนวคิด Single Responsibility Principle (SRP)

โดยรวมแล้วจะใช้วิธีไหนก็ขึ้นอยู่กับความต้องการ

และขึ้นอยู่กับความเหมาะสม
แต่จากที่ใช้มานั้น มักจะใช้หลาย ๆ วิธีเข้าด้วยกัน
เพื่อทำให้ code ดู clean หรือ สะอาด
เพื่อทำให้ code ดูแลรักษาได้ง่าย

ดังนั้นลองกลับไปดู code ที่เราเขียนกันสิว่า
เป็น Logging application หรือไม่ ?