เครื่องมือการออกแบบโปรแกรม
แนะนำใหม่| English | ไทย |
|---|---|
| structure chart/ˈstrʌktʃə tʃɑːt/ | แผนภาพโครงสร้าง |
| state-transition diagram/steɪt trænˈsɪʃn ˈdaɪəɡræm/ | แผนภาพการเปลี่ยนสถานะ |
| pseudocode/ˈsuːdəʊkəʊd/ | รหัสจำลอง |
| decomposition/ˌdiːkɒmpəˈzɪʃn/ | การแยกย่อย |
| subroutines/ˈsʌbruːtiːnz/ | ซับรูทีน |
| parameters/pəˈræmɪtəz/ | พารามิเตอร์ |
| top-down design/tɒp daʊn dɪˈzaɪn/ | การออกแบบจากบนลงล่าง |
| states/steɪts/ | สถานะ |
ปีที่ซอฟต์แวร์กลายเป็นวิศวกรรม
- ในเดือนตุลาคม 1968 นักเขียนโปรแกรมชั้นนำของโลกจำนวนห้าสิบคนได้มารวมตัวกันที่การ์มิช ประเทศเยอรมนี เพื่อหารือว่าทำไมโปรแกรมขนาดใหญ่จึงล้มเหลว: ล่าช้า เกินงบประมาณ และไม่เชื่อถือได้ พวกเขาได้คิดคำขึ้นมาเพื่ออธิบายสิ่งที่ขาดหายไป: วิศวกรรมซอฟต์แวร์
- ข้อร้องเรียนนั้นเรียบง่าย ผู้สร้างวาดก่อนสร้าง วิศวกรคำนวณก่อนตัด นักเขียนโปรแกรมพิมพ์ code ก่อนใครจะวาดโปรแกรมออกมา
- ภาพวาดที่ได้จากทศวรรษนี้คือสิ่งที่คุณจะใช้ในขั้น design: the structure chart, ซึ่งแสดงว่าโปรแกรมถูกแบ่งออกเป็นส่วนใดบ้าง, และ the state-transition diagram, ซึ่งแสดงพฤติกรรมของ它
- บทเรียนนี้คือวิธีการอ่าน它们, สร้าง它们, และแปลง structure chart เป็น pseudocode
สิ่งที่การออกแบบตัดสินใจ
- Analysis บอก what โปรแกรมต้องทำ Design ตัดสินใจ how: โครงสร้างข้อมูล, อัลกอริทึม, โมดูล และอินเทอร์เฟซ
- ขั้น design ผลิตภาพวาดที่นักเขียนโปรแกรมสามารถ code จากได้: a flowchart สำหรับตรรกะของอัลกอริทึมเดียว, pseudocode สำหรับสิ่งเดียวกันในรูปแบบข้อความ, a structure chart สำหรับโมดูล, และ a state-transition diagram สำหรับพฤติกรรม
- แต่ละเครื่องมือตอบคำถามที่แตกต่างกัน, และการสอบถามว่าอันไหนเหมาะสมที่สุด
ตรรกะของอัลกอริทึมหนึ่ง ซึ่งวาดขึ้นก่อนจะเขียนโค้ด
ห้องปฏิบัติการกระบวนการซอฟต์แวร์
จำแนกตัวอย่างการพัฒนาตามขั้นตอนหรือเครื่องมือที่เกี่ยวข้อง
The structure chart
- A structure chart แสดง decomposition แบบลำดับชั้นของโปรแกรมออกเป็นโมดูล, subroutines ของมัน, และ parameters ที่ส่งระหว่างกัน This top-down design แบ่งปัญหาใหญ่หนึ่งปัญหาออกเป็นปัญหาย่อยเล็กๆ หลายปัญหา, แต่ละอย่างกลายเป็นโมดูล
- แต่ละโมดูลเป็นสี่เหลี่ยมผืนผ้า เส้นเชื่อมผู้เรียก (caller) ด้านบนเข้ากับโมดูลที่ถูกเรียก ด้านล่าง โมดูลในระดับเดียวกันถูกเรียกจากซ้ายไปขวา
- ลูกศรเล็กๆ ข้างเส้นนำข้อมูล: พารามิเตอร์ที่ถูกส่ง ลง ไปยังโมดูล, ผลลัพธ์ที่ถูกส่ง กลับ ขึ้นไปหาผู้เรียกใช้的形状เพชร (diamond) แสดงถึงการเลือก, และลูกศรโค้งแสดงถึงลูป

