วันพุธที่ 29 มิถุนายน พ.ศ. 2554

การนำ Bean มาใช้ใน Bean Box

หลังจากนั่งมึนๆงงๆ กับ data warehouse ที่ยังไม่เสร็จจนถึงตอนนี้ ผมก็เลยตัดสินไม่ทำแล้วมานั่งเขียน Blog ดีกว่าครับ วันนี้เราจะพูดถึง BeanBox คือโปรแกรมช่วยสร้างโปรแกรมโดยการลากว่าง และเราสามารถเพิ่ม Bean เข้าไปในโปรแกรมได้ครับ ในตัวอย่างต่อไปจะเป็นการนำเอา Counter จาก Blog ที่แล้วมาใช้ ไปดูวิธีการกันเลยครับ
1. นำ JAR ไฟล์ที่เป็น Bean ใส่ไว้ในโฟลเดอร์ beans\jars ในตัวอย่างจะเป็น Counter.jar

2. กลับไปที่โฟลเดอร์ \beans\beanbox ดับเบิลคลิก run.bat โปรแกรมจะรันขึ้นมาได้ดังภาพ
สังเกต ToolBox ด้านซ้ายมือจะมี Bean ชื่อว่า Counter ซึ่งเป็น Bean ที่ได้เพิ่มเข้าไปจากในข้อ 1
3. ทำการเพิ่ม Bean Counter เข้ามาใน BeanBox โดยคลิกที่ Bean ที่ต้องการใน ToolBox และมาคลิกที่ตำแหน่งที่ต้องการใน BeanBox
4. สร้างปุ่ม ExpliciButton จำนวน 3 ปุ่ม โดยวิธีเช่นเดียวกับ ข้อ 3 จะได้หน้าตาโปรแกรมดังภาพ

5. ทำการเปลี่ยน Label ของปุ่มทั้งสามปุ่ม โดยการแก้ไขค่า label ในหน้าต่าง Properties
6. แก้ไข Label อีกสองปุ่มที่เหลือเป็นดังภาพ

7. เพิ่ม Bean TickTock เข้ามาใน BeanBox และกำหนด Properties interval เป็น 1
8. ทำการกำหนด Event ให้กับปุ่ม เริ่มต้นที่ปุ่ม Start โดย การคลิกที่ปุ่ม และเลือก Edit > Events > button push > actionPerfrom
คลิกที่ Counter
จะพบหน้าต่าง EventTargetDialog ให้เลือกที่ start
9. ทำการกำหนด Event ของอีกทั้งสองปุ่มเช่นเดียวกับปุ่ม Start ในข้อ 8 แต่ ปุ่ม Stop เลือก method stop และ ปุ่ม Reset ให้เลือก method reset

10. ทำการกำหนด Event ให้กับ TickTock โดยการคลิกที่ TickTock และเลือก Edit > Events > propertyChange > propertyChange และคลิกที่ Counter ดังภาพ
เลือกที่ increment ดังภาพ
11. จะสังเกตเห็นว่า Counter จะเพิ่มขึ้นทุก 1 วินาที และเมื่อทดลองกดปุ่ม Stop Counter ก็จะหยุดการนับค่า เมื่อกดปุ่ม Reset ค่าก็จะกลับมาเริ่มต้นที่ 0
ถ้าทำตามขั้นตอนก็จะได้ผลดังที่กล่าวมาครับ วันนี้พอแค่นี้ดีกว่าครับ data warehouse ยังไม่เสร็จ (แย่แล้วแหละครับ = =) ขอไปทำก่อนนะครับ ติดตามได้ตอนต่อไปขอบคุณครับ

วันจันทร์ที่ 27 มิถุนายน พ.ศ. 2554

กาสร้างไฟล์ JAR สำหรับ Java Bean


สวัสดีครับ วันนี้เรามาสร้าง Bean ใช้กันดีกว่าครับ หลายคนอาจสงสัยว่าเจ้า Bean นั้นคืออะไร Bean ก็คือ class ของ java นั่นแหละครับ แต่จะมีวิธีการเขียนและนำไปใช้งานแตกต่างกับ class ปกติครับ การเขียน Bean จะมีกฎอยู่ 3 ข้อแต่ผมไม่ขอพู้ถึงครับ สามารถอ่านได้ในบทความนี้ครับ http://thaiprogrammer.blogspot.com/2008/09/3-java-bean-class.html และต่อไปนี้จะเป็นการสร้าง Bean เป็น JAR ไฟล์เพื่อนำไปใช้งานต่อไปครับ

1. ทำการเขียน class ที่ต้องการนำมาทำเป็น Bean ในตัวอย่างนี้ ใช้ Counter.java มี Code โปรแกรมดังนี้

package counter;

import java.awt.*;

public class Counter extends Canvas implements java.io.Serializable {

private final static int XPAD = 10;

private final static int YPAD = 10;

private int count;

private boolean operate;

public Counter() {

count = 0;

operate = true;

}

public void reset() {

count = 0;

repaint();

}

public void start( ) {

operate = true;

}

public void stop() {

operate = false;

}

public synchronized void increment() {

if(operate) {

++count;

adjustSize();

repaint();

}

}

public void setFont(Font font) {

super.setFont(font);

adjustSize();

}

/*

public Dimension getPreferredSize() {

Graphics g = getGraphics();

FontMetrics fm = g.getFontMetrics();

int w = fm.stringWidth("" + count) + 2 * XPAD;

int h = fm.getHeight() + 2 * YPAD;

return new Dimension(w, h);

}

*/

private void adjustSize() {

Dimension d = getPreferredSize();

setSize(d.width, d.height);

Component parent = getParent();

if(parent != null) {

parent.invalidate();

parent.doLayout();

}

}

public void paint(Graphics g) {

Dimension d = getSize();

FontMetrics fm = g.getFontMetrics();

int x = (d.width - fm.stringWidth("" + count))/2;

int y = (d.height + fm.getMaxAscent() -

fm.getMaxDescent())/2;

g.drawString("" + count, x, y);

g.drawRect(0, 0, d.width - 1, d.height - 1);

}

}


2. สร้างไฟล์ Manifest เป็นไฟล์ที่บอกถึงคุณลักษณะต่างของ JAR ไฟล์นั้นๆ เขียน code ดังนี้

Main-Class: counter.Counter

Name: counter/Counter.class

Java-Bean: True



บรรทัดสุดท้ายจำเป็นต้องขึ้นบรรทัดใหม่ 1 8ครั้ง และเซฟไฟล์ชื้อ Counter.mf

3. หลังจากสร้างไฟล์ทั้งสองเราก็ได้ไฟล์ดังภาพ

4. เปิด Command Prompt ขึ้นมา

สมมติว่า path ที่จะสร้าง JAR อยู่ที่ C:\Users\Admin\Desktop\Component\ex3\bean
cd C:\Users\Admin\Desktop\Component\ex3\bean (ถ้าไฟล์อยู่ที่อื่นให้ใช้ path นั้นๆ)
javac –d . Counter.java
คำสั่ง compile และ –d หมายถึงสร้าง โฟลเดอร์ตาม package ที่อยู่ใน source code
jar –cfm Counter.jar Counter.mf .\counter\*.*
คำสั่งสร้าง JAR File

ถ้าคำสั่งถูกต้อง จะได้ไฟล์ในโฟลเดอร์ดังภาพ และจะได้ Counter.jar ตามที่ต้องการ

วันอาทิตย์ที่ 26 มิถุนายน พ.ศ. 2554

ตัวอย่าง java class library ที่สร้าง Object โดยใช้แนวคิดแบบ Factory Method

                 ในภาษาจาวานั้น มีอยู่หลายๆ class ที่มีการนำแนวคิด Factory Method มาใช้ในการสร้าง Object ของมัน ซึ่งในที่นี้จะขอยกตัวอย่างซัก 2 class คือ class Calendar และ class
                class Calendar นั้นอยู่ในแพคเกจ  java.util.Calendar ซึ่งเราสามารถใช้งาน class นี้เพื่อเรียกดูเวลาของเครื่องที่เราใช้อยู่ได้ และสามารถจัดเป็น format ต่างๆที่เราต้องการได้อีกด้วย และจากรูปเราจะเห็นว่าการสร้าง Object ของ class Calendar นั้นใช้คำสั่ง getInstance() แทนที่จะใช้คำสั่ง new Calendar()

                    ส่วน class ControlFactory นั้นอยู่ในแพคเกจ javax.naming.ldap.ControlFactoryซึ่งเป็น class ซึ่งเอาไว้สร้างออบเจคของคอนโทรลแบบ LDAPv3 ซึ่งถูกกำหนดโดย RFC2251 และจากรูปเราจะเห็นว่าการสร้าง Object ของ class ControlFactory นั้นใช้คำสั่ง getControlInstance() แทนที่จะใช้คำสั่ง new ControlFactory()

การใช้งาน Design Pattern ใน NetBeans

จากบทความในครั้งก่อนๆที่เคยกล่าวไว้ว่าNetBeansสามารถช่วยให้การทำงานของโปรแกรมเมอร์นั้นมีความสะดวกสบายมากกว่าการใช้ Text Editer ในการเขียนโปรแกรม …. ในวันนี้ผมจะมานำเสนออีก Feature หนึ่งที่ช่วยให้การทำงานของโ)รแกรมเมอร์อย่างเราๆ มีความสะดวกสบายขึ้นไปอีก นั่นก็คือ การใช้ UML บน NetBeans ซึ่งช่วยให้เรา สามารถวาด UML ต่างๆ ตลอดจนการทำโปรแกรมของเราให้เป็นไปตาม Design Pattern แบบต่างๆ ได้อีกด้วย …. น่าสนใจใช่ไหมครับ งั้นเราไปดูวิธีติดตั้ง และตัวอย่างขั้นตอนการทำ Design Pattern บน NetBeans กัน

วิธีติดตั้ง
1.    ไปดาว์นโหลด plugins ทั้ง 16 ตัวที่ต้องใช้จาก http://dlc.sun.com.edgesuite.net/netbeans/updates/6.7.1/uc/final/beta/modules/uml6/
ซึ่งรองรับเวอร์ชั่น 6.xxx นะครับ (7.xxx ยังไม่รองรับ )
2.     หลังจากนั้นในโปรแกรม NetBeans ให้เลือกที่ Tools > Plugins > Download จากนั้นให้ Browse ทั้ง 16 files นั้นมา แล้วจัดการติดตั้งให้เรียบร้อย

ตัวอย่างและวิธีการใช้งาน
ในการแสดงตัวอย่างและวิธีการใช้งานนั้น จะขอยกเอา Design Pattern แบบ Singleton มาประกอบ
1.ทำการสร้างโปรเจคใหม่ขึ้นมาก่อนจากนั้นจึงทำการเพิ่ม class MySingleton เข้าไป
2.คลิกขวาที่โปรเจคของเรา แล้วเลือก Reverse Engineer



3.จะมีหน้าต่างขึ้นมา ให้เรากด OK ไป  NetBeans จะทำการสร้างอีกโปรเจคหนึ่งเป็นโปรเจคที่เอาไว้แสดง UML ของโปรเจคเรานั่นเอง

4.จากนั้นที่ UML Project ให้คลิกขวาที่ Model จากนั้นเลือก Apply Design Pattern


5.จากนั้นให้เราสามารถเลือก Design Pattern ที่เราจะใช้ได้ตามที่ต้องการซึ่งในที่นี้จะเลือกเป็น Singleton



6.ในข่องของ namespace ก็ให้เราทำการเลือกโปรเจคที่จะนำมาเชื่อมโยงกับ Design Pattern


7.ในขั้นนี้เราก็จะสามารถเลือกได้ว่าจะให้ class ไหนเป็น Singleton ซึ่งเราจะเลือก class MySingleton ที่ได้สร้างไว้ตอนต้น


8.จากนั้นให้ติ๊กในช่อง create class diagram เพื่อให้ NetBeans สร้าง class diagram ออกมาตาม Design Pattern ที่เราเลือกใช้




9.สุดท้าย เราสามารถให้ NetBeans ช่วย generate code ที่สอดคล้องกับ Design Pattern โดยคลิกขวาที่ UML project แล้วเลือก Generate Code



10.เมื่อกลับไปดูที่โปรเจคของเราจะพบว่ามีการ Generate Code ที่สอดคล้องกับ Design Pattern Singleton ไว้เรียบร้อยแล้ว






การใช้งาน Design Pattern ในโปรแกรม Eclipse

1. ทำการdownload plug in ก่อนถึงจะใช้งานได้ โดยการดาวน์โหลดจาก >> http://is.gd/oXaspR

2. จากนั้นทำการย้ายไฟล์ซึ่งเป็นwinzip ไปยัง folder ชื่อ plugins ในfolder eclipse แล้วทำการ unzip



3. ทำการเปิด โปรแกรม Eclipse ขึ้นมา



4. คลิกแถบเมนูข้างบน file >> new >> Java Project เพื่อทำการสร้างprojectขึ้นมา

5. ในที่นี้เราตั้งชื่อ Projectว่า "DesignPattern"



6. หลังจากสร้าง Project เสร็จแล้ว ให้เลือกที่ File->New->Other… แล้วเลือก Java-> Design Pattern Wizard ดังภาพ


 7. เมื่อเลือกแล้วให้ทำการกด Next จะปรากฏหน้าต่างดังภาพ


 8. ให้ทำการกด Browse… เพื่อเลือก Project ที่จะใช้ Design Pattern


 9. ในตัวอย่างนี้เราจะใช้ Composite Pattern โดยให้เลือกที่ GoF->Structural Pattern->Composite เสร็จแล้วกด Finish



 10. จะปรากฏดังภาพ



11.  หลังจากนั้นให้เลือก Component แล้วกดปุ่ม Add… จะปรากฏหน้าต่างขึ้นมาเพื่อให้เราตั้งชื่อ Class



12.  เสร็จแล้วกด Finish ตัว Eclipse จะทำการสร้าง Class และ Generate Code ให้กับเราดังภาพ


13.ให้เราทำซ้ำ โดยเลือกที่ Leaf, Composite, Client แล้วกด Add… เพื่อเพิ่ม Class ได้ตามต้องการ



 




วันอาทิตย์ที่ 19 มิถุนายน พ.ศ. 2554

ตัวอย่างการใช้ Design Pattern : Model-View-Controller ในภาษา Java โดยใช้โปรแกรม NetBeans

Design Pattern : Model-View-Controller (MVC) เป็นหนึ่งในหลายๆ Design Pattern ที่โปรแกรม NetBeans รองรับซึ่ง MVC นี้พูดง่ายๆก็คือ จะแยก class ต่างๆ ในโปรแกรมของเราออกเป็น 3 ประเภทคือ
1. Model เป็น class ที่เอาไว้เก็บข้อมูลต่างๆ
2. View เป็น class ที่เอาไว้รับ input หรือแสดง output ของระบบที่ใช้ MVC
3. Controller เป็น class ที่เอาไว้ควบคุมการทำงานต่างๆของทั้ง Model และ View

ด้านล่างนี้เป็นตัวอย่าง source code ของโปรแกรมที่ใช้แนวคิด MVC อย่างง่ายครับผม


              จากตัวอย่างจะเห็นว่า class Model มีการ extends Observable นั้นหมายถึงเราจะให้ Model นั้นถูกสังเกตุการณ์โดย class อื่นๆ นั่นเอง และเมื่อตัว Model มีการเปลี่ยนแปลงที่ต้องการจะส่งสัญญาณไปหา object ของ class ที่เป็นผู้สังเกตุการณ์ ก็สามารถทำได้โดยใช้เมธอด setChanged() ตามด้วย notifyObservers()


              ส่วน class ที่ทำหน้าที่เป็นผู้สังเกตุการณ์โดยส่วนมากจะเป็น class ประเภท View ซึ่งจะต้อง implements Observer และ override method update() ซึ่งเมื่อ Model มีการ setChanged() ตามด้วย notifyObservers() แล้ว เมธอด update() จะถูกเรียกขึ้นมาทำงานโดยอัติโนมัติ


              สุดท้ายสำหรับ class ที่ทำหน้าที่เป็น Controller นั้น ก็จะทำการควบคุมการทำงานต่างๆของโปรแกรม รวมถึง Model และ View ด้วย ดังภาพด้านบนครับ


สุดท้ายนี้ หวังว่าผู้ที่ได้อ่านบทความนี้จะได้รับความรู้เพิ่มเติมไม่มากก็น้อย 
และหากมีข้อผิดพลาดปรการใดผู้เขียนใคร่ขออภัยมา ณ ที่นี้ด้วยครับ ^^"







การประยุกต์ใช้รูปแบบ Factory Method Pattern ในภาษา java


ก่อนที่จะกล่าวถึง Factory Method Pattern นั้น ผมคงต้องขอกล่าวถึง คำว่า Design Pattern ก่อนเพื่อที่จะให้ผู้อ่านทุกท่าน มีความเข้าใจในบทความนี้มากขึ้นครับ

