[EP Final] บันทึกการลองออกแบบ Software Architecture ด้วย Python
หลังจากที่เล่าเรื่องวิธีการเขียน OOP บน Python กันมาใน EP ที่ 1 แล้ว EP นี้ จะมาพูดถึงในเรื่องของ Requirement, การมองภาพรวม และการโค้ดด้วย Python กันนะครับ
สำหรับใครที่ยังไม่แน่ใจว่าโค้ด OOP บน Python อ่านยังไง สามารถอ่านได้ที่ [EP1] บันทึกการลองออกแบบ Software Architecture ด้วย Python
หมายเหตุ: Requirement ที่นำมายกตัวอย่าง ไม่ได้เป็น Requirement ของที่ทำงานจริง แต่มีกลิ่นอายคล้าย ๆ กัน และพยายามจะแทรกถึงปัญหาที่พบเจอคล้าย ๆ กัน
Requirement
ผมจะขอยกตัวอย่างที่เป็นเรื่องใหญ่ของสถานการณ์ทั่วโลก มาเป็น Requirement เพราะว่าเป็นเรื่องที่ทุกคนจะเก็ทถึงรายละเอียดได้ง่าย แบบไม่ต้องอธิบายอะไรเยอะ
ณ สถานการณ์ไวรัสระบาดในช่วงนี้บริษัทวัคซีนต่าง ๆ จะต้องดีลกับแต่ละประเทศ โดยประเทศนี้จะต้องรองรับการเชื่อมต่อไปยังระบบ API ของบริษัทวัคซีนต่าง ๆ
จากรูปจะเห็นว่าเรามี Action ที่ต้องการใช้งานกับบริษัทวัคซีนต่าง ๆ มากมาย ซึ่งการติดต่อไปยังบริษัทวัคซีนจำเป็นต้องมีการยืนยันตัวตนด้วยว่าประเทศไหนเป็นคนที่ติดต่อเข้าไป โดยมี Requirement ว่า เราจะต้องเพิ่มบริษัทวัคซีนได้อย่างรวดเร็ว หรือพูดง่าย ๆ ว่าถ้าเราต้องเราจะเพิ่มโค้ดเพื่อติดต่อกับบริษัทวัคซีนใหม่ ๆ จะต้องทำได้โดยง่าย
(สมมุติ) หลังจากที่เราไปศึกษามาว่าบางที่เราอาจจะต้องระบุตัวตนด้วย Username/Password บางที่อาจจะต้องใช้ Token ที่ได้รับจากการทำ OAuth มา ซึ่งหากเรานำมาร่างเป็น Model คร่าว ๆ ก็อาจจะได้ภาพประมาณนี้
ถ้านำมาลองเขียนเป็นโค้ด น่าจะออกมาเป็นประมาณนี้
ถ้าอยาก Customize ตัว Authentication ก็จะได้ประมาณนี้
เรามาลองดูโค้ดตัว client ต่าง ๆ กัน
ทีนี้เราลองมาทบทวนกันว่าที่เราออกแบบมาตรงตาม Goal ที่เราสามารถเพิ่มโค้ดได้ง่ายจริงหรือเปล่า มาลองดู step การเพิ่ม — ลด โค้ดกันนะครับ
- ดูว่าวิธีการ Authentication สามารถ reuse ได้หรือเปล่า ถ้าได้ก็ไม่จำเป็นต้องเพิ่มโค้ดในส่วนนี้
- สร้าง Specific APIClient ของเจ้าใหม่ โดยกำหนด api_url
- Implement method ตาม abstract method -> ถ้า step action ข้างใน method ไม่ต่างจากของตัวอื่น ก็ก้อบวางได้เลย
จากที่ลองทำตาม Check list ก็ดูง่ายดีนะสำหรับตัวผม หากลองลบโค้ดของบางบริษัท Vaccine ไปละ จะกระทบต่อตัวอื่นไหม ซึ่งจะเห็นได้ว่าโค้ดของแต่ละตัวบริษัท Vaccine ไม่ได้ depend on โค้ดของบริษัทตัวอื่นเลย ซึ่งหากเราลบแล้ว ก็จะไม่กระทบใด ๆ เลย
โลกไม่ได้สวยหรู (เหตุการสมมุติ)
โลกไม่ได้สวยหรูเสมอไป สำหรับบางประเทศอาจจะไม่ได้อยาก deal vaccine เพิ่ม เพราะได้ทำการทุ่มงบกับทางบริษัทไปแล้ว สมมติว่ามีการทุ่มกับ Sinovac กับ Astrazenaca ไป ซึ่งทำให้บริษัทอื่นที่เข้ามาขอดีลแบบลดราคาให้ต้องถูกปัดตกไป กลายไปเป็นวัคซีนทางเลือกแทน
เหตุการณ์เช่นนี้ทำให้เราต้องมาออกแบบตัว APIClient ใหม่ เพราะ Diagram ที่เราออกแบบมาใช้งานไม่ได้แล้ว เพราะไม่สามารถ Implement ได้ตาม Action ที่ requirement บอกไว้ได้ทั้งหมด
ทีนี้เรามา Recap กันดีกว่า ว่าแต่วัคซีนเราสามารถทำ Action อะไรได้บ้าง
จะเห็นได้ว่าทุกเจ้ามีสิ่งที่ทำได้เหมือนกันคือขอข้อมูลวัคซีน, ขอผลแลป, ส่งคำขอนัดคุย
ทีนี้เราลองมาปรับ Diagram กันนะครับ จะออกมาเป็นลักษณะไหน
เราทีนี้เราก็จะได้โค้ดหน้าตาประมาณนี้
โดยจริง ๆ ก็จะมี Abstract level ที่สูงกว่านี้อีก เป็นส่วนของการเรียกใช้เราก็สามารถนำ Design pattern ต่าง ๆ เข้ามา Adapt ได้ ให้ลดรูปเวลาเรียกใช้เหลือประมาณนี้
แต่ผมจะไม่ขอลงรายละเอียดในส่วนนี้นะครับ โดยสามารถศึกษา Factory Design Pattern ต่อได้ที่ Factory Method (refactoring.guru)
หากข้อมูลที่เขียนมามีผิดพลาดอะไรไปบ้างหรือมีอะไรเสนอแนะ ผมรับฟังทุกเรื่อง สามารถมาบอกกันได้เสมอนะครับ ขอบคุณทุกคนมากนะครับ 😆
บทความนี้จะเกิดขึ้นไม่ได้ หากไม่ได้รับการสนับสนุนจาก depa และ คณะเทคโนโลยีสารสนเทศ มจธ. ที่มอบทุนการศึกษาเพชรพระจอมเกล้าเพื่อพัฒนาเทคโนโลยีและนวัตกรรมดิจิทัล ที่เตรียมความรู้สำหรับพร้อมทำงานให้นะครับ