# MVC

## **MVC**

**MVC** เป็นการแบ่งส่วนโปรแกรมออกมาเป็น 3 ส่วนหลัก ๆ นั่นคือ Model, View และ Controller&#x20;

**Model** เป็นส่วนที่จะบอกว่าแอพของเรา**ทำอะไร** **ไม่ใช่บอกว่าแสดงอย่างไร** สามารถนำไปใช้ได้โดยไม่ขึ้นว่าหน้าตาของแอพเราจะเป็นอย่างไร  \
\&#xNAN;*What* your application is (not *how* it is displayed)

**Controller** เป็นส่วนที่ทำหน้าที่ว่าจะเอาโมเดลนั่นมาแสดงให้ผู้ใช้งานอย่างไร โดยอาศัย View อีกทีนึง (How your model is presented to user)

**View** เป็นเหมือนลูกกระจ๊อกของ Controller ในการใช้แสดงผลและรับ interaction จากผู้ใช้ เช่น Button, TextField, Label หรืออื่น ๆ (Controller's minions)

![แบ่งออกเป็นสามส่วนหลัก ๆ](https://144845262-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGk7Utff0rVWsqK4eYO%2F-LGnPzWqGkDuFPQyb29r%2F-LGnQwz3PN9joGmjBFVH%2FScreen%20Shot%202018-07-07%20at%2013.30.40.png?alt=media\&token=c383b179-7bce-4bbe-89b5-ff992a6bca51)

**Controller** จะติด**ต่อโดยตรง**กับ **Model** และ **View** โดยที่การติดต่อกับ View เราจะเรียกว่า เชื่อมผ่าน **Outlet**

Model กับ View จะไม่คุยกันเอง เพราะ Model จะต้องไม่ยุ่งเกี่ยวกับ View

![](https://144845262-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGk7Utff0rVWsqK4eYO%2F-LGnPzWqGkDuFPQyb29r%2F-LGnR8UfMSyunYINvRQj%2FScreen%20Shot%202018-07-07%20at%2013.31.32.png?alt=media\&token=83a9d08a-5669-4530-86b7-5afd728ede88)

แล้ว View จะคุยกับ Controller ได้ไหม คำตอบคือคุยแบบไม่รู้ว่า Controller นั้นเป็นใคร View จะไม่รู้จัก Controller นั้นโดยตรง ถ้าเป็น Action เช่นกดปุ่ม Controller จะทำหน้าที่ตั้ง Target ไว้บนตัวเองแล้วให้ View ยิง Action มาหา หรือ View เรียกผ่าน Delegate, DataSource โดย controller จะทำตัวเองเป็น Delegate หรือ DataSource แล้วบอก view อีกทีหนึ่ง

แล้วโมเดลหล่ะ ถ้ามีข้อมูลเปลี่ยนต้องบอก Controller ให้ update view จะทำอย่างไร คำตอบคือ model สามารถส่งสัญญาณออกมาได้เหมือนตั้งเสาวิทยุ โดยที่ controller จะต้องตั้งเสารับเอาไว้ (นึกถึง model broadcast noti ออกมาโดยมี Controller observe อยู่)

![](https://144845262-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGk7Utff0rVWsqK4eYO%2F-LGnPzWqGkDuFPQyb29r%2F-LGnRbR4xg1JnHo-kpcT%2FScreen%20Shot%202018-07-07%20at%2013.33.41.png?alt=media\&token=e49b8910-db30-4237-8f63-99df4d220a83)

MVC สามารถมีได้หลาย ๆ ชุดเชื่อมโยงต่อกันโดยใช้การสื่อสารตามที่ระบุไปข้างต้น

![](https://144845262-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGk7Utff0rVWsqK4eYO%2F-LHcRpn-heal5CniZtZ-%2F-LHcYSeh451ooEg382H4%2FScreen%20Shot%202018-07-17%20at%2021.03.24.png?alt=media\&token=f0e9b7c0-1d9e-4277-ae60-38fc42aa9fb3)

{% hint style="info" %}
ดูรายละเอียดเพิ่มเติมได้จากคลาส Stanford CS 193P 2017 \
[Lecture 2: MVC; iOS, Xcode and Swift Demonstration](https://www.youtube.com/watch?v=-auG-myu02Q)
{% endhint %}
