กราบสวัสดีทุกๆคนที่เข้ามาอ่านบทความบทความของผมนะครับ นี่เป็นบทความที่ 2 แล้วนะครับ เอาหละสำหรับบทความนี้จะมากล่าวถึง หนึ่งในแนวคิดแบบ 2c ทูซี คือ Cohesion และ Coupling ในที่นี้ผมจะกล่าวถึง Cohesion
อืมม แล้วเจ้า Cohesion มันคืออะไรกันนะ ถ้าพูดถึงการออกแบบส่วนประกอบของซอฟต์แวร์แล้วหละก็คงจะประกอบไปด้วยหลาย File มีหลาย Main Method เพื่อความมั่นใจว่า Code ที่เราออกแบบมานั้น จะไม่มีการทำงานที่ซับซ้อน หรือมีส่วนประกอบและโครงสร้างที่มากเกินไป ซึ่งต่อไปข้างหน้าเวลาแก้ไข Code จะส่งผลกระทบไปทั้งระบบ Cohesion และ Coupling จึงเป็นตัวช่วยอย่างดีเลยหละครับ
Cohesion คือ อะไร ?
Cohesion คือ การบอกถึงความสอดคล้องกันของการทำงานในหน่วยใดๆ เช่น ถ้าเรามองในมุมของ Coding ในระดับ Class ความสอดคล้องกันของ Class นั้น หมายถึง Method การทำงานต่างๆที่ควรจะเป็นไปในทางเดียวกัน
เช่น Class ของรถยนต์ ควรมีการทำงานเฉพาะของรถยนต์้เท่านั้น
Class ในการจัดการ Export ไฟล์ Excel(.csv) ต้องความมีการส่วนของการสร้าง File CSV การแปลงข้อมูลชนิดต่างๆ ให้เหมาะสมกับไฟล์ (.CSV) เท่านั้น ไม่ใช่มี Method ในการ Validate เข้ามาเกี่ยวข้อง เป็นต้น
แล้วทำไมเราต้องทำให้เกิดความสอดคล้อง (Cohesion) หละ ?
เพราะ เราต้องการจัดกลุ่มของการทำงานให้เป็นหมวดเดียวกัน ให้อยู่ใน Class เพื่อให้ง่ายต่อการ Maintain และการเพิ่มเติมการทำงานในอนาคต
ลองมองง่ายๆ ถ้า Code Export Excel (.CSV) มันมีการทำงานกระจายไปหมดทุก Module ถ้าเปลี่ยน Requirement ที = งานเข้า
ชนิดของ Cohesion จากแย่ที่สุด ไป ดีที่สุด
- Coincidental Cohesion(แย่ที่สุด): กิจกรรม หรืองานต่างๆ ถูกนำมาจัดกลุ่มรวมกันใน Module โดยไม่มีความสัมพันธ์กันเลย เราอาจจะเรียกว่าเป็น “Utilities” class หรือ Util Class ก็ได้
ตัวอย่าง: Class A ที่ Method สำหรับ Connect DB และ Export File - Logical Cohesion: กิจกรรม หรืองานต่างๆ ถูกนำมาจัดกลุ่มรวมกันใน Module เดียวกัน โดยดูจากปัจจัยอย่างใดอย่างหนึ่ง เช่น Input หรือ Output เป็นต้น แต่ธรรมชาติของการทำงานของมันจะไม่เหมือนกัน
ตัวอย่าง: Class B ที่จัดกลุ่ม Method สำหรับ BackFile และ Export File ไว้ในกลุ่มเดียวกัน เพราะ มีการเขียนไฟล์ออกมาเป็น Output เหมือนกัน - Temporal Cohesion : กิจกรรม หรืองานต่างๆ ถูกนำมาจัดกลุ่มรวมกันใน Module เดียวกัน เนื่องจากเวลาการทำงานเกิดขึ้นพร้อมๆกัน
ตัวอย่าง: Class C จัดกลุ่มสำหรับดึงค่า config, ดึงข้อมูลผู้ใช้ล่าสุด และสร้างที่เก็บ Log File - Procedural Cohesion : กิจกรรม หรืองานต่างๆ ถูกนำมาจัดกลุ่มรวมกันใน Module เดียวกัน เพราะเนื่องจากมีขั้นตอนของการทำงานที่แน่นอน
ตัวอย่าง: Class D จัดกลุ่ม Method สำหรับตรวจสอบสิทธิไฟล์ และ การเปิดไฟล์ มารวมกัน - Communicational/informational cohesion : กิจกรรม หรืองานต่างๆ ถูกนำมาจัดกลุ่มรวมกันใน Module เดียวกัน เพราะมีการจัดการกับข้อมูลตัวเดียวกัน
ตัวอย่าง: Class E จัดกลุ่ม Method InsertStudent, EditStudent, DeleteStudent และ ListStudent รวมกัน เพราะมีการยุ่งกับข้อมูลเดียวกัน คือ ข้อมูลของนักเรียน(Student) - Sequential Cohesion : กิจกรรม หรืองานต่างๆ ใน Module โดย Output ที่ได้จากนั้น อาจจะเป็น Input ของอีกกิจกรรม หรืองาน อื่นๆ
ตัวอย่าง: Class F จัดกลุ่ม Method GetCommissionRate กับ Method GetTotalPrice มารวมกัน เพราะ Method GetTotalPrice ต้องใช้อัตรา Commission จาก Method GetCommissionRate - Functional Cohesion(ดีที่สุด) : กิจกรรม หรืองานต่างๆ ใน Module มีหน้าที่ทำงานเพียงอย่างเดียว
ตัวอย่าง: Class G มีหน้าที่การทำงานอย่างเดียว คือ การ Connect Database
ระบบที่ดีความออกแบบให้มี Cohesion สูง (งานที่เหมือนกัน ควรอยู่ในกลุ่มเดียวกัน)
ส่วน Coupling จะพูดถึงคร่าวๆ Coupling คือ ระดับความเกี่ยวข้อง หรือ พึ่งพากันของ Module ต่างๆในระบบ ซึ่งระบบที่ดีควรออกแบบให้ Module ต่างๆเป็นอิสระจากกันมากที่สุด ถ้าเรามองในมุม Coding คือ การทำให้ Object ต่างๆ มีการอ้างอิงกันน้อยที่สุด เท่าที่จะเป็นไปได้
ตัวอย่าง Class A มีการดึงข้อมูลราคาหุ้นจาก Web Service และ Class B มีหน้าที่ในการหา Market Value ของ Portfolio ถ้า Class A มีการเปลี่ยนแปลง โดยเพิ่ม Parameter เข้าไป จะส่งผลให้ Class B ต้องเพิ่ม Parameter เข้าไปด้วย
ขอขอบพระคุณที่สละเวลาเข้ามาอ่านบทความนะครับ หลังว่าบทความนี้จะสร้างประโยชน์ให้แก่ผู้ที่สนใจได้
หากข้อความใดผิดพลาด ก็ต้องขออภัยไว้ ณ ที่ด้วย ขอคุณครับ
Reference
– http://naiwaen.debuggingsoft.com/2014/07/cohesion-vs-coupling/