Posts Tagged Obj-C
Cocoa & iPhone Development : MVC Design Pattern
มาว่ากันด้วยเรื่องแรกที่เราต้องรู้จากที่กล่าวไว้ข้างต้นนะครับ(ถ้าไม่นับว่าต้องมีเครื่องแมค อันนั้นมีตังซื้อก็พอแล้ว อิอิ) เรื่องเกี่ยวกับ MVC (Model-View-Controller) Design Pattern นั่นเอง
อันที่จริง เกี่ยวกับ MVC นี้ หาอ่านได้ไม่ยากในอินเตอร์เนต ทั้งภาษาอังกฤษและภาษาไทย ซึ่งหลายๆที่ก็อธิบาย MVC ในเทอมต่างๆภาษาและเฟรมเวิร์คกันไป เช่น MVC บน PHPCake(PHP) หรือ MVC บน Ruby on Rails(Ruby) ในที่นี้ ผมเองก็จะขออธิบายในเทอมของ Cocoa ละกันนะครับ
เริ่มเลยแล้วกัน…
MVC Design Pattern คือ Design Pattern ในระดับ Architecture แบบนึง ที่ได้รับความนิยมในการ Design Application ขนาดใหญ่ในปัจจุบัน ตัว MVC ในชื่อของมัน ย่อมาจากคำว่า Model-View-Controller ซึ่งก็ตรงตัวกับลักษณะของมันนั่นเอง ซึ่งก็คือ “การแบ่งองค์ประกอบของ Application ออกเป็นสามส่วนแยกออกจากกัน” ซึ่งแต่ละส่วนจะทำงานเชื่อนโยงกันในลักษณะดังภาพ

Cocoa MVC - ภาพจาก Apple.com
แนวคิดของ Design Pattern จากภาพจะเห็นว่า แอพพลิเคชั่นแบ่งออกเป็น 3 ส่วน คือ View และ Model เชื่อมต่อกันผ่าน Controller แล้วแต่ละส่วนมันเป็นยังไงไงบ้างหล่ะ ?
Model คือ ส่วนของข้อมูล ตัวอย่างเช่น Database หรือ Datasource ของตารางใน Application เป็นต้น Model อาจรวมถึง State ของ Application ได้ด้วยเช่นกัน เช่น Preference Setting ของโปรแกรมก็ได้ ไม่ได้จะหมายถึง Information อย่างเดียวเท่านั้น ซึ่งตัว Model เองก็จะต้องมี Model Logic อยู่ด้วย ซึ่งก็หมายถึง เงื่อนไขการเข้าถึงหรือการเก็บข้อมูล จะเก็บอย่างไร ชนิดไหน อย่างไร ฯลฯ (ในส่วนของ Model Logic จะเห็นชัดเมื่อเรารู้จัก Property List ใน Objective-C 2.0 ที่จะพูดถึงในภายหลังนะครับ ตอนนี้ Push Stack ไว้ก่อนนะครับ) หน้าที่ของ Model ไม่มีอะไรไปมากกว่า “การเก็บข้อมูล” และ “การส่งข้อมูล” เท่านี้จริงๆครับ ไม่มีมากไปกว่านี้ อย่าสับสนกับ Model Logic นะครับ
View คือ ส่วนของการแสดงผล เช่นกันครับ หน้าที่ของ View ไม่มีไปมากไปกว่า “การแสดงผล” และ “การรอรับคำสั่ง” View ที่เห็นๆกันก็คือ GUIs นั่นแหละครับ ภายใน View ก็เหมือนกับ Model ครับ ต้องมี View Logic เช่นกัน View Logic ก็คือข้อกำหนดของการแสดงผลครับ หน้าต่างกว้าง-ยาว แค่ไหน ปุ่มเป็นสไตล์ไหน ตัวอักษรสีอะไร ฯลฯ นีแหละครับ View Logic น่าจะพอเห็นภาพนะครับ
Controller ส่วนนี้เป็นส่วนที่เชื่อมการทำงานระหว่าง Model กับ View จะพูดให้ง่ายกว่านั้นก็คือ มันคือ “User Logic หรือ Action Logic” ครับ เพราะมันเป็นส่วนควบคุมการทำงานของ User ที่ทำต่อ Application นั่นเอง ว่า User ทำอะไรได้บ้าง แล้ว Application ต้องทำอะไรบ้างเมื่อได้รับ Action นั่นมาแล้ว นั่นคือหน้าที่ของ Controller ครับ
ใน Cocoa Framework ยังมี Object อีกประเภทนึง เรียกว่า “Hybrid Model” ซึ่งหมายถึง Model ที่รวม Model กับ Controller เข้าไว้ด้วยกัน เพราะบางครั้งการแยกกันแบบ MVC อาจไม่ได้เหมาะสมกับ Application ทุกแบบ(รวมกันอาจจะดีกว่า ง่ายกว่า เร็วกว่า) ตัวอย่างของ Hybrid Model ใน Cocoa ก็เช่น Array Controller เป็นต้น และใน iPhone App Dev ก็เช่น Image Picker เป็นต้น(นอกจากนี้ยังมีอีกเยอะ แต่ยังไม่ได้ลอง) ซึ่งก็จะได้รู้จักกันภายหลังนะครับ (Push Stack ไว้อีกอันแล้วกันนะครับ)
ในส่วนของ MVC ก็ขอจบไว้เท่านี้นะครับ สามารถศึกษาเรื่องของ MVC ได้จากที่อื่นด้วยนะครับ บางที่อาจจะเขียนดีกว่าผมซะอีก เห็นว่ายังไงก็แนะนำกันได้นะครับ แล้วเจอกันใน Entry ถัดไปนะครับ (กะว่าจะอธิบายสั้นๆนะ ทำไมมันยาวไปซะได้ละเนี่ย เหอๆ)
Let’s talk about first thing, which you must know before start to iPhone application development, It’s MVC Design Pattern
In fact, You can find an article about MVC very easy from internet. Thai and English both. Each articles will explain about MVC in term of any language and framework such as MVC on PHPCake(PHP) or MVC on Ruby on Rails(Rails). So, I’ll explaining MVC in term of Cocoa Framework .
Let’s start
MVC Design Pattern is one Design Pattern in “Architecture Level” which popular in “Large scale application design” in this time. MVC is stand for Model-View-Controller which explain self structure from name is “Separate an element of application to 3 parts”. Each part is work together like in illustrate.

