ที่ทำงานฉันเขียนสคริปต์ทุบตีบ่อยๆ หัวหน้างานของฉันแนะนำว่าสคริปต์ทั้งหมดจะถูกแบ่งเป็นฟังก์ชั่นคล้ายกับตัวอย่างต่อไปนี้:
#!/bin/bash
# Configure variables
declare_variables() {
noun=geese
count=three
}
# Announce something
i_am_foo() {
echo "I am foo"
sleep 0.5
echo "hear me roar!"
}
# Tell a joke
walk_into_bar() {
echo "So these ${count} ${noun} walk into a bar..."
}
# Emulate a pendulum clock for a bit
do_baz() {
for i in {1..6}; do
expr $i % 2 >/dev/null && echo "tick" || echo "tock"
sleep 1
done
}
# Establish run order
main() {
declare_variables
i_am_foo
walk_into_bar
do_baz
}
main
มีเหตุผลใดที่จะทำสิ่งนี้นอกเหนือจาก "การอ่าน" ซึ่งฉันคิดว่าน่าจะเป็นที่ยอมรับได้ดีพอ ๆ กับความเห็นเพิ่มเติมและระยะห่างระหว่างบรรทัดบางส่วน?
มันทำให้สคริปต์ทำงานได้อย่างมีประสิทธิภาพมากขึ้น (จริง ๆ แล้วฉันคาดหวังสิ่งตรงกันข้ามถ้ามี) หรือทำให้การแก้ไขโค้ดง่ายกว่าความสามารถในการอ่านที่กล่าวมาข้างต้นหรือไม่? หรือมันเป็นเพียงแค่การตั้งค่าโวหาร?
โปรดทราบว่าแม้ว่าสคริปต์ที่ไม่ได้แสดงให้เห็นถึงมันได้ดี "สั่งรัน" ฟังก์ชั่นในสคริปต์ที่แท้จริงของเรามีแนวโน้มที่จะเป็นเชิงเส้นมาก - walk_into_bar
ขึ้นอยู่กับสิ่งที่i_am_foo
ได้ทำและdo_baz
ทำหน้าที่ในสิ่งที่ตั้งขึ้นโดยwalk_into_bar
- เพื่อให้เป็น ความสามารถในการสลับคำสั่งเรียกใช้งานโดยพลการไม่ใช่สิ่งที่เรามักจะทำ ตัวอย่างเช่นคุณจะไม่ก็ต้องการที่จะนำdeclare_variables
หลังจากwalk_into_bar
ที่จะทำลายสิ่ง
ตัวอย่างของวิธีที่ฉันจะเขียนสคริปต์ข้างต้นจะเป็น:
#!/bin/bash
# Configure variables
noun=geese
count=three
# Announce something
echo "I am foo"
sleep 0.5
echo "hear me roar!"
# Tell a joke
echo "So these ${count} ${noun} walk into a bar..."
# Emulate a pendulum clock for a bit
for i in {1..6}; do
expr $i % 2 >/dev/null && echo "tick" || echo "tock"
sleep 1
done
local
ให้ขอบเขตของตัวแปรที่มีความสำคัญอย่างมากในสคริปต์ที่ไม่สำคัญ
main()
ที่ด้านบนและเพิ่มmain "$@"
ที่ด้านล่างเพื่อเรียก นั่นช่วยให้คุณเห็นตรรกะของสคริปต์ระดับสูงสิ่งแรกเมื่อคุณเปิด