อ. ธนะพันธ์ อินทรเกสร
ในบทความที่แล้ว
ผมได้เขียนอธิบายไปเรื่องการเขียนโปรแกรมเบื่องต้นด้วย ภาษา Ruby ไป พอสมควร แล้ว หลายท่านที่เขียนโปรแกรมเป็นใหม่ๆ ก็จะลุย
เขียนโดยทันทีเช่น ภาษา VB,VBA ก็จะเขียนกันไปเต็มที่
แต่ปัญหาคือการจัดการ โปรแกรมเมือเวลาผ่านไป โดยเฉพาะอย่างยิ่ง
เมื่อโปรแกรมถูกเขียนในลักษณะของ Method หรือ Function
Call และต้องมีค่า เฉพาะ หรือ
ค่าเริ่มในการทำงาน ต้องมีลำดับของการ Call เป็นขั้นๆ พอเวลาผ่านไป หรือต้องการขยายโปรแกรมโดยเขียนเป็นทีมจะทำไม่ได้
ในระบบของการเขียนโปรแกรมขนาดใหญ่หรือ สามารถบำรุงรักษาได้ Maintainable จึงใช้ระบบ Class เข้ามาโดยใช้วิธีเรียกส่วนของโปรแกรมที่เป็น
Method และตัวแปร Variable รวมกันในหมวดงานเดียวกัน เป็น Class หรือ วัตถุ ไป ผมมักจะเที่ยบ กรม เพราะคล้ายกับการบริหารราชการมาก
โดยที่แต่ละ กรมก็จะมีพันธกิจ ที่ได้รับมอบหมาย และ กรมก็จะอยู่ใต้กระทรวง (ใน C# ผมเทียบกับ Namespace) ในกระทรวงเดียวกันก็จะติดต่อกันได้ ถ้าข้ามกระทรวงก็ต้องขออนุญาติ
เป็นต้น
ใน Ruby ก็มี Class เหมือนกัน แต่ก็ Define ไม่ซับซ้อน และไม่ได้เป็นไปตามมาตราฐานของ OOP (Object Oriented
Programming) เท่าไดนัก เป็น Class ที่สะดวกในการตั้งตาม Style ของ Ruby
โจทย์ ต้องการสร้าง Class เพื่อเก็บ วัดสุกับราคา และสามารถค้นหาได้
ต้องมีอะไรบ้างใน Class
ต้องมี ชื่อ = name ต้องมีราคา = price
ต้องมี Method ในการใส่ค่า หรือสร้างค่า
ต้องมี Method กลาง(Static) ในการค้นหาทุก Object Material
สร้าง Class ก่อน
ruby
|
C#
|
class Material
attr_accessor : name,price
end
|
class Material
{
public
string name;
public
string price;
|
ถ้าจะใส่ค่าใน ruby ทำง่ายคือ ตัว แปร m1 มารับ
Ruby
|
C#
|
m1= material.new
m1.name=”door”
m1.price=”2100”
|
Material m1=new Material();
m1.name=”door”;
m1.price=”2100”;
|
เพื่อให้ง่าย ก็จะใส่ ต้วเริ่มต้น หรือ Init
ของ Class และ การพิมพ์ ค่า
ที่เรียกว่า to_s จะเห็นว่า ใน Class จะเรียกตัวแปรมี @ นำหน้า ถ้าลืม
จะกลายเป็น Local Variable
Ruby
|
C#
|
Class Material
attr_accessor : name,price
def initialize(name, price)
@name = name
@price = price
end
def to_s
@name+":"+@price
end
end
|
class Material
{
public
string name;
public
string price;
public Material(string n, string p)
{
name = n;
price = p;
}
public
string toString()
{
return
name + ":" + price;
}
}
|
และต้องการ Method กลาง หรือ Static เพื่อค้นหา Data
ที่ใส่ไปทุกครั้ง ก็สร้าง ให้มี self นำหน้า และมีการใช้คำสั่ง each หรือ foreach
เครื่องหมาย |o| หมายถึง ต้วแปร o จะถูก Assign
ค่า จาก Object ที่สร้าง ด้วย Class Material
คำสั่งจะกลับกับภาษาอื่น
แต่จะคล้ายภาษาเรา คือ ทำเมื่อเจอ do..if
(true) เข้าใจว่า ผู้พัฒนา ruby เป็นชาวเอเชีย เลยมี Syntax เช่นนี้ ถ้าเป็น C#
ก็จะเป็น ถ้าแล้วทำ if(true) do..
class Material
attr_accessor :name, :price
def initialize(name, price)
@name = name
@price = price
end
def to_s
@name+":"+@price
end
def
self.find_by_name(fname)
found = nil
ObjectSpace.each_object(Material) { |o|
found = o if o.name == fname
}
found
end
end
|
เขียน Notepad และ Save ใน c:\tclass.rb ถ้าต้องการ ให้ load ง่ายๆก็ Save
ลงใน
C:\Program Files\Google\Google SketchUp 8\Plugins
มาทดสอบกัน ผมใช้ Console ของ Google Sketchup
Load “c:/tclass.rb”
Material.new( "Cement","2100")
#<Material:0xd640070 @price="2100",
@name="Cement">
Material.new( "Wood","4000")
#<Material:0xd087868 @price="4000",
@name="Wood">
Material.new( "Steel","10000")
#<Material:0xd086f6c @price="10000",
@name="Steel">
str=Material.find_by_name("Wood")
#<Material:0xd087868 @price="4000",
@name="Wood">
puts str
Wood:4000
|
เป็นการใส่ค่า Material ลงไป 3 ชนิด และทำการค้นหาจากชื่อ ใน Code ใน Console project C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace tclass
{
class Material
{
public string name;
public string price;
public Material(string
n, string p)
{
name = n;
price =
p;
}
public string
toString()
{
return name + ":"
+ price;
}
public static string find_by_name(string
fname,Material [] ms)
{
string rstr = "";
foreach (Material
o in ms)
{
if (o.name == fname) rstr = o.toString();
}
return rstr;
}
}
class Program
{
static void Main(string[] args)
{
Material[] mss = new
Material[3];
mss[0] = new Material("Concret", "2400");
mss[1] = new Material("Brick", "1500");
mss[2] = new Material("Wood", "3000");
string
str= Material.find_by_name("Brick",mss);
Console.WriteLine(str);
}
}
}
|
จะเห็นได้ว่า มีความเหมือน และ
ความต่างกัน code ใน ruby จะสั้น กว่า C# แต่ถ้าลองเขียนดูจะพบปัญหาหนึ่งคือ
Ruby ไม่ตรวจ syntax ของตัวแปรให้ ต้องระวังเอง กรณีที่ใส่ชื่อตัวแปรผิดจะหาไม่เจอ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น