การออกแบบโปรแกรมไม่ใช่เพียงการเขียนโค้ดให้สามารถทำงานได้ตามความต้องการเท่านั้น แต่รวมถึงการสร้างโค้ดให้มีคุณภาพ สามารถดัดแปลง และบำรุงรักษาได้ง่าย ในทางคิดค้น GRASP (General Responsibility Assignment Software Patterns) ถือว่าเป็นแนวคิดที่ช่วยในการวางรากฐานการออกแบบมากมายให้กับนักพัฒนาซอฟต์แวร์ทั่วโลก
GRASP
คือชุดของแนวทางในการจัดหมายความรับผิดชอบให้กับคลาสบางๆ ในระบบโอบเจกต์ออเรียนเต็ด (Object-Oriented System) ที่จะเป็นพื้นฐานในการออกแบบซอฟต์แวร์อย่างมีระเบียบขั้นตอนตามหลักการที่ถูกต้องและมีประสิทธิภาพGRASP ประกอบด้วยหลักการ OOD (Object-Oriented Design) จำนวน 9 หลักการซึ่งได้แก่:
1. Information Expert – จัดหมายความรับผิดชอบให้กับคลาสที่มีข้อมูลที่จำเป็นในการทำงานนั้นๆ 2. Creator – กำหนดว่าคลาสใดควรรับผิดชอบในการสร้างอินสแตนซ์ของคลาสอื่น 3. Controller – กำหนดคลาสที่ควรรับผิดชอบสำหรับการประสานงานและควบคุมเหตุการณ์ระดับระบบหรือในปฏิบัติการในธุรกิจ 4. Low Coupling – ออกแบบระบบให้มีความสัมพันธ์ที่ต่ำระหว่างออบเจกต์ เสริมสร้างความยืดหยุ่นและการใช้งานใหม่ 5. High Cohesion – ทำให้คลาสมีหน้าที่ที่เกี่ยวข้องและจำกัดเข้าด้วยกัน ลดความซับซ้อนและเพิ่มการบำรุงรักษา 6. Polymorphism – ใช้โพลีมอร์ฟิซึมเพื่อดำเนินการที่กำหนดตามชนิดของออบเจกต์ 7. Pure Fabrication – สร้างคลาสที่ไม่ตรงกับความเป็นจริงในโดเมนโมเดล เพื่อแยกความรับผิดชอบในการขึ้น 8. Indirection – ลดการควบคุมระหว่างคลาสโดยการรับความรับผิดชอบในการนำทางหรือสื่อสารผ่านคลาส intermediaries 9. Protected Variations – ออกแบบระบบให้ความเปลี่ยนแปลงไม่กระทบกับคลาสอื่นๆประโยชน์ของ GRASP ในทางเขียนโปรแกรม
การใช้ GRASP ในการออกแบบเป็นการช่วยให้นักพัฒนาสามารถรักษาหลักการเขียนโปรแกรมที่ดีได้ ซึ่งรวมถึง:
- ความเข้าใจที่ชัดเจน: การหมายหน้าที่ให้กับคลาสแต่ละคลาสด้วยความชัดเจนสามารถทำให้คนอ่านโค้ดหรือทีมพัฒนาเข้าใจโครงสร้างและการทำงานของระบบได้ง่ายขึ้น - การบำรุงรักษาที่ง่าย: ด้วยการมี low coupling และ high cohesion จะทำให้การเปลี่ยนแปลงหรือการทดสอบระบบง่ายขึ้นเพราะการแก้ไขจะมีผลกระทบน้อยลงกับส่วนอื่น - การนำไปใช้ใหม่: โค้ดที่ออกแบบมาอย่างดีสามารถนำไปใช้ใหม่ในโปรเจกต์อื่นหรือบริบทอื่นๆได้ ส่งผลให้ลดเวลาและค่าใช้จ่ายในการพัฒนากรณีใช้ GRASP ในการออกแบบ
เพื่อให้เห็นภาพชัดเจน ลองพิจารณาการพัฒนาระบบจัดการหนังสือในห้องสมุด เริ่มแรก ควรต้องระบุความรับผิดชอบ (responsibilities) และวิเคราะห์ที่ตั้งของแต่ละคลาส ดังนี้:
- หนังสือ (Book): คลาสนี้สามารถถือความรับผิดชอบเกี่ยวกับข้อมูลเฉพาะของหนังสือ เช่น ชื่อ, ผู้แต่ง รวมไปถึงการดำเนินการบางอย่างที่เกี่ยวข้องกับหนังสือ - ห้องสมุด (Library): คลาสนี้มอบหน้าที่ในการจัดการคลังหนังสือ ซึ่งรวมถึงการเพิ่มเล่มใหม่ และการยืมหนังสือความรับผิดชอบที่วางอย่างชัดเจนนี้ช่วยให้การพัฒนาโปรเจกต์มีชั้นเชิงมากขึ้น และเพิ่มความเป็นไปได้ในการนำโค้ดไปใช้ใหม่ในภายหลัง
public class Book {
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
// Methods related to book's behavior
}
public class Library {
private List books;
public Library() {
this.books = new ArrayList<>();
}
public void addBook(Book book) {
books.add(book);
}
// Other methods related to manage the library
}
ในตัวอย่างโค้ดด้านบนแสดงถึงการออกแบบเบื้องต้นที่ใช้ GRASP ในการจัดการหน่วยความรับผิดชอบทั้งในคลาสหนังสือและห้องสมุด โดยที่แต่ละคลาสมีการจัดการหน่วยความรับผิดชอบที่ชัดเจน
การศึกษาการเขียนโปรแกรมที่ดีไม่ใช่เรื่องของการเรียนรู้ภาษาโปรแกรมมิ่งเพียงอย่างเดียว แต่รวมถึงการเรียนรู้วิธีการออกแบบที่ดีด้วย เช่น GRASP ที่สอนให้นักพัฒนาเข้าใจวิธีการแบ่งหน้าที่ความรับผิดชอบในการเขียนโค้ด การศึกษาแนวทางเหล่านี้จะทำให้การเขียนโปรแกรมเป็นมากกว่าการเข้ารหัส แต่เป็นการสร้างงานศิลปะที่ตรงกับความต้องการและมีคุณภาพ หากคุณสนใจที่จะศึกษาการออกแบบและการเขียนโปรแกรมอย่างลึกซึ้ง หลักการ GRASP นี้บางทีอาจเป็นจุดเริ่มต้นที่ดีสำหรับคุณในการเป็นนักพัฒนาซอฟต์แวร์มืออาชีพที่มีคุณภาพในอนาคต.
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากเจอข้อผิดพลาด หรือต้องการพูดคุย ติดต่อได้ที่ https://m.me/expert.Programming.Tutor/
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM