วันอังคารที่ 17 มกราคม พ.ศ. 2555

ทำความเข้าใจ Class ของ Sketchup Ruby เทียบกับ C#


อ. ธนะพันธ์ อินทรเกสร
ในบทความที่แล้ว ผมได้เขียนอธิบายไปเรื่องการเขียนโปรแกรมเบื่องต้นด้วย ภาษา 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 ของตัวแปรให้ ต้องระวังเอง กรณีที่ใส่ชื่อตัวแปรผิดจะหาไม่เจอ






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

แสดงความคิดเห็น