Class กับ “The Single Responsibility Principle”
ข้อตกลงเรื่อง Single Responsibility Principle (SRP) ใช้สำหรับการกำหนดว่า class หรือ module ต้องมีอย่างหนึ่งอย่างเดียวเท่านั้นที่จะเปลี่ยน (reason to change).ข้อตกลงนี้ช่วยให้เรากำหนดความรับผิดชอบและขนาดของ class ของเราได้คร่าวๆว่า class ต้องทำงานหรือรับผิดชอบงานเพียงหนึ่งอย่างเท่านั้น
public class SuperDashboard extends JFrame implements MetaDataUser public Component getLastFocusedComponent() public void setLastFocused(Component lastFocused) public int getMajorVersionNumber() public int getMinorVersionNumber() public int getBuildNumber() ... }
จากตัวอย่าง class ด่านบนเราจะเห็นว่า class นี้ทำงานสองอย่าง อย่างแรกคือมันทำหน้าที่จัดการติดตามเรื่องการเปลี่ยนแปลง version ของ software ทุกครั้งที่มีการเปลี่ยนแปลง และอีกงานคือการจัดการเรื่องเกี่ยวกับ Swing Component ดังนั้นเมื่อเราพิจรณาแล้วเราน่าจะเห็นพ้องต้องกันว่าเราน่าจะเอางานที่เกี่ยวกับการติดตาม version ออกมาจาก SuperDashboard แล้วไปสร้าง class ใหม่ที่ชื่อว่า Version จะดูดีกว่า
public class Version {
public int getMajorVersionNumber()
public int getMinorVersionNumber()
public int getBuildNumber()
}
แนวคิดเรื่อง SRP เป็นเรื่องที่สำคัญมากในหัวข้อของ OO design แต่เรามักจะออกแบบให้ class ของเราทำงานมากเกินไป นี่เป็นเรื่องที่น่าสนใจว่าสาเหตุคืออะไร โดยสิ่งที่เราพบคือเราต้องแยกแยะให้ออกว่าการทำซอฟท์แวร์ให้เสร็จกับการทำซอฟท์แวร์ให้ดีและถูกต้องนั้นเป็นเรื่องที่แตกต่างกันอย่างสิ้นเชิง
โดยมากแล้ว Developer มักจะเลือกทำงานให้เสร็จไปก่อนโดยไม่คิดว่าไอ้ที่ทำไปนั้นเป็นสิ่งที่ดีแล้วหรือยังทั้งในแง่ของ best practice และ maintainable เรามักจะคิดว่าปัญหาที่แก้แล้วแปลว่าเสร็จแล้ว เราก็จะกระโดดข้ามไปแก้ปัญหาอื่นๆโดยที่ไม่เคยกลับมาพิจรณาสิ่งที่ทำเสร็จไปแล้วเลยว่า decoupled การทำงานด้วยแนวคิด SRP แล้วหรือยัง
และก็มี developer บางกลุ่มที่ไม่นิยมสร้าง Application ที่ประกอบไปด้วย class ย่อยๆจำนวนมากแต่ไปนิยมการสร้าง class ขนาดใหญ่จำนวนน้อยๆแทน เพราะอะไร? เพราะเขาเหล่านั้นกลับที่จะต้องเปิดคลาสหลายๆคลาสเพื่อไล่การทำงานดังนั้นเขาเหล่านั้นจึงสร้างคลาสใหญ่ไม่กี่คลาสเพื่อให้สามารถไล่การทำงานได้ง่าย แต่ถ้าเราคิดให้ไกลกว่านั้นเราต้องถามคนเหล่านั้นว่า “คุณชอบกล่องเครื่องมือที่ประกอบไปด้วยเครื่องมือขนาดเล็กๆที่มีหน้าที่การทำงานที่ชัดเจน หรือชอบเครื่องมือขนาดใหญ่ที่ทำงานได้หลายๆอย่างโดยที่บางครั้งเราก็ไม่รู้ว่ามันทำอะไร”