Screen Shot 2558-04-03 at 3.42.53 PM
วันนี้ทำการ review code มาเจอ code ที่น่าสนใจ
เกี่ยวกับการ cast type ของ object
และการใช้ instanceof มาเพื่อตรวจสอบว่า
เป็น instance ของ class ที่เราต้องการหรือไม่
มาดูกันว่ามันเป็นอย่างไร

Code ที่ทำการ review มีหน้าตาดังนี้

คำอธิบาย
method sizeOf() ทำหน้าที่คำนวณหาขนาดของ object
ที่ทำการ implement interface Iterable

ซึ่ง code ชุดนี้อ่าน และ ทำความเข้าใจได้ง่าย คือ
ถ้า object ที่ส่งเข้ามาเป็น instance สร้างมาจากตระกูล Collection
แล้วจะทำการ cast type และเรียกใช้ method size() ทันที
แต่ถ้าไม่ใช่ ก็จะทำการวน loop เพื่อนับขนาดกันไป

คุณเห็นปัญหาอะไรจาก code ชุดนี้กันบ้าง ?

เห็นไหมว่า method sizeOf() มันผูกติดกับ Collection อย่างมากใช่ไหม ?
เห็นไหมว่า method นี้จะเริ่มซับซ้อนขึ้นเรื่อยๆ  !!
ถ้าเพิ่ม data type ที่สนับสนุนมาเรื่อยๆ ?
ส่งผลให้บรรดา if-else มันเยอะขึ้นมานั่นเอง !!

ดังนั้น แสดงว่า
method นี้ไม่ได้เคารพในเรื่อง Single Responsibility Principle(SRP) หรือเปล่านะ ?
method นี้ทำงานเยอะไปไหม ?
ทั้งการตรวจสอบว่าเป็น Collection ไหม ?
ทั้งการ cast type ?
ทั้งการวน loop ?
หน้าที่การทำงาน เยอะไปหมด ?

แล้วเราจะแก้ไขปัญหา อย่างไรดีล่ะ ?

ถ้ารวมกันไปไม่รอด ดังนั้น แยกหน้าที่การทำงานไหม ?
ด้วยการสร้าง overload method ขึ้นมาสิ
เพื่อแยกการทำงานของ Iterable และ Collection ออกจากกันไปเลย
ทำให้เราไม่ต้องใช้งาน instanceof เพื่อตรวจสอบชนิดของ object
ทำให้เราไม่ต้องทำการ cast type
ลดความซับซ้อนของ method ลงไปด้วย
ดังนี้

code ของ method sizeOf() มันดูดีขึ้นกว่าเดิมไหม ?

ในกรณีของ code ชุดนี้
เราได้กลิ่น หรือ มี Code smell อะไรบ้าง ?

  • การใช้งาน instanceof
  • การ cast type

Coding for FUN …