วันศุกร์ที่ 14 มิถุนายน พ.ศ. 2556

หลักการเขียนโปรแกรม (ทางเลือกและทางแยก) ของ Batch File

ในทุกวันนี้...โปรแกรมเมอร์และผู้เขียนโปรแกรมเป็นไม่ว่าจะภาษาใดๆ มีเยอะมาก...แต่โดยรวมแล้วหลักการเขียนโปรแกรมและโครงสร้างของภาษานั้น...บางคนยังตีความไม่ได้ว่า...ตัวเองถนัดด้านใด...และเขียนโปรแกรมด้วยภาษานี้...มันเรียกว่าอะไร
โดยส่วนตัวผมถนัดโปรแกรมแบบไม่มีโครงสร้าง, เชิงโครงสร้าง ไม่ถนัดโปรแกรม เชิงโมดูล และ เชิงวัตถุ... แต่ด้วยเทคโนโลยีที่เปลี่ยนไป...ทำให้ต้องปรับตัวเพื่อความอยู่รอดเหมือนกัน..เพื่อที่ก้าวสู่อนาคต...โดยไม่สูญพันธ์ทางความคิดไปพร้อมโลกยุคโบราณ
และโปรแกรมแยกเป็นอะไรบ้าง?
1. โปรแกรมแบบไม่มีโครงสร้าง
2. โปรแกรมเิชิงโครงสร้าง
3. โปรแกรมเชิงโมดูล
4. โปรแกรมเชิงวัตถุ

โปรแกรมแบบไม่มีโครงสร้างเป็นอย่างไร?
โปรแกรมแบบไม่มีโครงสร้าง...ทำงานง่ายๆ รันและจบ ถ้าเปรียบกับ Batch File เองมันเหมือนโปรแกรมที่คุณเขียนขึ้นโดยควบคุมด้วย Goto และ :Label เป็นหลัก เรียกขึ้นทำงานรอรับคีย์ไม่กี่อย่างก็จบการทำงาน โปรแกรมจำพวกนี้เป็นแม่แบบภาษายุคโบราณได้ Assembly, QBasic และโปรแกรมแบบอินเตอร์พลีต (ประมวลผลทีละบรรทัด) ทำงานที่ไม่ซับซ้อน...ถ้าเขียนมันด้วยคำสั่ง Goto จำนวนมากจะเกิดข้อผิดพลาด...และความสับสนต่อผู้เขียนอย่างมาก สื่อสารลำบาก...ที่สำคัญ...ไม่มีใครเขียนขึ้นมาแล้วยกเว้นยังอนุรักษ์ โครงสร้างแบบนี้ไว้ใน Batch File แต่ถ้าทำงานซับซ้อน...เช่นแสดง Logo ทุกครั้งที่รับแป้นพิมพ์ คำสั่ง Goto อาจทำได้ยาก เช่น

@echo off
:Main
cls
Echo MyLogo Line 1
Echo MyLogo Line 2
Echo MyLogo Line 3
Echo MyLogo Line 4
Echo MyLogo Line 5
set /p p1=Enter Your Password : 
if not "%p1%"=="" goto :Confirm
goto :Main

:Confirm
rem อยากแสดง Logo อีกครั้งต้อง ก็อปข้างบนมาให้เปลืองบรรทัดอีก
Echo MyLogo Line 1
Echo MyLogo Line 2
Echo MyLogo Line 3
Echo MyLogo Line 4
Echo MyLogo Line 5
set /p p2=Confirm Password  : 
if "%p1%=="%p2% goto :Admin
goto :Main

:Admin
.
.
.
goto :Main

โปรแกรมเชิงโครงสร้างเป็นอย่างไร?
ผมอยากให้ทุกคนมอง Batch File เป็นภาษาเชิงโครงสร้าง...คือทำงานแบบเรียก "โพซิเยอร์" หรือ "โมดูล" และคืนค่่า่กลับมา...เพื่อให้ง่ายต่อการสื่อสารกับผู้สารต่อ...และง่ายต่อผู้เขียนโปรแกรมเองไม่แนะนำให้เขียน Batch File แบบเมื่อก่อนคือ เอะอะ อะไร ก็ Goto :Label เอาอย่างเดียวเพราะ Batch File เองนั้นในปัจจุบันไม่ได้เหมือนเมื่อก่อนแล้ว...ที่จะเขียนคำสั่ง ใน "โพซิเยอร์" นั้นต้องแยกไปอีกแฟ้ม...เดียวนี้ "มันไม่ต้อง Batch File แยกไปอีกตัวแล้ว" เพราะสามารถเรียก Batch  File อีก "โพซิเยอร์" ณ ตำแหน่ง :Label ได้เลย เพียงแต่ตอนท้ายของ "โพซิเยอร์" ให้กำหนดคำสั่ง Goto :EOF เท่านั้น และการเขียนโปรแกรมเชิงโครงสร้างนี้...สามารถทำให้ Batch File สามารถทำงานที่ซับซ้อนได้มากขึ้น เช่น ถ้าคุณต้องการแสดง Logo ของคุณที่ Batch File แบบตอนต้น...จะสิ้นเปลืองคำสั่ง...มาดูการทำงานของโปรแกรมแบบโครงสร้างทำงานอย่างไร

@echo off
:Main
Call :BeginEnter
Call :LastEnter
if "%p1%=="%p2% Call :Admin %p1%
goto :Main

:BeginEnter
Call :MyLogo
set /p p1=Enter Your Password : 
goto :EOF

:LastEnter
Call :MyLogo
set /p p2=Confirm Password  : 
goto :EOF

:MyLogo
cls
Echo MyLogo Line 1
Echo MyLogo Line 2
Echo MyLogo Line 3
Echo MyLogo Line 4
Echo MyLogo Line 5
goto :EOF

:Admin %1
goto :EOF

จากตัวอย่าง...เจตนาคือให้บรรทัดสั้นลง...แต่ด้วยจำนวนชุดคำสั่งยังน้อยอยู่เลยไม่เห็นความแตกต่าง...จริงๆ แล้วการเขียนโปรแกรมเชิงโครงสร้างนั้นชุดคำสั่งจะสั้นลง...การทำงานจะซับซ้อนหรือฉลาดขึ้น...รวมถึงการปรับเปลี่ยนค่าเช่น...จะเพิ่มบรรทัด Echo MyLogo Line 6 เข้ามา...แค่เพิ่มในโพซิเยอร์ :MyLogo เท่านั้น...ไม่ต้องยุ่งยากเหมือนตอนแรกที่ต้องเพิ่มมันทุกๆ :Label ของคำสั่งที่เรียก การเขียนโปรแกรมเชิงโครงสร้าง...จะเป็นพื้นฐานที่ดีในการเขียนโปรแกรมในอนาคตสำหรับผู้ที่จะเป็นโปรแกรมเมอร์ชั้นเซียน ... หลักการของมันคือ ... "ถ้าพบว่าชุดคำสั่ง ใดๆ มีความซ้ำหรือเรียกใช้งานบ่อยๆ และสามารถนำมันแยกออกมาเป็นโพซิเยอร์ได้...ควรทำ" ด้วยหลักการแค่นี้...จะทำให้คุณสามารถเขียนโปรแกรมได้ซับซ้อนขึ้น...และฉลาดขึ้นมาก

โปรแกรมเชิงโมดูลเป็นอย่างไร...?
จริงๆ แล้ว...หากจะยกตัวอย่างใน Batch File นั้นไม่เหมาะ...เพราะมันเองไม่ได้ทำงานแบบ เชิงโมดูลเลย...ไม่มี Class หรือ Module ที่เรียกใช้สำหรับโปรแกรมเมอร์หลายๆ คน ผู้เขียนจะเปรียบเทียบเชิงความคิดว่า...จริงๆ แล้วภาษาเชิงโมดูลเป็นส่่วนต่อของการพัฒนาิเชิงโครงสร้าง...อย่างเช่น ภาษา C ในอดีต...เป็นภาษาโครงสร้างที่มีความฉลาดและซับซ้อนมาก จนถูกพัฒนาเป็นภาษาเชิงโมดูลใน C++ , และ C# เพื่อทำงานบนระบบปฏิบัติการวินโดวส์ ส่วนบน DOS เห็นมีแต่ภาษาเชิงโครงสร้างทั้งหมด และโมดูลคืออะไร มันคือส่วนขยายของชุดคำสั่งที่อาจมีอยู่ใน ภาษานั้น จนไปถึงผู้ใช้งาน (ผู้เขียนโปรแกรม) สร้างขึ้นเองเพื่อความสะดวก เช่น ถ้าเป็น Batch File ในตอนต้น โพซิเยอร์ที่มีมีประโยชน์ต่อโปรแกรมเมอร์คนอื่น...อาจถูกแยกให้เป็น "โมดูล" ที่แสนฉลาด...และใช้งานกับ โปรแกรมอื่นๆ ได้โดยโดยไม่เป็นปัญหา โพซิเยอร์นั้นจะถูกแยกออกเป็น แฟ้มคำสั่งต่างหาก...เพื่อให้เรียกใช้งานได้เมื่อยามจำเป็น จากตัวอย่างตอนต้น...โมดูลที่แยกออกมาได้คือ

:MyLogo
cls
Echo MyLogo Line 1
Echo MyLogo Line 2
Echo MyLogo Line 3
Echo MyLogo Line 4
Echo MyLogo Line 5
goto :EOF

โปรแกรมเชิงวัตถุ...อนาคตที่ห่างไกล...ของ Batch File
Batch File นั้นทำงานเฉพาะ "แป้นพิมพ์และจอภาพ" ฉนั้นโปรแกมเชิงวัตถุเป็นเรื่องที่ห่างไกลหลักการอย่างมาก หากผู้ที่สนใจแบตช์ไฟล์ต้องการเขียนโปรแกรมให้เป็นเชิงวัตถุ...ขอเน้นย่ำว่า...ไปศึกษา VB6 หรือ VB.NET จะดีกว่า เพราะหลักการทั้ง 3 หัวข้อที่กล่าวมา...ไม่ได้มีส่วนเกี่ยวข้องกับโปรแกรมเชิงวัตถุเลย...เพราะโปรแกรมเชิงวัตถุ...พัฒนาจน "คลาส" ต่่างๆ สามารถ มีการถ่ายทอดรูปแบบและความสามรถของชุดคำสั่ง ให้เหมือนต้นแบบ... รวมถึงเทคนิคประหลาดอื่นๆ ที่ผู้เขียนเอง...ยังสับสนและไม่เข้าใจอยู่มากสำหรับภาษาเชิงวัตถุ...ทั้งศัพย์ภาษาอังกฤษที่เรียกใช้...วิธีการ...รวมถึงหลักการของภาษาเชิงวัตถุ...ทางที่ดีควรหาหนังสือด้านนี้มาวิเคราะห์และพัฒนาเองจึงจะเข้าใจ

3 ความคิดเห็น:

  1. ช่วยเขียนโค๊คการคำนวณพื้นที่สามเหลือม

    ตอบลบ
    คำตอบ
    1. Batch file ทำไม่ได้นะครับ...เพราะมันไม่สามารถคำนวนทศนิยมได้

      ลบ