up1 on September 16th, 2008

วันนี้ผมลองนั่งดูการจัดการเกี่ยวกับเวลาใน Groovy ซึ่งพบว่าสามารถใช้ความสามารถ operator overloading ได้ง่าย เช่น
ผมต้องการเพิ่มวันจากเวลาปัจจุบันไป 2 วัน ก็ทำได้ง่ายๆ ดังนี้

def current_date = new java.util.Date( System.currentTimeMillis() )
current_date += 2


ผลลัพธ์ที่ได้

Result: Thu Sep 18 18:25:48 GMT+07:00 2008

นั่งๆ เขียนไปไม่รู้อะไรมาดลใจ ให้ไปนึกถึง slide ที่คุณ @cblue ในงาน NJUG 5 เรื่องของการใช้งาน category มาช่วย ซึ่งจะทำให้ code นั้นอ่านง่ายและ เข้าใจได้ง่าย

เช่นต้องการรู้คำนวณวินาทีจาก
3 hours + 20 minutes = 3*60*60 + 20*60 = 12000 วินาที

ดังนั้นผมจึงมาเริ่มพัฒนาแบบง่ายๆ ด้วย Groovy กันก่อน ดังนี้

class MyTime {
    static hours( Integer input ) {
        input * 60 * 60
    }
    static minutes( Integer input ) {
        input * 60
    }
}

การใช้งานโดยใช้ category มาช่วยดังนี้

use( MyTime ) {
    println 3.hours() + 20.minutes()
}

จะเห็นได้ว่า การใช้งานไม่น่าใช้เท่าไร จะมี () มาเกะกะทำไมไม่รู้ ดังนั้นจาก slide ข้างบนนั้น ผมก็ขออนุญาติลอกวิธีของคุณ @cblue มาทำ ณ ตรงนี้เลยครับ คงไม่ว่ากัน …

โดยผมจะสร้าง Java Class ชื่อ MyTime เพื่อควบคุมการทำงาน ดังนี้

public class MyTime {
	public static Integer get( Integer input, String name ) {
		if( "hours".equals( name ) ) {
			input *= 60 * 60;
		} else if( "minutes".equals( name ) ) {
			input *= 60;
		}
		return input;
	}
}

มาเขียน Groovy ใช้งานกันครับ

use( MyTime ) {
	println 3.hours + 20.minutes
}

เป็นไงบ้างครับ อ่านและเข้าใจง่ายกว่าเดิมไหมครับ .. ^_^

ส่วนกระบวนการไปเรียกใช้ java class นั้นคงต้องให้พี่ @cblue มาอธิบายให้ฟังครับ


Web References

http://groovy.codehaus.org/Groovy+Categories
http://www.slideshare.net/roofimon/cbluenjug5

Tags: , ,

7 Responses to “Groovy Category ใช้งานยังไง ??”

  1. รอบที่แล้วผมเขียนไม่ดีเท่าไหร่มั้งครับ เลยต้อง if
    จริง ๆ เติม get เข้าไปหน่อยก็ได้แล้วครับ

    class MyTime {
    static getHours( Integer input ) {
    input * 60 * 60
    }
    static getMins( Integer input ) {
    input * 60
    }
    }

    use(MyTime) {
    println 3.hours + 20.mins
    }

  2. ขอบคุณมากครับ

  3. แบบของคุณ cblue ดูสวยขึ้นเยอะเลยครับ ^^

  4. ผมชอบแบบ get มากกว่าครับเพราะ logic การหาเหมือนกัน ลองเขียนแบบย่อดู

    class TimeInSecond {
    static x2secs = [mins:60, hours:60*60, days:24*60*60]

    static Integer get(Integer value, String unit) {
    return value*x2secs[unit]
    }
    }

    use(TimeInSecond) {
    println 1.days + 3.hours + 20.mins
    }

  5. ูู^^ เยี่ยมเลยครับ .. ^_^

  6. @virasak โอ้ ร้ายกาจมาก สร้างสรรค์สุด ๆ ครับ

  7. โอ้ น่าสนใจแฮะ ต้องเริ่มศึกษาแล้ว

Leave a Reply