เอา Dart ไปทำอะไร
Dart นั้นเป็นภาษาโปรแกรมที่เอาไว้สำหรับสร้างแอพพลิเคชันบนแพลตฟอร์มที่หลากหลายโดยได้ทั้ง mobile, desktop, server และก็ web สิ่งที่เป็นที่นิยมที่สุดที่ทำให้คนสนใจมาเรียนภาษา Dart กันก็คือเพื่อที่จะเอาไปใช้ร่วมกับ Flutter ที่เป็นเครื่องมือช่วยสร้าง UI ของ Google ซึ่งใช้ได้ทั้งกับ Android และ iOS หรือจะเป็นใน Desktop กับ Web ก็ยังได้
ภาษา Dart นี้ถูกสร้างโดย Google และปล่อยให้ใช้งานแบบ open source ทำให้ทุกคนสามารถนำไปใช้งานได้ฟรีๆ และการที่ Dart ถูกออกแบบมาให้ใช้งานได้ง่ายและมีประสิทธิภาพแบบภาษาเชิงวัตถุอื่นๆอย่าง Java C# C++ จึงเป็นตัวเลือกภาษาที่น่าสนใจในการศึกษาเป็นภาษาแรกอีกด้วย
มาลองเขียน Dart กัน
เรามาลองดูวิธีการใช้งานภาษา Dart ตั้งแต่เริ่มต้นกันเลยดีกว่า อย่างที่บอกไปด้านบนว่า Dart เป็นภาษาเชิงวัตถุ (Object-oriented programming) ดังนั้งสิ่งที่ขาดไม่ได้เลยก็คือ class นั่นเอง โดยครั้งนี้เรามาลองดูตัวอย่างผ่านการสร้าง class Bicycle ตาม tutorial ในเว็บไซต์ของ Dart กัน สำหรับใครที่อยากลองทำตามก็เข้าเล่นได้ ที่ลิงค์นี้ https://dart.dev/#try-dart กับลิงค์นี้ https://dartpad.dartlang.org/
การสร้าง Class ฉบับ Dart
เวลาเราพูดถึงคลาสกันอย่างในภาษา Java อย่างน้อยก็ต้องมี method หรือก็คือฟังก์ชันที่อยู่ในคลาสอย่าง main อยู่แน่นอน Dart เองก็มี main อยู่เหมือนกันโดยจะเป็นฟังก์ชันอยู่ชั้นนอกสุดเลย สมมติว่าถ้าจะสั่ง print “Hello, World” ใน Dart โค้ดก็จะมีหน้าตาแบบนี้
โค้ด Hello World ใน Dart:
main() {
print('Hello, World!');
}
ถ้าจะเทียบกับ Java ที่จะ print “Hello, World” แล้ว Dart นั้นดูสั้นและก็ง่ายกว่ากันมาก
โค้ด Hello World ใน Java:
class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
เรามาเริ่มสร้างคลาส Bicycle กันจริงๆดีกว่า
class Bicycle {
int cadence;
int speed;
int gear;
}
void main() {
}
จากโค้ดนี้จะเห็นว่า เรามีการประกาศคลาส Bicycle โดยมีตัวแปรที่อยู่ใสคลาสหรือ Attribute ด้วยกัน 3 ตัวคือ cadend (รอบขาในการปั่น), speed (ความเร็ว), และ gear (เกียร์) ถ้าสังเกตจะเห็นว่าการประกาศคลาสนั้นไม่ต้องระบุ public, private หรือ protected เหมือนในภาษา Java โดยใน Dart นั้นทั้งหมดจะ public เป้นค่าเริ่มต้นอยู่แล้วนั่นเอง
การสร้าง Constructor ใน Dart
เมื่อคลาสและ attribute ในคลาสก็ต้องมี constructor แน่นอนเพื่อกำหน้าค่ากับคลาสนั้นๆตอนที่สร้าง object ขึ้นมาจากคลาสนั่นเอง
Bicycle(int cadence, int speed, int gear) {
this.cadence = cadence;
this.speed = speed;
this.gear = gear;
}
ซึ่งในภาษา Dart เราสามารถเขียน constructor ให้อยู่ในบรรทัดเดียวแบบนี้ก็ได้
Bicycle(this.cadence, this.speed, this.gear);
การ Instantiate Object ที่คุ้นเคย
ทีนี้เรามาลองสร้าง instance หรือก็คือ object ที่สร้างจากคลาส Bicycle กัน
var bike = new Bicycle(2, 0, 1);
ใน Dart นั้นเราสามารถเลือกที่จะใช้หรือไม่ใช้ new ตอนสร้าง instance ก็ได้ ซึ่งพอเอาไปรวมอยู่ในฟังก์ชัน main ก็จะได้โค้ดหน้าตาแบบนี้
void main() {
var bike = Bicycle(2, 0, 1);
print(bike);
}
ทำให้ภาพรวมคลาส Bicycle ของเราเริ่มเป็นรูปเป็นร่างแล้ว
class Bicycle {
int cadence;
int speed;
int gear;
Bicycle(this.cadence, this.speed, this.gear);
}
void main() {
var bike = new Bicycle(2, 0, 1);
print(bike);
}
Output:
Instance of 'Bicycle'
Read-Only Variable คืออะไร ?
Read-only variable ก็คือการทำให้ตัวแปรภายใน class เป็น private เข้าจากภายนอกคลาสโดยตรงไม่ได้นั่นเอง ในคลาส Bicycle ของเรา มาทำให้ speed กลายเป็น read-only variable กัน ซึ่งทำได้ง่ายมากๆแค่เปลี่ยนชื่อของมันเท่านั้นเอง
จาก
int speed;
ไปเป็น
int _speed = 0;
แค่เติม _ (underscore) นำหน้าชื่อ ตัวแปรนั้นๆก็จะเป็น private แล้วนั่นเอง ซึ่งพอตัวแปรเป็น private แล้วเราก็ต้องสร้าง getter ไว้สำหรับ get ตัวแปรจากภายนอกเอาไว้ด้วย เรียกใช้ได้ง่ายๆแบบนี้เลย
int get speed => _speed;
เราจะทำการเพิ่มฟังก์ชัน info ไว้ดูข้อมูลของจักรยานเข้าไปในคลาสด้วย เพื่อที่จะได้เห็นผลลัพธ์จากการสร้างคลาสง่ายๆ พอรวมเสร็จคลาส Bicycle ของเราก็จะมีหน้าตาแบบนี้แล้ว
class Bicycle {
int cadence;
int gear;
int _speed = 99;
Bicycle(this.cadence, this.gear);
int get speed => _speed;
String info() {
return "This bike has: " + cadence.toString() + " cadence, "
+ gear.toString() + " gear, and " + _speed.toString() + " speed.";
}
}
void main() {
var bike = new Bicycle(2, 1);
print(bike.info());
}
Output:
This bike has: 2 cadence, 1 gear, and 99 speed.
Optional Parameters เรื่องนี้สำคัญไม่แพ้กัน
สำหรับหัวข้อนี้ก็ขอเทียบกับภาษา Java เหมือนอย่างเคย ในภาษา Java นั้นมี overloading constructor หรือก็คือการมี constructor หลายตัวที่แต่ละตัวรับค่าไม่เหมือนกันเพื่อที่จะได้สร้าง instance ได้ด้วยวิธีที่แตกต่างกันได้ ใน Dart ก็ทำได้เช่นเดียวกัน อย่างคลาส Bicycle ของเราถ้าหากจะทำให้ตอนสร้าง instance เลือกที่จะระบุหรือไม่ระบุ gear ก็ได้ เราสามารถเขียนเป็น optional parameters ได้แบบโค้ดด้านล่างนี้
Bicycle(this.cadence, {this.gear = 1});
ส่วนเวลาสร้าง instance ก็ใช้งานได้แบบนี้
var bike1 = new Bicycle(2, gear: 9);
var bike2 = new Bicycle(2);
print(bike1.info());
print(bike2.info());
Output:
This bike has: 2 cadence, 9 gear, and 99 speed.
This bike has: 2 cadence, 1 gear, and 99 speed.
ได้เห็นตัวอย่างการเขียน Dart กันไปแล้ว น่าจะไม่ยากใช่มั้ยครับ ยิ่งถ้าใครเขียน Java มาก่อนละก็น่าจะ eszy สุดๆไปเลย ภาษา Dart เป็นภาษาที่น่าสนใจและมีการเติบโตอย่างต่อเนื่อง ถ้าใครสนใจก็อย่าลืมไปศึกษาเพิ่มเติมกันได้ที่เว็บ Dart นะครับ
โค้ดทั้งหมดที่เขียนมาในบทความนี้
class Bicycle {
int cadence;
int gear;
int _speed = 99;
Bicycle(this.cadence, {this.gear = 1});
int get speed => _speed;
String info() {
return "This bike has: " + cadence.toString() + " cadence, "
+ gear.toString() + " gear, and " + _speed.toString() + " speed.";
}
}
void main() {
var bike1 = new Bicycle(2, gear: 9);
var bike2 = new Bicycle(2);
print(bike1.info());
print(bike2.info());
}
reference : A tour of the Dart language