วันนี้ผมลองนั่งดูการจัดการเกี่ยวกับเวลาใน 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
September 17th, 2008 at 1:24 am
รอบที่แล้วผมเขียนไม่ดีเท่าไหร่มั้งครับ เลยต้อง if
จริง ๆ เติม get เข้าไปหน่อยก็ได้แล้วครับ
class MyTime {
static getHours( Integer input ) {
input * 60 * 60
}
static getMins( Integer input ) {
input * 60
}
}
use(MyTime) {
println 3.hours + 20.mins
}
September 17th, 2008 at 1:28 am
ขอบคุณมากครับ
September 17th, 2008 at 1:51 am
แบบของคุณ cblue ดูสวยขึ้นเยอะเลยครับ ^^
September 17th, 2008 at 9:39 am
ผมชอบแบบ 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
}
September 17th, 2008 at 11:15 am
ูู^^ เยี่ยมเลยครับ .. ^_^
September 17th, 2008 at 12:07 pm
@virasak โอ้ ร้ายกาจมาก สร้างสรรค์สุด ๆ ครับ
May 26th, 2009 at 2:59 pm
โอ้ น่าสนใจแฮะ ต้องเริ่มศึกษาแล้ว