Design pattern คือแบบแผนในการออกแบบซอฟแวร์เชิงวัตถุ ซึ่งมีการค้นคว้าวิจัยกันมานานและสรุปออกมาเป็นแบบแผนว่า แบบแผนนี้เหมาะกับโปรแกรมประเภทใดบ้าง ซึ่งค่อนข้างจะมีความสำคัญ โดยเฉพาะกับระบบใหญ่ๆ ลองนึกภาพดูเล่นๆว่าสมมติระบบนึงมี class ทั้งหมดประมาณ 100 class แต่ละ class ก็มีความสัมพันธ์ต่างๆ กับ class อื่นในระบบ ถ้าหากทีมผู้พัฒนาระบบทำงานโดยไม่มีหรือไม่ใช้แบบแผน(Design Pattern)ที่เหมาะสมกับระบบที่ทำแล้ว แทนที่จะสามารถพัฒนาได้ง่ายๆ อาจจะต้องใช้เวลาในการพัฒนาที่มากขึ้น ซ้ำร้าย เมื่อเกิดข้อผิดพลาด , Bug ต่างๆ ก็อาจจะตรวจและแก้ไข้ได้ค่อนข้างยาก เช่นกัน … เอาล่ะ พูดมาซะยืดยาว เรามาเข้าเรื่องกันดีกว่าครับ

Factory Method Pattern นั้นจัดเป็นส่วนหนึ่งของ Design Pattern จะมอง class กลุ่มหนึ่งเป็น โรงงานผลิตภัณฑ์ที่ผลิตสินค้าได้ประเภทเดียว เช่นถ้าผลิตไอศครีม ก็ต้องผลิตไอศครีมอย่างเดียว จะผลิตอย่างอื่นด้วยไม่ได้(เดี๋ยวผิด Concept - -“) และเมื่อเราต้องการไอศครีมรสใด เราก็เพียงแค่ส่ง message หรืออะไรสักอย่างไปบอกโรงงาน จากนั้นโรงงานส่งไอศครีมรสที่เราขอกลับมาให้เรา โดยที่เราไม่ต้องสนใจว่าโรงานนั้นมีกระบสนการผลิตอย่างไร

ดังนั้นอาจจะพูดได้ว่า Factory Method Pattern ประกอบไปด้วยสามส่วนคือ
1. Super Class เปรียบเหมือนตัวกำหนดหลักๆ ว่าโรงงานนี้จะผลิตสินค้า ประเภทไหน เช่นถ้าจะผลิตไอศครีม
2. Sub Class ที่เป็นเหมือนสินค้าที่ผลิตออกมาจากโรงงาน เช่นถ้าSuper Class เป็นโรงงานผลิตไอศครีม Sub Classจะเป็นเหมือนไอศครีมรสต่างๆ (พูดง่ายๆคือ มีแกนหลักเป็นไอศครีมเหมือนกัน แต่ส่วนประกอบของไอศครีมแต่ละรสอาจต่างกัน)
3. Factory Class เป็น Class อีกตัวที่จะต้องถูกสร้างขึ้นเพื่อเป็นตัวกำหนดการผลิต ซึ่งจุดเด่นของ Factory Method Pattern อยู่ทีนี่ โดยFactory Class จะมีMethodในการรับคำร้องขอการผลิตและจะคืนผลิตภัณท์ที่ได้ไปให้ผู้ร้องขอ


พูดมาถึงตรงนี้บางคนอาจจะงง ดังนั้นเราไปดู Source Code ประกอบเพื่อความเข้าใจกันดีกว่าครับ



             จะเห็นว่า class Icecream เป็น Super Class ซึ่งเป็นตัวกำหนดว่าโรงงานนี้จะผลิตเฉพาะไอศครีมเท่านั้น ส่วน class Chocolate, class Vanilla, class Strawberry นั้นเป็น sub class ที่เป็นตัวกำหนดความแตกต่างของ ไอศครีมแต่ละรส และสุดท้ายคือ class IcecreamFactory ซึ่งเป็นเหมือนโรงงานผลิตไอศครีม ภายในมีเมธอด createIcecream ซึ่งจะรับพารามิเตอร์เป็นประเภทรสของไอศครีมที่ต้องการ จากนั้นจะคืนค่ากลับไปเป็นออบเจ็คของรสที่เลือก

สุดท้ายนี้ หวังว่าผู้ที่ได้อ่านบทความนี้จะได้รับความรู้เพิ่มเติมไม่มากก็น้อย 
และหากมีข้อผิดพลาดปรการใดผู้เขียนใคร่ขออภัยมา ณ ที่นี้ด้วยครับ ^^"