[EP Final] บันทึกการลองออกแบบ Software Architecture ด้วย Python

Phachara Kamthong
2 min readMay 30, 2021

--

หลังจากที่เล่าเรื่องวิธีการเขียน 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 การเพิ่ม — ลด โค้ดกันนะครับ

  1. ดูว่าวิธีการ Authentication สามารถ reuse ได้หรือเปล่า ถ้าได้ก็ไม่จำเป็นต้องเพิ่มโค้ดในส่วนนี้
  2. สร้าง Specific APIClient ของเจ้าใหม่ โดยกำหนด api_url
  3. 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 และ คณะเทคโนโลยีสารสนเทศ มจธ. ที่มอบทุนการศึกษาเพชรพระจอมเกล้าเพื่อพัฒนาเทคโนโลยีและนวัตกรรมดิจิทัล ที่เตรียมความรู้สำหรับพร้อมทำงานให้นะครับ

--

--

Phachara Kamthong
Phachara Kamthong

No responses yet