“ตอนเด็กๆ เวลาเราเรียนก็จะมีบางวิชาที่ต้องเขียนรายงานใช่มั้ยครับ? เวลาที่เราออกไปอ่านรายงานหน้าห้อง ถ้ารายงานที่เป็นส่วนของเพื่อนของเรามีการเว้นวรรคที่ไม่ดี หรือ ไม่มีย่อหน้าเลย ตัวหนังสือติดกันเป็นพรืด เราก็คงจะหงุดหงิดเป็นธรรมดา”
การเขียนโค้ดก็เช่นกัน ถ้าเราต้องไปทำงานร่วมกันคนอื่นแล้วโค้ดเค้าอ่านยากมากๆ เราก็คงจะต้องเสียเวลานานกว่าจะรู้ว่าโค้ดนั้นทำงานยังไง เราจึงต้องมีคำแนะนำในการเขียนโค้ดหรือ guide line นั่นเองเพื่อให้ทุกคนเขียนโค้ดในแนวทางเดียวกัน เวลามาอ่านจะได้ไม่ต้องเสียเวลางมนาน ซึ่งบทความนี้จะยกตัวอย่าง guide line สำหรับการเขียน python มาดูกันเลยครับ
1. ขึ้นบรรทัดใหม่ก่อนหรือหลัง operator ดี?
income = (gross_wages +
taxable_interest +
(dividends - qualified_dividends) -
ira_deduction -
student_loan_interest)
ปกติแล้วเวลาเราอ่านตัวอักษรเราจะอ่านจากซ้ายไปขวา ดังนั้นเมื่อเราขึ้นบรรทัดใหม่หลังจากตัว operator อาจทำให้เราสับสนได้ เนื่องจากตัวoperator กับ operand อยู่ไกลเกินไป
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
การขึ้นบรรทัดใหม่ก่อนตัว operator จะทำให้เราอ่านได้ง่ายกว่าและจับคู่ได้ง่ายเพราะไม่ต้องกวาดสายตาไปไกล
2. การเว้นวรรคที่ดี
การเว้นวรรคที่ไม่จำเป็นจะทำให้โค้ดอ่านยากขึ้น
spam( ham[ 1 ], { eggs: 2 } )
bar = (0, )
if x == 4 : print x , y ; x , y = y , x
จากตัวอย่างจะเห็นว่าถ้าเราเว้นวรรคเยอะเกินไปจะทำให้โค้ดของเราดูเยอะต้องกวาดสายตานานกว่าจะอ่านจบแต่ละบรรทัด แถมยังดูยากอีกด้วยว่าโค้ดของเราใช้ทำอะไรบ้าง การเว้นวรรคนั้นใช้หลังเครื่องหมาย ‘,’, ‘ และ ‘;’ ก็พอแล้ว
spam(ham[1], {eggs: 2})
foo = (0,)
if x == 4: print x, y; x, y = y, x
เท่านี้โค้ดของเราก็ดูกระชับและ map การกระทำได้ง่ายขึ้นแล้ว
3. แยกการเว้นวรรคตาม priority ของ operator
i=i+1
submitted +=1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
การเว้นวรรคระหว่าง operator ทุกครั้งไม่ใช่่ทางเลือกที่ดีเสมอไป เพราะจะทำให้เราใช้เวลานานในการอ่านว่าส่วนไหนทำงานก่อนกันแน่
i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
การเว้นวรรคหลังจากการเปลี่ยน priority ของ operator จะทำให้เราจับคู่ได้ง่ายขึ้น
4. ไม่ควรใช้ compound statement
if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()
บางคนอาจจะบอกว่าโค้ดที่สั้นนั้นอ่านง่าย แต่การให้โค้ดทำงานหลายอย่างใน 1 บรรทัดก็ไม่ใช่กับทุกคนเสมอไป เพราะเมื่อคนอื่นมาอ่านโค้ดเราแต่ละบรรทัดก็จะต้องมาตีความว่าโค้ดแต่ละบรรทัดทำอะไรลงไปบ้าง เราควรให้ 1 บรรทัด ทำงานเพียงอย่างเดียวเพื่อความง่ายต่อการอ่าน
if foo == 'blah':
do_blah_thing()
do_one()
do_two()
do_three()
5. is not และ not…is
ใช้ “is not” แทนที่จะใช้ “not…is” ถึงทั้งสองแบบจะทำงานเหมือนกัน แต่ว่าแบบแรกจะทำให้อ่านโค้ดและทำให้เข้าใจได้ง่ายมากกว่า
Yes: if foo is not None:
No: if not foo is None:
6. string method
ใช้ string method แทนที่จะใช้ string module เพราะว่าทำงานได้เร็วมากกว่า ตัวอย่างเช่น ใช้ “.startswith()” และ “.endswith()” แทนการสไลด์ string เพื่อตรวจสอบข้อความขึ้นต้นหรือลงท้าย
Yes: if foo.startswith('bar'):
No: if foo[:3] == 'bar':
7. ใช้ is แทน ==
อย่าตรวจสอบค่าความจริง (True / False) ของตัวแปรประเภท boolean ด้วยการใช้เครื่องหมาย ==
Yes: if greeting:
No: if greeting == True:
Worse: if greeting is True:
8. การตั้งชื่อ constant
ตั้งชื่อ constant ด้วยการใช้ตัวอักษรพิมพ์ใหญ่ทั้งหมด เช่น
PI = 3.14
TOTAL_DOGS = 10
เนื่องจากในภาษา python นั้นไม่สามารถประกาศตัวแปรหรือค่าใดๆให้เป็น constant ได้ ดังนั้นการตั้งชื่อตัวแปรให้ดีและถูกต้องจึงเป็นสิ่งสำคัญมากๆ
9. ชื่อตัวแปรต้องห้าม
หลายครั้งที่เราอาจใช้ชื่อตัวแปรเพียงตัวเดียวในการเขียนโค้ด อาจเป็นเพราะตัวแปรที่มีอายุการใช้งานที่สั้น เช่น ตัวแปรที่ใช้นับใน loop เรามักจะใช้ตัวอักษร‘i’(ไอเล็ก)ในการตั้งชื่อ ซึ่งการตั้งชื่อตัวแปรที่มีตัวอักษรตัวเดียวก็มีตัวอักษรที่ไม่ควรตั้งเช่น ‘I’(ไอใหญ่) และ ‘l’ (แอลเล็ก) จะเห็นว่าตัวอักษร2ตัวนี้มีหน้าตาที่แทบจะเหมือนกัน หรือ ‘o’(โอ) ก็มีความใกล้เคียงกับศูนย์ ดังนั้นจึงไม่ควรใช้ในการตั้งชื่อ
อย่างไรก็ตามการตั้งชื่อตัวแปรก็ควรใช้เป็นคำที่เหมาะสมกับบริบทการใช้ตัวแปรนั้นๆจะเป็นการดีที่สุดเช่นตัวแปรที่ใช้เก็บค่าผลลัพธ์ ก็อาจจะใช้คำว่า ‘result’ ในการตั้งชื่อตัวแปรเป็นต้น
10. isinstance() แทน is type() ในobject
การเปรียบเทียบ object ควรใช้ฟังก์ชัน isinstance() แทนการตรวจสอบ type โดยตรง เช่น
Yes: if isinstance(obj, int):
No: if type(obj) is type(1):
ข้อควรระวัง ใน Python 3 นั้นตัวแปรประเภท string นั้นมีเพียงแค่ str เพียงอย่างเดียว ในขณะที่ Python 2 นั้นมี str และ unicode string ซึ้งสองตัวนี้มี base class เดียวกันคือ basestring ดังนั้นเวลาจะตรวจสอบว่า object เป็น string รึเปล่า ใน Python3 และ Python 2 จึงเขียนได้แบบนี้
Python 3:
if isinstance(obj, str):
Python 2:
if isinstance(obj, basestring):
จบแล้วครับกับตัวอย่าง guide line ในการเขียน python ทุกคนคงจะรู้แล้วว่าการเขียน guide line นั้นส่งผลต่อการอ่านขนาดไหน เวลาที่เราอ่านโค้ดของเพื่อนร่วมงานเราก็อยากอ่านโค้ดที่อ่านง่ายใช่มั้ยล่ะครับ เพื่อนของเราก็เช่นกัน ดังนั้นเวลาที่ต้องเขียนโค้ดไม่ว่าจะเป็นภาษาอะไรก็อย่าลืมที่จะอ่าน guide line และทำตาม guide line ของภาษานั้นๆด้วยนะครับ
บทความนี้อ้างอิงจาก: https://www.python.org/dev/peps/pep-0008/ ถ้าใครสนใจที่จะศึกษา guide line แบบเต็มๆ ลองเข้าไปดูได้เลย!