วันเสาร์ที่ 13 ธันวาคม พ.ศ. 2557

State Diagram

State Diagram
     State Diagram อาจเรียกว่า State transition diagram  หรือ Harel diagram (statecharts) State Diagram เป็นแผนภาพใช้แสดงสถานะ(state) ต่างๆ ของ Object ที่เป็นได้ในระหว่างช่วงชีวิต ในการตอบสนองต่อ เหตุการณ์  (Event) ที่เกิดขึ้น โดยทั่วไปแล้ว State Diagram จะไม่ถูกใช้กับ Class ทั้งหมด แต่จะใช้อธิบายเฉพาะ Class ที่มีความซับซ้อนสูงเท่านั้น เพื่อที่จะช่วยให้การออกแบบ Algorithm ง่ายขึ้น
ตัวอย่าง State Diagram


Stateและ Transition
     ในระบบใดๆก็ตาม  สิ่งที่เคลื่อนไหวหรือการเปลี่ยนแปลงใด ๆ  ที่เกิดขึ้นในระบบนั้น  เรียกว่า  กิจกรรม  (Activity)   ซึ่งกิจกรรมนั้นเกิดขึ้นจาก  การที่ Objects ในระบบมีปฏิสัมพันธ์กัน 
     สิ่งที่ใช้เพื่อบรรยายกิจกรรมโดยรวมที่เกิดขึ้นในระบบก็คือ  Sequence   Diagram    แต่เมื่อพิจารณาเข้าไปในรายละเอียดของกิจกรรมที่เกิดขึ้นจะพบว่า   กิจกรรมโดยรวมของระบบเกิดจากกิจกรรมย่อยของ  Object   แต่ละตัวรวมกันนั่นเอง 
     กลไกที่ทำให้ระบบมีกิจกรรมก็คือการรับ/ส่ง  Message  กิจกรรมที่เกิดขึ้นใน  Object   นั้น   เกิดจาก   2  สิ่งประกอบกัน  นั่นคือ   สถานะ(State)  และ  การเปลี่ยนสถานะ (Transition)  การที่  Object   ใด ๆ  เปลี่ยนจาก  State  ที่  1   ไปยัง  State  ที่  2   จะทำให้เกิดกิจกรรม  หรือส่วนของกิจกรรมขึ้นในตัว  Object  นั้น  ดังรูปตัวอย่างของกิจกรรมของหลอดไฟ



รูปแสดงกิจกรรมที่เกิดขึ้นในหลอดไฟโดยใช้  State และ Transition  เป็นสื่อในการอธิบาย   ดังนี้
  1. หลอดไฟจะเริ่มต้นกิจกรรมทั้งหมดที่  State   หลอดยังไม่ได้ติดตั้ง
  2. เมื่อได้รับการติดตั้งแล้วหลอดไฟจะอยู่ใน  State   ปิด
  3. จากสถานะปิด   เมื่อเกิด Transition Turn on Switch   ขึ้น หลอดไฟจะเปลี่ยน State ไปยัง Stateเปิด
  4. แต่จาก  State  เปิด เมื่อได้รับ  Transition Turn off Switch  หลอดไฟจะกลับมายัง  State  เปิดอีกครั้ง  
  5. หลังจากนั้น  State  ของหลอดไฟจะเปลี่ยน  State   ไปมาระหว่าง State  ปิดเปิด เช่นนี้ต่อไป
สัญลักษณ์ที่ใช้ใน   State   Diagram
State  สถานะของ Object แทนด้วย สี่เหลี่ยมมุมมน



สัญลักษณ์ที่ใช้ใน   State   Diagram
Transition             แทนด้วย ลูกศร
                                ลากจาก state เริ่มต้นไปยัง state ที่ต้องการ
                                เขียนชื่อ Event บนลูกศร มีรูปแบบคือ
                                                [Condition]/[Action]
                                    Condition คือ เงื่อนไขในการเข้าหรือออกจาก state
                                                Action คือ กิจกรรมที่ทำระหว่างการเปลี่ยน state
สัญลักษณ์ที่ใช้ใน   State   Diagram
Event                     (เหตุการณ์หมายถึง Message หรือ Signal ที่วัตถุได้รับ
                                Events อาจจะทำให้สถานะของวัตถุเปลี่ยนแปลง หรือไม่ก็ได้



สัญลักษณ์ที่ใช้ใน   State   Diagram
จุดเริ่มต้น     จุดเริ่มต้นของกิจกรรมต่าง ๆ ใน state diagram  เรียกว่า initial state  แทนด้วยวงกลมทึบ
จุดสิ้นสุด     จุดสิ้นสุดของกิจกรรมทั้งหมดเรียกว่า End state  แทนด้วยวงกลมใส ล้อมรอบวงกลมทึบ

การจำลองกิจกรรมภายใน state (Internal Activity)
     ใช้เพื่อระบุรายละเอียดในการทำงานของ state ต่าง ๆ ให้ชัดเจนขึ้นแบ่งได้เป็น

  • กิจกรรมที่ทำเมื่อเข้ามาใน state                    (entry/action)
  • กิจกรรมที่ทำระหว่างอยู่ใน state                  (do/action)
  • กิจกรรมที่ทำก่อนที่จะออกจาก state            (exit/action)
  • กิจกรรมที่ทำเมื่อเกิดเงื่อนไขต่างๆ ขึ้น        (condition/action)

กิจกรรมที่ทำเมื่อเข้ามาใน state
entry/action
                หมายถึง เมื่อเข้ามายัง state นี้ให้ทำกิจกรรม action
                เช่น        entry/count=0
                                หมายถึง เมื่อเข้ามายัง state ให้ค่า count เป็น 0
กิจกรรมที่ทำระหว่างอยู่ใน state
do/action
                หมายถึง หลังจากเข้ามายัง state นี้แล้ว หากไม่มีเงื่อนไขอื่นใด ให้ทำกิจกรรม action
                เช่น       do/count:=count+1
                                หมายถึง เมื่อเข้ามายัง state นี้ให้เพิ่มค่า count ทีละ 1
กิจกรรมที่ทำก่อนออกจาก state
exit/action
                หมายถึง ขณะที่จะออกจาก state นี้ให้ทำกิจกรรม action
                เช่น        exit/show “Good Bye” message
                                หมายถึง หากออก state นี้ให้แสดงข้อความ “Good Bye”

                กิจกรรมที่ทำเมื่อเกิดเงื่อนไขต่างๆขึ้น
condition/action
                หมายถึง ขณะที่ยังอยู่ใน state นี้เมื่อเกิดเงื่อนไขใด ๆ ที่กำหนดโดย condition ให้ทำกิจกรรม action
                เช่น        every 2 seconds/phone ring
                                หมายถึง ทุก ๆ 2 วินาทีให้เสียงโทรศัพท์ดัง 1 ครั้ง

ตัวอย่าง    State  Diagram การทำงานของลิฟต์



          รูปแสดง  State   Diagram    เพื่อจำลองการทำงานของลิฟต์   โดยมีเงื่อนไขว่า ไม่ว่าลิฟต์จะเคลื่อนที่ไปยังจุดหมายที่ชั้นใดก็ตาม   ลิฟต์จะต้องเคลื่อนที่กลับมาอยู่ที่ชั้น   1 ตามเดิม (Idle) State   Diagram    นี้ อธิบายการทำงานของลิฟต์ได้ดังนี้
  1. เริ่มต้นที่  Initial   State เมื่อมีการเปิดสวิตช์ของลิฟต์ ลิฟต์จึงเข้าสู่สภาวะหยุดนิ่ง (Idle)
  2. เมื่อมีคนต้องการที่จะขึ้น (Want Up)   ลิฟต์จึงมีการเคลื่อนที่ขึ้น (Go up)   ทำให้ลิฟต์อยู่ในสภาวะเคลื่อนขึ้น (Move Up)
  3. แต่ถ้ามีคนต้องการที่จะลง (Want   Down) ลิฟต์จึงมีการเคลื่อนที่ลง (Go Down) ทำให้ลิฟต์อยู่ในสภาวะเคลื่อนลง (Move Down)
  4. สืบเนื่องจากข้อ  2  และ   3   เมื่อลิฟต์มาถึงชั้นที่ต้องการ  (แต่ไม่ใช่ชั้นที่  1  ซึ่งเป็นชั้นล่างสุด  - floor  < >  1)   ลิฟต์จะอยู่ในสถานะ  Reach   จนกว่าคนจะลงจากลิฟต์จนหมด  จึงเลื่อนลงมา  (Go Down)   ที่ชั้นที่  1  แล้วกลับสู่สภาวะ  Idle  อีกครั้ง
  5. แต่จากข้อ 3   ถ้าลิฟต์มาถึงชั้นที่ 1   แล้วจะ Idle ทันที
  6. เมื่อลิฟต์อยู่ในสภาวะ   Idle   เมื่อใดก็ตามที่มีการปิดสวิตช์ (Turn Off) กิจกรรมทั้งหมดของลิฟต์จะหยุดทันที   (การทำงานมาถึง Final State แล้ว)   นั่นหมายความว่าลิฟต์จะถูกปิดได้ก็ต่อเมื่อลิฟต์อยู่ในสภาวะ   Idle   เท่านั้น

           จากการใช้  Internal   Activity   เพื่อบรรยายกิจกรรมที่เกิดขึ้นกับ   Objects ต่างๆ ในตัวอย่างที่ผ่านมา  
เราสามารถสร้าง   State   Diagram   ที่มี   State ซึ่งมี   Internal Activity   ได้ดังรูปต่อไปนี้ 




State Diagram ที่มี   Internal Activity  ในแต่ละ  State สามารถอธิบายได้ดังนี้
State Idle หมายถึง State ของลิฟต์ เมื่อ Lift ยังอยู่ที่ชั้นที่ 1  เข้ามายัง State นี้ ค่า Floor จะถูก Set ไว้ที่ 1 เสมอ

state Move Down หมายถึง State ของลิฟต์ ที่มีการเคลื่อนที่ลงทีละขั้น  โดยเมื่อใดก็ตามที่เข้ามายัง State นี้ ค่า floor จะลดลง ทีละ 1 และ  เมื่อใดก็ตามที่ Floor มีค่าเป็น 1 ให้หยุดลิฟต์ทันที  ซึ่งการหยุดลิฟต์ที่  floor  เท่ากับ  1  นั้นเท่ากับเป็นการบังคับให้ลิฟต์เข้ามาอยู่ในสถานะ  Idle โดยปริยาย 

State Move Up   หมายถึง State ของลิฟต์ ที่มีการเคลื่อนที่  ใดก็ตามที่เข้ามายัง State นี้ ค่า floor จะเพิ่มขึ้นทีละ 1 และ  เมื่อใดก็ตามที่ Floor มีค่าเป็น Max   ซึ่งหมายถึงลิฟต์อยู่ในชั้น  สูงสุด ให้หยุดลิฟต์ทันที


Reach   หมายถึง State ที่ลิฟต์มาถึงยังขั้นที่กำหนด (มีคนต้องขึ้นหรือลงจากลิฟต์) ซึ่งเมื่อใดก็ตามที่เข้ามาถึง State นี้แล้ว  ต้องหยุดลิฟต์ทันที



วัตถุดิบที่นำมาใช้ในการสร้าง   State Diagram คือ Class Diagram และ Sequence Diagram   Class  Diagram   จะทำให้เห็นภาพของ  Class  แต่ละClass และแต่ละ Method ของ Class จะหมายถึง State  Diagram หนึ่งชุด 
                Sequence  Diagram จะทำให้เห็นภาพกิจกรรมของ  Class ซึ่งจะใช้เพื่อโต้ตอบกับ Class อื่น ๆ ใน  Problem   Domain ซึ่งมีส่วนช่วยในการพิจารณาแนวการดำเนินไปของการเปลี่ยน State ของ Class หนึ่ง ๆ  นั่นเอง

หลักในการเขียน   State Diagram   ให้มีประสิทธิภาพมีดังนี้
  1. จากClass   Diagramให้ดูว่ามี State  Diagram กี่ตัวที่ต้องเขียน  ซึ่งปกติแล้วจะเท่ากับจำนวน  Method ของแต่ละ Class รวมกันแต่อย่างไรก็ตามไม่จำเป็นที่จะต้องเขียน  State  Diagram ของทุกๆ  Method ของทุก ๆClassในบาง Methodที่ไม่ได้มีกิจกรรมที่ซับซ้อนก็ไม่จำเป็นต้องมี State  Diagram 
  2. ในแต่ละClassให้พิจารณาว่าจะมี State อะไรบ้าง(โดยยึดจากหลักการของความเป็นจริง)โดยยังไม่ต้องคำนึงว่ามี Method อะไรอยู่บ้าง
  3. จาก Stateที่มีอยู่ให้เขียน State Diagramของแต่ละ Method
  4. หากพบว่ามี   State ใดที่จะต้องเพิ่ม เพื่อทำให้ State Diagram สมบูรณ์ขึ้น ให้เพิ่มเข้าไป
  5. ทำข้อ 3 และ4 จนกว่าจะได้ State Diagram ของ 1 Class ที่สมบูรณ์
  6. ทำข้อ 1 5 จนครบทุก ๆ ClassในClass Diagram


พิจารณาหลักการเขียน   State Diagram   
                ตัวอย่างการเขียน State  Diagram ของ Method ต่างๆของ Class Computerได้ดังต่อไปนี้
Stateที่ควรจะมีของ Class Computer  คือ
  • Off  (เครื่องปิด)
  • On   (เครื่องเปิด)
  • Boot  (เครื่องกำลังเริ่มทำงาน)
  • Ready  (เครื่องพร้อมทำงาน)
  • Reading  (อ่านคำสั่งจากหน่วยความจำ (Memory) )
  • Sending (ส่งคำสั่งที่อ่านได้ไปยัง CPU)
  • Decoding (ถอดรหัสคำสั่งโดย CPU)
  • Executing (ประมวลผลคำสั่ง โดย CPU)
  • Buffering  (เก็บผลลัพธ์จากการประมวลผลไว้ใน Memory ชั่วคราวเพื่อรอการประมวลผลเสร็จสิ้น)
  • Output  (การแสดง Output   ออกทางอุปกรณ์แสดงผลต่างๆ)
  • Storing Data (การเก็บผลลัพธ์จากการประมวลผลไว้ใน Memory
State Diagram ของแต่ละ Method เป็นดังนี้



Read Instruction (อ่านคำสั่งจาก Memory)
                ในการอ่านคำสั่งใดๆ จากMemory ของคอมพิวเตอร์นั้นจะเริ่มต้นใน  State Ready ก่อน เมื่อมีคำสั่งเข้ามาใน Memory แล้วตาม  Transition   Instruction  Coming  คอมพิวเตอร์จะเริ่มเข้าไปยัง  State Reading   ซึ่งจะอ่านคำสั่งจาก Memoryทีละคำสั่งไปจนกว่าจะเสร็จสิ้น (Reading  Complete


                ซึ่งเมื่ออ่านเสร็จแล้วคอมพิวเตอร์จะส่งคำสั่งที่อ่านได้ไปยัง  CPU   ดังระบุไว้ใน  State  Sending   และคอมพิวเตอร์จะวนอยู่ใน  State นี้(ดังจะเห็นจาก  Transition  Sending not Complete) จนกว่าจะเสร็จสิ้น จึงกลับเข้าไปยัง  State  Ready

Decode (การถอดรหัสคำสั่ง)

                ในการถอดรหัสคำสั่ง  โดยไม่ต้องมีเงื่อนไขใด  ๆ  คอมพิวเตอร์จะเปลี่ยนจากสถานะ  Ready   มายังสถานะ   Decoding   ซึ่งใน State   นี้ คอมพิวเตอร์จะถอดรหัสคำสั่งทีละคำสั่งจนกว่าจะหมด   และเมื่อการถอดรหัสเสร็จสิ้นแล้ว (Decoding Complete)   จึงกลับไปอยู่ในสถานะ   Ready    เพื่อรอคำสั่งใหม่ต่อไป
Execute    (การประมวลผล)
                การประมวลผลในคอมพิวเตอร์จะเริ่มต้นที่  State  Ready แล้วเข้าไปยัง  State  Executing ซึ่งจะวนอยู่ใน Stateนี้จนกระทั่งคำสั่งถูกประมวลผลเสร็จสิ้นซึ่งการประมวลผลเสร็จสิ้นนั้นแบ่งออกเป็น2 แบบ
คือ  การประมวลผลคำสั่งเกี่ยวกับ  Memory   และการประมวลผลทาง  Input / Output
                ซึ่งการเสร็จสิ้นการประมวลผลทาง   Memory   นั้นคอมพิวเตอร์จะย้ายกลับไปยัง  State  Ready    
ในขณะที่  เมื่อการประมวลผลทาง  Input / Output  เสร็จสิ้น คอมพิวเตอร์จะย้ายไป  State  Buffering ซึ่งเป็นการบันทึกผลการประมวลผลไว้ใน  Memory  เพื่อรอการนำออกไปยังอุปกรณ์  Output  หลังจากที่การทำ  Buffering    เสร็จเรียบร้อย จะเข้าไปยัง State  Output ซึ่งเมื่อเข้าไปยัง  Stateนี้จะนำผลที่ได้ออกทางอุปกรณ์  และเมื่อการนำข้อมูลออกแสดงทางอุปกรณ์  Output   แล้วจึงกลับมาสู่   State  Ready   ตามเดิม
Store   Data   (การบันทึกผลลัพธ์สู่ Memory)
                การ Store Data เริ่มต้นที่ State Ready แล้วเข้าสู่ State Storing Data ซึ่งจะบันทึกข้อมูลใน Memory   จนกว่าจะครบถ้วนในทุกๆหน่วยข้อมูล หลังจากนั้นจึงกลับเข้าสู่ State Ready ตามเดิม
ข้อควรคำนึงในการเขียน State Diagramใน Analysis  Phase คือต้องเขียน Stateให้ครบในภาพรวมทั้งหมดก่อน  โดยยังไม่ต้องคำนึงถึงรายละเอียดของแต่ละ StateและTransition มากนัก  
                แต่ที่สำคัญคือต้องไม่มี StateและTransitionใดตกหล่นหรือหายไป แล้วขั้นตอนของ Design Phase   นั้น เราจะทำให้State Diagram มีความละเอียดมากขึ้นจนสามารถนำไปสร้างเป็นโปรแกรมได้ต่อไป

ตัวอย่าง State Diagram

การชำระเงิน
การทำงานของลิฟต์
การทำงานรีโมตควบคุมเครื่อง CD/DVD
State Diagram ใช้อธิบายการเปลี่ยนแปลงจาก State หนึ่งไปยังอีก State หนึ่ง
                ส่วน Activity Diagram หรือแผนภาพแสดงกิจกรรม  ใช้อธิบายกิจกรรมที่เกิดขึ้นในลักษณะกระแสการไหลของการทำงาน (workflow) 
                Activity Diagram  จะมีลักษณะเดียวกับ Flowchart (แสดงขั้นตอนการทำงานของระบบ) โดยขั้นตอนในการทำงานแต่ละขั้นตอนซึ่งเรียกว่า Activity
                ใช้ Activity Diagram
                                - อธิบาย กระแสการไหลของการทำงาน (workflow)
                                - แสดงขั้นตอนการทำงานของระบบ
Activity  อาจเป็นการทำงานต่างๆ ได้แก่
                การคำนวณผลลัพธ์บางอย่าง
                การเปลี่ยนแปลงสถานะ (State) ของระบบ
                การส่งค่ากลับคืน
                การส่งสัญญาณ
                การเรียกให้ Operation (Method) อื่นๆเพื่อทำงาน
                การสร้าง หรือ ทำลายวัตถุ





วีดีโออธิบายการทำงาน  State  Diagram การทำงานของลิฟต์