มีคำถามจากน้องๆหลายคนว่าเรียนเขียนโปรแกรมมามากแล้ว แต่ให้เขียนเองก็ทำไม่ได้เสียที ลองมาดูบทความอันนี้กัน ผมอิง Java เป็นหลัก ถ้าเรียนภาษาอื่นอยู่ก็ลองปรับๆไปใช้ดู
Structured Programming มีอยู่สามฟีเจอร์
-Sequential คำสั่งจะถูก execute ทีละคำสั่งตามลำดับจากบนลงล่าง
-Selective เป็น branching เลือกว่าจะ execute คำสั่งกลุ่มไหนตามเงื่อนไข เช่น
switch-case, if-else
-Iterative ทำซ้ำๆโดยกำหนดเงื่อนไขสำหรับหยุดเอาไว้ ถ้าพอทราบจำนวนรอบที่ต้องการลูปจะใช้ for(;;){} ถ้าทราบเงื่อนไขที่จะให้หยุดแต่ไม่ทราบจำนวนรอบให้ใช้ while () {} ถ้าต้องการ execute บล็อกนั้นอย่างน้อยหนึ่งรอบใช้ do {} while (); statement ทั้งสามแบบนี้สามารถใช้สลับกันได้ เพียงแต่อาจจะทำให้โปรแกรมอ่านยากกว่าปกติ เพราะงั้นพยายามเลือกให้เหมาะกับสถานการณ์
ที่คุณจะต้องเน้นจริงๆคือ สองฟีเจอร์หลัง สังเกตโปรแกรมคนอื่นดู ทำไมตรงนี้ต้องใช้ if-else ทำไมตรงนั้นต้องเป็น while หรือ for คิดว่าถ้าแยกความแตกต่างระหว่าง Selective กับ Iterative ได้ก็คงจะรู้สึกว่าอะไรๆมันง่ายขึ้น
ส่วน break, continue, return พวกนี้เป็น transfer control statement ผมไม่ทราบเหมือนกันว่าจะจัดลงกลุ่มไหนดี
รวบยอด SP ก็คือความพยายามในการบังคับ flow ของโปรแกรมนั่นเอง อัลกอริธึมใดๆทั้งในโลกนี้และในโลกหน้าสำหรับภาษาสูงจะไม่หนีไปจากสามฟีเจอร์นี้ได้ ส่วนอัลกอริธึมที่เขียนด้วยแอสเซมบลีก็จะหนักไปทางคำสั่งกระโดดสารพัดแบบ พวกลูปเขาก็พอทำกันได้ แต่การตั้งเงื่อนไขเริ่มต้นก็จะเหนื่อยหน่อย แต่รวมๆแล้วก็ยังถือว่าคล้ายกันมาก
พวกภาษาโปรแกรมมิ่งที่บอกว่าเป็น Object-Oriented ก็จะหมายถึง OO ในส่วนของการดีไฟน์เมธอดกับฟิลด์แล้วก็ interactions ระหว่างออบเจกท์ แต่โค้ดข้างในเมธอดก็ยังต้องเป็น Structured Programming อยู่ดี OO เป็นเรื่องของดีไซน์ เป็น high-level ส่วน SP เป็นเรื่องของ implementation/coding เป็น low-level เพราะฉะนั้นบางคนที่ใช้ภาษาแบบ OO แต่ไม่เข้าใจหลัก OO ก็ยังพอเอาตัวรอดได้ด้วยการเขียนแบบเน้น SP นี่เอง พวกที่เขียนโปรแกรมแบบมีแต่ main() แค่เมธอดเดียว หรือหลายๆเมธอดแต่เรียงลำดับการทำงานเป็นลิเนียร์นี่ใช่เลย พูดไปแล้วก็เพิ่งนึกออกว่าถึงจะถนัดเขียนแต่ SP ทั้งที่ใช้ภาษา OO อยู่ แต่เขาก็ต้องเข้าใจหลัก OO บ้างอยู่ดี เช่นโปรแกรมเมอร์บางคนที่ถนัดดีไซน์โปรแกรมแบบ SP เขาย่อมเข้าใจว่าจะเอาไลบรารีแบบ OO มาใช้งานได้อย่างไร แต่ไม่นึกอยากจะออกแบบระบบในภาพรวมให้เป็น OO จริงๆ
มีอีกข้อนึงที่คุณควรรู้คือความแตกต่างระหว่าง expression และ statement
expression เมื่อ evaluate ออกมาจะได้ value ซึ่งเอาไปใช้ป้อนให้เมธอดอื่น หรือเอาไป assign ให้กับตัวแปรก็ได้ เช่น 75*3 เป็น expression มีค่าเป็นตัวเลขเท่ากับ 225
แต่ statement ถูก execute เพื่อเน้น side-effect ของมัน และบางทีในหนึ่ง statement จะมี expression แทรกลงไปอยู่ในนั้นด้วย เช่น
String question = "Are you having fun reading this?";
"Are you having fun reading this?" เป็น literal String ซึ่งถ้าว่าไปมันก็เป็น expression แบบหนึ่งซึ่งรีเทิร์นค่า (value) มาเป็น String reference
เครื่องหมาย = ข้างบนเป็น assignment operator เพื่อป้อน reference กลับไปให้ตัวแปร question เช่นนี้ได้ความครบถ้วนเป็นหนึ่ง statement
จะยกตัวอย่างให้อีกอัน สมมติเราจะเขียนโปรแกรมด่าตัวโกงในละครเรื่องใดๆทั้งในโลกนี้และโลกหน้า ขณะเขียนโปรแกรม (compile-time) เราไม่ทราบว่าตัวโกงเป็นผู้ชายหรือผู้หญิง จะทราบต่อเมื่อละครออกอากาศแล้ว (runtime)
myMouth.say("What a manipulating " + ((myVillain.gender==MALE)?"son of a ":"") + "buitch!");
expression ใน statement ข้างบนนี้สามารถ evaluate ออกมาได้สองแบบ ขึ้นกับฟิลด์ชื่อmyVillain.gender
1) "What a manipulating buitch!"
2) "What a manipulating son of a buitch!"
side-effect ของ statement นี้คือเราได้ด่าตัวโกงผ่านการเรียกเมธอด say();
ถึงตรงนี้แล้วรู้สึกว่าคลิกไหมครับ
จากคุณ :
the apprentice paragon
- [14 ธ.ค. 44 05:43:39]