Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 2067

ลด ละ เลิก การสร้าง Logging application กันเถอะ !!

$
0
0

logging

logging ในการสร้างระบบงานนั้น สิ่งหนึ่งที่ขาดไปไม่ได้เลยคือ logging การทำงานต่าง ๆ ของระบบ ดังนั้นทำให้เกิด code ที่เกี่ยวกับ logging จำนวนมาก เผลอ ๆ อาจจะมากกว่า code ส่วนอื่น ๆ ของระบบอีกต่างหาก ซึ่งผมชอบเรียกระบบเหล่านี้ว่า Logging application !! ผลที่ตามมาก็คือ code อุดมไปด้วย log อ่านยากมาก ๆ code จะทดสอบยากมาก ๆ บ่อยครั้งไม่สามารถเขียน unit test ได้เลย code ดูแลยากอีก !! ดังนั้นนักพัฒนาควรใส่ใจวิธีการจัดการ log มาก ๆ ด้วยนะ มาดูกันว่าทำอย่างไรได้บ้าง

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

[gist id="f6bf7d7816e98cb7f9b6f2531751704c" file="1.java"]

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

[gist id="f6bf7d7816e98cb7f9b6f2531751704c" file="2.java"]

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

  • ถ้าเขียน 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 [gist id="f6bf7d7816e98cb7f9b6f2531751704c" file="3.java"] หรือทำการสร้างไฟล์ใหม่ที่ extends มาจาก class เดิม ซึ่งเป็นวิธีการที่แยกการทำงานของแต่ละ class ออกมา ตามแนวคิด Single Responsibility Principle (SRP) [gist id="f6bf7d7816e98cb7f9b6f2531751704c" file="4.java"]

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

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

Viewing all articles
Browse latest Browse all 2067

Trending Articles