Hierarchy on the lines, data on the arrows
Structure chart แสดง:
Structure chart เป็นการแบ่งระดับชั้นออกเป็นโมดูล โดยมีพารามิเตอร์อยู่ด้านล่างและผลลัพธ์อยู่ด้านบน
การแบ่งปัญหาออกเป็นโมดูลจากบนลงล่างเรียกว่า:
การออกแบบ Top-down ผลิตโซลูชันที่เป็นโมดูล
Worked example: read the signatures off the chart
CalculatePay
/ | \
GetEmployee CalculateBonus CalculateTax
returns: takes: sales takes: gross
employeeID returns: bonus returns: tax
GetEmployeeรับอะไรเลยและไม่ส่ง employee ID กลับ:FUNCTION GetEmployee() RETURNS INTEGERCalculateBonusรับ sales figure ลงไปและส่ง bonus กลับ:FUNCTION CalculateBonus(Sales : REAL) RETURNS REALCalculateTaxรับ gross pay และส่ง tax กลับ ลูกศรทุกเส้นบนแผนภาพคือ parameter หรือ return value ใน header; header ที่มี parameter แต่แผนภาพไม่แสดงถือว่าผิด
ใน Structure chart ลูกศรเล็กชี้ลงจาก Caller เข้าไปหาโมดูล แสดงถึง ____ ที่ส่งเข้าไป
ลูกศรชี้ลงคือพารามิเตอร์ที่เข้า; ลูกศรชี้ขึ้นคือผลลัพธ์ที่กลับคืนมา รวมกันทำให้ได้ Header ของโมดูล
Worked example: construct a structure chart
- โปรแกรมอ่านคะแนนนักเรียน คำนวณค่าเฉลี่ย และแสดงเกรด วาดแผนภาพโครงสร้าง.
- โมดูลด้านบนสุด:
ProcessStudent. ด้านล่างจากซ้ายไปขวา:ReadMarks, ซึ่งส่งกลับอาร์เรย์ของคะแนน;CalculateAverage, ซึ่งรับอาร์เรย์คะแนนลงมาและส่งค่าเฉลี่ยกลับมา;OutputGrade, ซึ่งรับค่าเฉลี่ยลงมาและไม่ส่งอะไรกลับ - สามสิ่งที่ได้คะแนน: hierarchy ที่มีงานหลักด้านบน, sub-tasks按照运行顺序排列, และ named parameters บนลูกศรทิศทางที่ถูกต้อง ลูกศรที่ไม่มีฉลากได้คะแนนสูงสุดเพียงครึ่งหนึ่ง
From structure chart to pseudocode
- Top module กลายเป็น main program; แต่ละสี่เหลี่ยมด้านล่างกลายเป็น procedure หรือ function whose header is read off the arrows; main program เรียก它们在 left-to-right order
PROCEDURE ProcessStudent()
DECLARE Marks : ARRAY[1:10] OF INTEGER
DECLARE Average : REAL
Marks ← ReadMarks()
Average ← CalculateAverage(Marks)
CALL OutputGrade(Average)
ENDPROCEDURE
- ค่าที่ถูกส่งคืนหมายถึง a
FUNCTION … RETURNS; modul ที่ไม่ส่งค่ากลับคือ aPROCEDUREรายการ parameter คือลูกศรชี้ลงทั้งหมด
เรียงลำดับขั้นตอนการออกแบบโปรแกรมด้วย Structure chart
Top down: งาน, งานย่อย, การไหลของข้อมูล, Headers, การเรียกใช้ ตารางเสร็จสมบูรณ์ก่อนเขียนโค้ดบรรทัดแรก
โมดูลที่มีลูกศรใน Structure chart แสดงค่าถูกส่งกลับขึ้นไป ควรเขียนเป็น PROCEDURE
ค่าที่ถูกส่งกลับมาทำให้มันกลายเป็น FUNCTION … RETURNS ส่วน PROCEDURE ไม่ส่งอะไรกลับมา
The state-transition diagram
- A state-transition diagram document behaviour ของระบบ: states ที่มันอาจอยู่ในนั้น และ events ที่ย้ายมันจาก state หนึ่งไปอีก state หนึ่ง
- แต่ละ state เป็นวงกลมหรือกล่องมุมมน; แต่ละ transition เป็นลูกศรที่มี label เป็น event ที่ก่อให้เกิดมัน, บางครั้งมี action ที่ดำเนินการ Marker แสดง start state
- It suits systems that wait for events and react: a vending machine, a traffic light, a door lock, a user interface

