วันศุกร์ที่ 1 พฤษภาคม พ.ศ. 2558

Defining class in Scala (Part 2)

วันนี้เราจะมาต่อกันเรื่องของการประกาศ class ใน ภาษา Scala กันต่อ

เราสามารถประกาศ class ในรูปแบบอย่างนี้ได้

class Point(var x:Int, var y:Int) { }

โดยที่ x, y เป็น สมาชิกของ Point (data member) และ เป็น var ทั้งคู่   ดังนั้นเราสามารถเปลี่ยนแปลงค่า x, y ได้  สำหรับการสร้าง instance ยังคงเหมือนเดิมคือ 

var p = new Point(1,2)
p.x = p.x * 2
p.y = p.y * 2

ดังรูปต่อไปนี้


สังเกตุว่าการประกาศ class Point ข้างบนเหมือนกันกับการประกาศ class วิธีปรกติเพียงแต่โค๊ดสั้นกว่ามาก

//ประกาศ  class โดยวิธีปรกติ
class Point {
  var x: Int = _
  var y: Int = _

  def this(x:Int, y:Int) {
     x = y
  }
}

ทีนี้ลองมาดูอีกตัวอย่างหนึ่งคือ

class Point(val x:Int, val y:Int) { }

เราเปลียนจาก var มาเป็น val   หรือเราจะไม่ระบุเลยว่าเป็น var หรือ val    Scala จะกำหนดให้เป็น val โดยอัตโนมัต

class Point(x:Int, y:Int) { }

จะเป็นได้ว่าโค๊ตเรายิ่งสั้นเข้าไปอีกโดยที่เราไม่ต้องมาใช้ get/set เหมือนใน c#/java  และนี่ไม่ใช่เพียงแค่จุดประสงค์เดียวของ Scala ที่ต้องการให้โค๊ดเขียนได้สั้นและง่ายขึ้น  แต่ที่แท้จริงแล้ว เราต้องการ object ที่ไม่สามารถเปลี่ยนแปลงค่าของสมาชิก หรือ data memeber ได้หลังจากที่สร้าง object ไปแล้ว  ที่เราเรียกกันว่า Immutable Object

ในกรณีนี้คือเราไม่สามารถเปลี่ยนค่า x, y ได้หลังจากสร้าง object ขึ้นมาแล้ว

val p1 = new Point(1,2)
//p1.x = p1.x * 2   --> compile error
//p1.y = p1.y * 2   --> compile error

เวลาที่เราทำงานในโปรเจ็กใหญ่ๆ เราจะเจอสถานะการณ์ที่ควรจะใช้ Immuatable object เยอะ เช่น DAO   เราต้องการ class มารองรับข้อมูลที่มาจาก database หลังจากที่เราอ่านข้อมูลจาก database มาสร้าง object แล้วเราไม่ควรจะไปแก้ไขมันอีก  ถ้าจะแก้ก้อไปแก้ที่ database แล้วอ่านมาใหม่จะดีกว่า

ใน Scala เรามี collection ให้เลือกใช้จำนวนมาก โดยที่ทุก collection เราสามารถเลือกได้ว่าจะใช้ immutable หรือ mutable collection  และ Scala จะเลือก immtable ให้โดยอัตโนมัต

ในบทความต่อไปเราจะมาดูเรื่อง constructor กันอีกทีครับ

ไม่มีความคิดเห็น: