Screen Shot 2558-03-05 at 11.01.26 AM
วันนี้อ่านบทความจาก Twitter พบว่ามีการพูดถึงคำว่า Connascence
ลองไปเปิด dictionary เพื่อแปลเป็นภาษาไทยคือ ปัจจัยที่เกิดร่วมกัน !!
งงไปกันใหญ่นะสิ

ดังนั้น จึงลองไปค้นหาใน Wikipedia ก็ได้ความมาว่า

มันคือ metric ในการวัดคุณภาพของ software
ซึ่งคิดค้นโดยคุณ Meilir Page-Jones
ใช้สำหรับอธิบายสาเหตุของ complexity และ dependency ต่างๆ
ในโลกของ Object Oriented Design (OOD)
เช่น coupling หรือ การผูกมัด นั่นเอง

ดังนั้นมาดูกันหน่อยว่า

Connascence มันเป็นอย่างไร และ สำคัญอย่างไรในการพัฒนา software


ปกติเรามักจะได้ยินคำว่า Code Smell
ใช้สำหรับแบ่งกลุ่ม และ อธิบาย รูปแบบของ code ที่อาจจะก่อให้เกิดปัญหาได้
พร้อมแนะนำแนวทางการแก้ไขปัญหา

แต่อย่างหนึ่งที่ทำให้ Code Smell มันมีปัญหาคือ

  • Developer ไม่รู้จัก อันนี้น่ากลัวมากๆ ดังนั้นไปเรียนรู้ซะนะ
  • Developer รู้จัก เคยได้ยิน แต่มันมีเยอะเหลือเกิน ศึกษาไม่หมด
  • Developer ไม่สนใจมัน อันนี้สุดๆ ไปเลย

ตัวอย่างปัญหาของ Code Smell
มันมีเยอะ แล้วแต่ละ Smell มันคืออะไรหว่า ?

Screen Shot 2558-03-05 at 10.10.28 AM

จากปัญหาเหล่านี้ของ Code Smell จึงมีคนคิดคำว่า Connascence
เพื่อใช้อธิบายให้เข้าใจง่ายขึ้น หรือเปล่านะ !!
ซึ่งอธิบายไว้สั้นๆ ว่า

Two software components are connascent
if a change in one would require the other to be modified
in order to maintain the overall correctness of the system.

แปลเป็นไทยได้ว่า
component 2 ตัวในระบบเราจะ connascent กัน
ถ้าเราทำการเปลี่ยนแปลงใน component ที่ 1 แล้ว
ต้องทำการเปลี่ยนแปลงใน component ที่ 2 ด้วย
เพื่อทำให้ระบบยังคงทำงานได้อย่างถูกต้อง

แสดงว่าทั้งสอง component มันผูกมัดกันอย่างแรงใช่ไหมครับ ?

โดยได้แบ่งระดับของ Connascence ไว้ดังนี้

เรียงจากความรนแรงน้อยไปมาก หรือ จากความผูกมัดน้อยไปมาก
ซึ่งถ้ายิ่งผูกมัดน้อย การแก้ไขก็ง่าย รวมไปถึงการดูแลรักษาก็ง่าย
แต่ถ้าผูกมัดมาก การแก้ไขก็ยากเป็นเงาตามตัวนะ

  1. Connascence of Name (CoN)
    คือ ทั้งสอง component จะตกลงร่วมกันว่าจะใช้ชื่ออะไรร่วมกัน เช่น ตัวแปร และ method เป็นต้น
  2. Connascence of Type (CoT)
    คือ ทั้งสอง component จะตกลงร่วมกันว่า จะใช้ชนิดของข้อมูลอะไรร่วมกัน
  3. Connascence of Meaning (CoM)
    คือ ทั้งสอง component จะตกลงร่วมกันว่าข้อมูลแต่ละค่า มีความหมายร่วมกันอย่างไร
  4. Connascence of Algorithm (CoA)
    คือ ทั้งสอง component จะตกลงร่วมกันว่าจะใช้ algorithm อะไรร่วมกัน เชน การ encrypt และ decrypt
  5. Connascence of Position (CoP)
    คือ ทั้งสอง component จะตกลงร่วมกันว่าในลำดับของข้อมูล เช่น Array และ ลำดับของ parameter
  6. Connascence of Execution (CoE)
    คือ ทั้งสอง component จะตกลงร่วมกันว่าจะมีลำดับการทำงานอย่างไรบ้าง 1, 2 ,3 เป็นอย่างไร
  7. Connascence of Timing (CoT)
    คือ ทั้งสอง component จะตกลงร่วมกันว่าเวลาในการทำงานเป็นเท่าไร เช่น การกำหนด timeout
  8. Connascence of Value (CoV)
    คือ ทั้งสอง component จะตกลงร่วมกันว่าค่าของข้อมูลที่ใช้ร่วมกันเป็นค่าอะไรบ้าง
  9. Connascence of Indentify (CoI)
    คือ ทั้งสอง component จะตกลงร่วมกันว่าจะ reference ถึง object อะไรร่วมกัน

สามารถแบ่งได้เป็น 2 กลุ่มย่อยๆ

กลุ่มที่ 1 :: คุณสมบัติของ code ตอนยังไม่ทำงาน หรือ static code หรือ ระดับโครงสร้างของ code

  1. Connascence of Name (CoN)
  2. Connascence of Type (CoT)
  3. Connascence of Meaning (CoM)
  4. Connascence of Algorithm (CoA)
  5. Connascence of Position (CoP)

กลุ่มที่ 2 :: คุณสมบัติของ code ตอนทำงาน

  1. Connascence of Execution (CoE)
  2. Connascence of Timing (CoT)
  3. Connascence of Value (CoV)
  4. Connascence of Indentify (CoI)

คำถาม
เราจะแก้ไข หรือ เปลี่ยนแปลง code ให้ไปอยู่อันดับสูงๆ หรือ แรกๆ ได้อย่างไรล่ะ
คำตอบ
ทำการ refactor code ไงล่ะครับ หนีไม่พ้นหรอกนะ !!

Screen Shot 2558-03-05 at 10.38.06 AM

ดังนั้น

ถ้าคุณยิ่งลดระดับของ Connascence ใน code ลงไปได้มากเท่าไร
ก็จะช่วยลดค่าใช้จ่ายในการแก้ไข หรือ เปลี่ยนแปลงระบบได้มากเท่านั้นนะครับ

ตัวอย่างง่ายๆ เช่น
ถ้า method มันมีจำนวน argument เยอะ
ซึ่งทำให้ method มีความซับซ้อนมากๆ
นั่นคือ code อยู่ในระดับของ CoP (Position)
ดังนั้น สามารถแก้ไขด้วยการใช้งาน named parameter มาช่วย
นั่นคือ code จะเปลี่ยนมาอยุ่ในระดับ CoN (Naming)
ผลที่ตามมาคือ ช่วยลดความซับซ้อนลงมา และ ช่วยเพิ่ม locality ของ code อีกด้วย
ทำให้เมื่อแก้ไข code ที่หนึ่งแล้ว จะไม่กระทบกับอีกที่หนึ่ง

ส่วนตัวอย่างของแต่ละระดับของ Connascence นั้น
จะนำมาอธิบายเพื่อให้เข้าใจ และ ให้เห็นภาพต่อไปครับ

Reference Website
http://www.slideshare.net/kevinrutherford/connascence-25245920