Every state, every event, every arrow
State-transition diagram แสดง:
สถานะเป็นวงกลม; การเปลี่ยนสถานะเป็นลูกศรที่มีป้ายชื่อเหตุการณ์ เหมาะกับเครื่องขายของอัตโนมัติ กลอนไฟ แสงสัญญาณจราจร
State-transition diagram แสดงอะไร? เลือก ทั้งหมด ที่ถูกต้อง
สถานะ, การเปลี่ยนสถานะที่มีป้ายชื่อ และสัญลักษณ์เริ่มต้น เวลาไม่ใช่ส่วนหนึ่งของแผนภาพนี้
Worked example: read the door-lock diagram
- กุญแจจะเปิดด้วยรหัส 2, 5, 9 เริ่มต้นที่ Locked การกด 2 จะเปลี่ยนสถานะเป็น One digit correct; จากนั้นการกด 5 จะย้ายไปยัง Two digits correct; และจากนั้นการกด 9 จะย้ายไปยัง Unlocked.
- การกดปุ่มอื่นใดจากสถานะรอ (waiting states) ทั้งหมดจะกลับไปที่ Locked: แผนภาพแสดงลูกศรเหล่านี้ด้วย และแผนภาพที่ไม่แสดงลูกศรเหล่านี้จะมีช่องว่าง发生了什么? ถ้าไม่มีลูกศร nàoระบุว่าเกิดอะไรขึ้นเมื่อกด 2 ในขณะที่เป็น Unlocked? หากไม่มีลูกศรใดระบุว่า会发生什么, การออกแบบไม่ได้ตัดสินใจไว้
- นั่นคือหน้าที่ของแผนภาพ: ทุกสถานะต้องระบุสิ่งที่เกิดขึ้นต่อทุกเหตุการณ์ ดังนั้นการเปลี่ยนแปลงที่ขาดหายไปจึงถูกหาได้บนกระดาษและไม่ใช่โดยลูกค้า
State-transition diagram ทำให้เห็นการเปลี่ยนสถานะที่หายไป或未 handled ได้ง่าย เพราะแสดงสถานะและการเปลี่ยนสถานะทั้งหมด
การมองเห็นทุกสถานะและเหตุการณ์เผยให้เห็นกรณีที่ยังไม่ได้จัดการ เช่น การใส่เหรียญครั้งที่สองโดยไม่คาดคิดในเครื่องขายของอัตโนมัติ
การเลือกเครื่องมือ
- เพื่อแสดงว่าโปรแกรมถูก แบ่งออกเป็นโมดูล และสิ่งใดถูกส่งผ่านระหว่างกัน: แผนภาพโครงสร้าง (structure chart)
- เพื่อแสดงว่าระบบ มีพฤติกรรมอย่างไรตามเวลา เมื่อได้รับเหตุการณ์ โดยเฉพาะเครื่องจักรหรืออินเทอร์เฟซที่มีโหมดต่างๆ: แผนภาพการเปลี่ยนสถานะ (state-transition diagram)
- เพื่อแสดง ตรรกะทีละขั้นตอน ของอัลกอริทึมหนึ่ง: แผนภาพไหล (flowchart) หรือ伪代码 (pseudocode) บอกว่าควรใช้哪种 และทำไมถึงใช้
จับคู่เครื่องมือการออกแบบแต่ละชนิดกับสิ่งที่มันแสดง
แต่ละเครื่องมือมองการออกแบบต่างกัน — โครงสร้าง (โมดูล), พฤติกรรม (สถานะ), กระแส (flowchart) หรือขั้นตอน (pseudocode)
ระบบควบคุมแสงสัญญาณจราจรต้องตอบสนองต่อนาฬิกาและปุ่มคนข้ามถนน Which design tool documents its behaviour best?
แดง, แดง-ส้ม, เขียว, ส้ม เป็นสถานะ; นาฬิกาและปุ่มเป็นเหตุการณ์ Structure chart จะแสดงโมดูล ไม่ใช่พฤติกรรม
คะแนนที่หลุดหายไป
- แผนภาพโครงสร้าง ไม่ใช่แผนภาพไหล มันแสดงลำดับชั้นและพารามิเตอร์ ไม่ใช่ลำดับของการตัดสินใจภายในโมดูล
- ตั้งชื่อให้ทุกลูกศรด้วย ชื่อ ของพารามิเตอร์หรือผลลัพธ์ และชี้ไปทางที่ถูกต้อง ลูกศรเปล่าไม่สื่ออะไรเลย
- สถานะคือ สภาวะ ที่ระบบกำลังอยู่ในนั้นและกำลังรอ; เหตุการณ์คือสิ่งที่เกิดขึ้นกับมัน "กด 5" เป็นเหตุการณ์ ไม่ใช่สถานะ
- หัวข้อของ伪代码 ต้อง ตรงกับแผนภาพ: พารามิเตอร์เดียวกัน ค่าที่ส่งคืนเดียวกัน และลำดับการเรียกใช้เหมือนกัน
คุณเข้าใจแล้ว
- แผนภาพโครงสร้าง แสดงการแยกส่วนแบบลงสู่ระดับล่าง (top-down decomposition) เข้ากับโมดูลต่างๆ พร้อม พารามิเตอร์ ที่ส่งลง และ ผลลัพธ์ ที่ส่งกลับขึ้นบนลูกศรที่มีฉลาก
- อ่านหัวข้อ伪代码 ออกจากมัน: ลูกศรชี้ลงคือรายการพารามิเตอร์, ลูกศรชี้ขึ้นทำให้มันเป็น
FUNCTION … RETURNS, และโมดูลหลักเรียกใช้จากซ้ายไปขวา - แผนภาพการเปลี่ยนสถานะ แสดง สถานะ และ เหตุการณ์ ที่ทำให้เคลื่อนย้ายระหว่างกัน และเปิดเผยการเปลี่ยนแปลงที่ไม่มีใครตัดสินใจ
- การแยกส่วน → แผนภาพโครงสร้าง; พฤติกรรม → แผนภาพการเปลี่ยนสถานะ; ตรรกะของอัลกอริทึมหนึ่ง → แผนภาพไหลหรือ伪代码