Cocoa MVC - ภาพจาก Apple.com
From the illustrate, you see Application separate in 3 parts is “View” and “Model” is connected by controller. How its work?
Model is data storage part. Such as Database or Data source in table in application. Model part is can be include state of application like preference setting not only “Information”.Model must have a “Model logic” inside. Model logic is a “Condition for storage”, how to storage?, which type and etc (we’ll talk about this again in “Property list in Objective-C 2.0 entry). A load of Model is not more than “storage” and “retrieve” a data. Not more than that.
View is a show result part. Same as “Model” a load of View is not more than “Show result” and “Wait for action”. A well-known View is GUIs. Inside View must have “View Logic” like Model too. Model Logic is an attribute for display such as Dimension (height-width), button style, font color and etc.
Controller is a connection part with “Model” and “View”. Say an easier is a “User Logic” or “Action Logic”. Because its controlled an action of user to do on application. What user can do ?. When got an action, What should application do ? , This is Controller load.
In Cocoa Framework still has one object type called “Hybrid Model”. Its a Model which have controller integrated. Because maybe a separate in 3 part like MVC is not good solution for all. For example for “Hybrid model” on Cocoa such as “Array Controller” and in iPhone App Dev is such as “Image Picker”. We’ll say again in later.
I finished entry about MVC only this. You can read MVC article from other place (somewhere can explain better than me). See you again in next Entry.
4 comments มกราคม 24, 2009
CS193P : iPhone Application Development
ช่วงนี้กำลังง่วนๆอยู่กับการหัดเขียน Application บน iPhone ครับ แรกๆคิดว่าไม่น่าจะแตกต่างอะไรกับการพัฒนา Application บน Mac แต่เอาเข้าจริง ก็ไม่หมูอย่างที่คิด เพราะไม่เหมือนกับ Cocoa ซะทีเดียว มีรายละเอียดต่างๆที่ต้องเก็บเพิ่มเติมมากขึ้น โดยเฉพาะการจัดการ Memory ที่ต้องทำให้มีประสิทธิภาพและต้องจัดการด้วยตัวเอง ทั้งที่เขียนด้วย ObjC 2.0 แต่บน iPhone ก็หมดสิทธิ์ใช้ GC (Garbage Collector) อยู่ดี และยังมีส่วนอื่นๆที่ยังไม่ขอพูดถึงในที่นี่
หลังจากที่ Apple ยกเลิกสัญญา NDA (สัญญาเกี่ยวกับการเผยแพร่ข้อมูลการพัฒนา Application บน iPhone) หนังสือ บทความต่างๆก็เริ่มผุดออกมาเป็นดอกเห็ด ซึ่งก็นับว่าเป็นเรื่องดีของ Developer อย่างเราๆ ซึ่งก็นับรวมถึง Course IPhone Application Development ของ มหาวิทยาลัย Stanford ด้วย
หลังจากที่ผมรู้ข่าวเรื่องที่ Stanford ปล่อย Lecture รายวิชานี้ออกมาให้ดูกันได้แล้ว ผมก็แทบจะเข้าไปดูทันที และพบว่า “มันน่าสนใจมากๆ” Course นี้เหมาะสำหรับผู้ต้องการเริ่มต้นพัฒนา Application บน iPhone จริงๆครับ เพราะเริ่มสอนตั้งแต่คอนเซปต์เริ่มต้น เช่น OOP และ Design Pattern แต่ก็บอกตามตรงว่า “สำหรับคนที่ไม่มีพื้นฐานเกี่ยวกับ ObjC หรือ Cocoa กว่าจะได้ Assignment นึงคงจะเหนื่อยพอดูเลย เพราะยากเอาเรื่อง” แต่ก็ถือว่าเป็นจุดที่ดีสำหรับการเริ่มต้น แนะนำครับ
ตอนนี้ผมอ่านไปได้ 5 Lecture แล้ว และได้เพิ่มเติมความรู้ต่างๆขึ้นเยอะเลย ไม่เฉพาะ iPhone app dev แต่รวมไปถึง Cocoa ด้วย ถือเป็นการเติมพื้นฐานให้แน่นยิ่งขึ้นไปด้วยครับ สำหรับผู้สนใจ ลองเข้าไปดูกันได้นะครับ CS193P : iPhone Application Development
อ่านแล้วก็รู้สึกว่าการศึกษาของเขามันไม่เหมือนของไทยเราเลยนะ ของเขาเน้นให้เด็กศึกษาและลองทำล่วงหน้าของคาบถัดไป แล้วคาบถัดไปก็ค่อยมาดูกันว่าทำถูกผิดยังไง ก็ว่ากันไป ไม่เหมือนกับไทย ที่เน้นทบทวนที่เคยสอนเคยพูดไปแล้วในคาบ แล้วก็เน้นโค้ดเน้นการอินพลีเมนต์เป็นเคสๆไป ลองศึกษาแบบต่างประเทศบ้างก็ได้ประโยชน์อยู่ไม่น้อยนะเนี่ย
1 comment พฤศจิกายน 16, 2008
Cocoa : 3 สิ่งที่เจ๋งซะเหลือเกินสำหรับ Obj-C 2.0
ไม่ได้มาอัพซะนาน เนื่องจากติดงานนั่นแหละ แต่จะว่าไปก็เพราะไม่มีงานเลยไ่ม่มีอะไรจะเขียนไปพักใหญ่ๆเลย(ตอนนี้มีแล้ว เยอะด้วย) ก็คิดซะว่าไปหาแรงบันดาลใจมาเขียนละกัน จากนี้ยังมีอีกงานแต่ว่าก็ยังมีอะไรให้เขียนอีกยาวๆแหละ
…เข้าเรื่องเลยดีกว่า
ไม่ได้เขียนซะนานมากเกี่ยวกับเรื่อง Cocoa Programming ก็ไม่รู้เหมือนกันว่าคนที่เข้ามาอ่าน Blog ผมเนี่ย จะมีคนที่เป็น Developer บน เครื่อง Macintosh รึเปล่า แต่ค่อนข้างมั่นใจว่าแต่ละ entry ที่เขียนเนี่ย ไม่ค่อยมีแบบเป็นภาษาไทยแน่นอน ไม่เชื่อก็ต้องเชื่อ เพราะ Search เจอบน Google เป็นเวบแรกบ่อยมาก
…เข้าเรื่องเลยดีกว่า(จริงๆ)
เรื่องที่อยากจะเขียนวันนี้เป็นเรื่องเกี่ยวกับ Objective-C 2.0 ที่ออกมาพร้อมๆกับ Mac OSX Leopard 10.5 และ iPhone SDK (ออกมาช่วงๆนั้น ผมจำเวลาแน่นอนไม่ได้) ซึ่งสำหรับส่วนของ Objective-C 2.0 มี Feature ใหม่ๆเด่นๆเลยอยู่ 3 ตัวนั่นเอง
ตัวแรก GC (Garbage Collector) – แปรตรงตัวว่าพนักงานช่วยเก็บขยะ ช่วยจัดการตัวแปรต่างๆที่เคยถูกเรียกใช้ในโปรแกรมแล้วไม่มีการคืน Memory ให้กับระบบ ซึ่งเป็นการสิ้นเปลืองทรัพยากรนั่นเอง ซึ่งกับงานชิ้นใหม่นี้ได้ลองใช้แล้ว เวิร์คมากๆ ผมไม่ต้องนั่งจัดการ Memory เองเลย สบายขึ้นเยอะ(แต่ก็ทำให้เขียนโค้ดชุ่ยขึ้นเช่นกัน เพราะไม่ต้องมาซีเรียสเรื่องการคืน Memory อีกแล้ว)
…แต่พอใช้ไปซักพักก็เกิดปัญหา เพราะ ID3.framework ไม่รองรับการใช้งาน GC จบครับงานนี้ จัดการ Memory เองตามเคย วิธีการใช้งานไม่ยาก เข้าไปเซตในส่วนของ Project Info (คลิกขวาตรงชื่อโปรเจคของเราที่อยู่บน List ด้านบนสุด แล้วเลือก Get Info) จากนั้นเลือก Tab Build ในช่อง Search in Build พิมพ์เลยว่า “Garbage Collector” จากนั้นเลือกเป็น Supported ก็เป็นอันเรียบร้อยครับ

