How to do `Lazy Instantiation` in Swift

Lazy Instantiation หรือ Lazy Loading (น่าจะ) ไม่มีโปรแกรมเมอร์คนไหน ไม่รู้จักท่านี้ ง่ายๆ ก็คือ "เราต้องการใช้อะไรสักอย่าง โดยสร้างมันขึ้นมา ณ ตอนที่จะใช้ และถ้ามีอยู่แล้วก็เอามันมาใช้ซะ" เพราะในการเขียนโปรแกรมบน Smart Phone การสร้างอะไรรอเอาไว้รอใช้งาน หรือต้องสร้างทุกครั้งขณะใช้งานเป็นการสิ้นเปลืองอย่างมาก เนื่องจากหน่วยความจำที่จำกัด (จริงๆ ผมใช้ท่านี้ในหลายๆ Blog ที่เขียนนะ วันนี้ได้มาเขียนอธิบายสักที)

มาดู Code ในฝั่ง Objective-C กันก่อนเนอะ


เข้าใจง่ายดีไหม ? ไม่มีอะไรเลย เช็คก่อน มีแล้วก็ส่งกลับ ไม่มีก็สร้างใหม่ จะเห็นว่า Property ตัวนี้จะถูกสร้างครั้งเดียวเท่านั้น และจะถูกสร้างขณะที่เรียกผ่าน Getter method ด้วย

คราวนี้ใน Swift ก็จะ abstract ขึ้นมาสักหน่อยนะ ผมเลยอยากให้ดูในแบบของ Objective-C ก่อน
ใน Swift นั้นเราจะใช้ keyword lazy แปะไว้ที่ property และต้องประกาศเป็น var เท่านั้น (ตามพฤติกรรมที่จะเปลี่ยนแปลงค่าขณะถูกเรียก)


แล้วถ้าเราต้องการกำหนดค่าในขณะที่ถูกเรียกผ่าน Getter method แบบโค้ด Objective-C ด้านบนล่ะ จะทำอย่างไร ? เราสามารถเขียน Closure ไปต่อท้าย Property ตัวนั้นแบบนี้ได้ด้วย...


เท่านี้เอง คำถามต่อมาก็คือ "เมื่อไหร่ที่เราควรจะใช้ Lazy Instantiation ล่ะ ?"
หนึ่งในตัวอย่างที่จะใช้งานก็คือ ใช้เมื่อเราไม่รู้ค่าเริ่มต้นของ Property นั้นๆ จนกว่า Class ที่เป็นเจ้าของ Property ตัวนี้จะถูกสร้างขึ้น อ่า เดี๋ยวงง เช่นแบบนี้


** เรื่องของ unowned reference ให้อ่านเรื่องนี้นะ strong reference cycle

จากโค้ดนั้นเมื่อเราทำการสร้าง Person instance ขึ้นมานั้น personalizedGreeting จะมีค่าเป็น nil ไปจนกว่าเราจะเรียกใช้ในครั้งแรกแบบนี้


หรือเราจะใช้ท่านี้ในกรณีที่เป็น Property ที่ต้องคำนวณหนักๆ เช่น การหาว่าในรูปรูปหนึ่งมีใบหน้าคนอยู่เท่าไหร่ ก็ควรใช้ เพราะถ้าให้คำนวณใหม่ทุกครั้งที่เรียกใช้ Property กับรูปภาพภาพเดิมนี่เป็นเรื่องแน่ๆ

สรุปก็คือ ใจความหลักของการใช้ Lazy Instantiation คือการที่เราทำการจองหน่วยความจำเพื่อใช้งานในเวลาที่ถูกต้อง ไม่ใช่จองไปก่อนแล้วรอใช้งาน และถ้าจะใช้ของเดิมที่เป็นแบบเดิม ก็สร้างมันครั้งเดียวพอ

Popular posts from this blog

[Android Dev] การติดตั้ง Eclipse+AndroidSDK เพื่อพัฒนาโปรแกรมบน Android

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

5 TED Talk ที่จะช่วยให้คุณทำงานดีขึ้น