Viper Design Pattern for dummy — Viper ง่ายๆ ใครก็เข้าใจ!

Ratchanon Insuvanno
Lotus’s IT
Published in
2 min readMar 17, 2023
ความยากของในแต่ละ DP

สวัสดีครับ ทุกคน ผมผู้เขียนโน่

วันนี้จะมาทําการเล่าเรื่องหลักการง่ายๆ ของ Design Pattern Viper

สําหรับใครที่สงสัย Viper คืออะไร ผมจะสรุปให้สั้นๆ 6–7 บรรทัดนะครับ (ฮา)

“Viper เป็นรูปแบบการออกแบบที่ใช้รูปแบปที่ผมเรียกว่า ‘การแยกส่วนหน้าที่’ ซึ่งความหมายของมันก็คือใน 1 หน้า จะ มีไฟล์ประกอบด้วยกันทั้งหมด 5 ไฟล์ ด้วยกัน ซึ่งเเต่ละไฟล์สามารถที่จะจบทุกอย่างได้ด้วยตัวมันเองโดยไม่ต้องพึ่งกับ ไฟล์ใดๆ”

โดยประกอบด้วยไฟล์ดังต่อไปนี้~

View หรือ Viewcontroller โดยไฟล์นี้มีหน้าที่อย่างเดียวเลยก็คือ การแสดงผลลงบนหน้าจอและรับ input จาก user

Presenter ไฟล์ที่สําคัญที่สุดในการเชื่อมสิ่งต่างๆ โดยไฟล์นี้ เป็นตัวกลางที่จะคอยสื่อสารไปมาระหว่าง (ViewController ซึ่งจะคอย Update UI และรับ Input) และ (Interactor ที่คอย เรียกไปหา Serviceต่างๆ) ซึ่งทั้ง3จะคุยกันผ่านทางสิ่งที่เรียกว่า Protocol นั้นเองครับ

Interactor ไฟล์ที่รวบรวม business logic ของแอพไว้เอาไว้ใช้สําหรับ call ไปหา service ต่างๆโดยคอยจะคุยกันผ่านทาง Presenter

Router ไฟล์นี้ทําหน้าที่ในการ Navigate หรือเปลี่ยนหน้าไป หน้าอื่นๆ โดยจะคอยรับ Input ที่ถูกส่งผ่านทาง ViewController -> Presenter -> Router นั้นเอง…

และท้ายที่สุดคือ Moduels โดย เจ้าสิ่งนี้เป็นตัวที่จะทําคอยเชื่อม 4ไฟล์ข้างต้นด้วยกัน

และด้านล่างคือ รูปการสื่อสารระหว่างกันของ Viper โดยเรียงลําดับเลขจากน้อยไปมากสุดครับ

สรุปการเมื่อ ViewDidLoad ทํางานของ Viper

สําหรับใครที่สงสัย Input กับ Output มาๆ มานั่งกับผมตรงนี้เดียวผมเหล้าให้ฟังครับ

คือโดยหลักแล้วในแต่ละไฟล์ไม่ว่าจะเป็น Design Pattern ใหนก็ตามการที่จะคุยกันระหว่างไฟล์ส่วนใหญ่จะสื่อสารผ่านกันโดยสิ่งที่เรียกว่า Protocol และที้นี้ เเต่ละ Design Pattern ส่วนใหญ่จะมี Protocol มีเเค่ 1 หรือน้อยกว่า เพื่อคุยกัน เเต่ Viper ออกจะพิเศษกว่าใครเพื่อนตรงที่ว่ามันจะมีสิ่งที่เรียก ว่า Input และ Output

โดยในแต่ละไฟล์ไม่ว่าจะเป็น Viewcontroller,Interactor หรือ Router ก็ตามโดยจะมี Protocol Input และ Output โดยรูปด่านล่างผมขอยกตัวอย่าง
ViewController , Intearctor ครับ

MockPageToday ViewController
MockPageToday Interactor

โดยอะไรเป็นตัวจําแนกว่าฟังชั่งนี้ต้องเป็น Input หรือ Output

สําหรับผมโดยส่วนตัวจะมีหลักการจําประมาณนี้ครับ

“Output คือ อะไร ที่ มากระทํากับไฟล์นี้ โดยยึดหลักว่าไฟล์นี้คือไฟล์อะไร เช่น มี action จาก ViewController (ผู้กระทํา) มากระทํากับ Presenter (ผู้ถูกกระทํา) ฉะนั้นเราจึงสามารถเขียนได้ว่า”

ViewController.viewdidload

ซึ่งเมื่อเรียก output?.viewdidload() แล้วมันจึงจะไปเชื่อมกับ Presenter และจะทําการเรียก View?.configure ที่อยู่ใน ViewController(Output)

Presenter

และกลับไปยัง ViewController(Input) นั้นเอง

ViewController(Input)

“แล้ว Input หละ ? สําหรับ Input จะเป็นตรงกันข้ามกันกับเมื่อกี้ซึ่งถ้าเรามอง Presenter เป็นผู้ถูกกระทําเราจะมองมันกลับด้านกันทันทีเช่น Presenter เรียก ViewController ผ่านทาง Input เหมือนรูปด้านบนนั้นเองครับ

และในท้ายสุด Modules คืออะไรต้องประกอบด้วยอะไรบ้าง

ส่วน Module นั้นจะเอาไว้ใช้สําหรับในการ Init ไฟล์ต่างๆขึ้นมาเพื่อเชื่อมแต่ละไฟล์เข้าด้วยกัน โดยส่วนตัวแล้วก็สามารถ copy paste กันได้เลยครับ

สําหรับหลักงานทํางานที่เป็นสาระสําคัญของ Viper ก็น่าจะหมดเพียงเท่านี้ครับ

เเต่ยังมีหลายส่วนที่ผมละไว้ไม่ได้อธิบายเนื่องจากมันค่อนข้างซํ้าซ้อนกับ DP อื่นๆ เช่น การทํา DI หรือ วิธีการเขียน Init
ขอบคุณทุกคนที่สละเวลามาอ่านบทความของผมนะครับ

--

--