* สรุปแล้ว GC มีประโยชน์แน่ ถ้าไม่ใช้กับ Framework ตัวเก่าๆบางตัว หรือ Application บางตัวที่เกี่ยวกับ Graphics วัดดวงเอาแล้วกันนะครับ
อย่างที่สอง การกำหนด Property ให้กับ Attribute อาจคิดว่าไม่จำเป็น แต่เอาจริงๆแล้วก็มีประโยชน์โขอยู่ อันที่จริงก็คือการกำหนดว่า Attribute แต่ละตัวจะจัดการข้อมูลอย่างไร(วิธีการจองพื้นที่, การ Access Attribute) การทำแบบนี้ได้ประโยชน์หลายอย่าง เช่น ช่วย generate ฟังก์ชั่นสำหรับการเข้าถึง attribute (set, get function) ช่วยเราประหยัดการเขียนโค้ดไปได้เยอะ อีกทั้งยังเป็นตัวช่วย GC ตรวจสอบอีกด้วยว่าเป็นขยะหรือไม่ (อันน้ีไม่แน่ใจว่าเกี่ยวรึเปล่า แต่เท่าที่เจอก็เขียนว่าอย่างนั้น)
การ Access Attribute สามารถ Access ได้โดยใช้ Syntax “.” ได้ด้วย ก็ดูสะดวกดีไปอีกแบบนึง ถึงแม้ว่าตอนแรกๆผมจะใช้แล้วรู้สึกว่ามันทำให้ Syntax แบบ “[]” Obj-C มันไม่สวยเท่าไหร่ แต่ใช้ไปซักพักมันก็ง่ายแล้วก็เข้ากับ MVC ดีเหมือนกัน
อย่างที่สาม ชอบสุดๆกับ Fast Enumerator ไม่มีอะไรมากครับ เหมือนๆกับการวน for ภายใน array ในภาษา OO แบบใหม่ๆอย่าง Ruby หรือ Python ลักษณะ Syntax ของมันก็คือ
for ( id element in myArray )
{ // do something on each element }
Syntax ดูดีขึ้นเยอะเลย ดูเป็นภาษาที่ High Level ขึ้นอีกหน่อย ชอบที่สุดก็อันนี้แหละ ทำงานกับ Array สบายขึ้นเยอะ
คราวนี้ยังไม่ขอลงลึกกับแต่ละอันนะครับ ขอนึกคำอธิบายเคลียร์ๆกว่านี้หน่อยแล้วจะมาเขียนอีกทีดีกว่า
Add comment สิงหาคม 28, 2008
