Objective-C Coding Style : Naming
สิงหาคม 17, 2011 at 4:33 pm 2 ของความคิดเห็น
“ภาษา” เป็นสิ่งที่ถูกประดิษฐ์ขึ้น เพื่อสื่อสารระหว่างกัน ภาษาไทย, ภาษาอังกฤษ, ภาษามือ, ภาษากาย ฯลฯ ล้วนแล้วแต่เป็นสิ่งที่ถูกประดิษฐ์ขึ้นเพื่อการสื่อสารทั้งสิ้น รวมทั้ง “ภาษาโปรแกรมมิ่ง” ก็คือสิ่งที่โปรแกรมเมอร์ใช้สื่อสารกับคอมพิวเตอร์เช่นเดียวกัน แต่นอกเหนือจากนั้น มันก็เป็นภาษาที่สื่อสารระหว่างโปรแกรมเมอร์เช่นเดียวกัน
สิ่งที่ผมเกริ่นมาข้างต้น คือความสำคัญของหัวเรื่องเรื่องนี้ เรื่อง Coding Style ของ Objective-C จริงๆเรื่องของ style มันเป็นของใครของมัน แต่ใน Entry นี้ผมขอโฟกัสกับ style ที่ “พึงกระทำด้วยประการทั้งปวง” การที่โค้ดของคุณอ่านง่ายเข้าใจง่ายไม่ซับซ้อน หรือที่ฝรั่งเรียกว่า “Clean Code” นั้น ช่วยเพิ่มประสิทธิภาพการทำงานเป็นทีม การลดเวลาการทำงานของคนที่มาทำงานต่อจากคุณ(เช่นการแก้บั๊ก) และง่ายต่อการ Optimize, Refactor หรือประโยชน์อื่นๆทั้งปวงในกระบวนการ Software Development
ใน Entry นี้ผมขอ Cover แค่เรื่อง “การตั้งชื่อ” ในการเขียน Code ภาษา Objective-C เท่านั้นนะครับ จริงๆเรื่องมันเล็กมาก มากจนผมไม่เคยคิดว่าจะมีคนทำด้วยซ้ำ แต่กระนั้น …ผมก็เจอกับตัวเองมาทุกเคส (จนต้องมาเขียนบลอกนี่แหละ) …แต่อย่างที่บอกว่าเรื่องของ Style เป็นเรื่องส่วนบุคคล มีแค่บางข้อเท่านั้นที่ผมอยากระบุเลยว่า “ควรทำตาม” แต่บางข้อก็ “แล้วแต่คุณ” ว่าแล้วก็ไปดูกันเลย
ใน Objective-C การตั้งชื่อตัวแปรโดยรูปแบบของคำ ควรเป็นลักษณะที่เรียกว่า “Camel Case” คือขึ้นต้นแต่ละคำในชื่อด้วยตัวพิมพ์ใหญ่ ส่วนตัวแรกจะเป็นพิมพ์ใหญ่ก็ต่อเมื่อเป็นชิื่อ Class เท่านั้น นอกนั้นขึ้นด้วยพิมพ์เล็กหมด เช่น MyClass, myAttribute, -(void)myFunctionWithParameter:(id)param เป็นต้น ข้อนี้จัดเป็นเรื่อง “พึงปฏิบัติตามด้วยประการทั้งปวง” แต่ข้อนี้ขอเพิ่มเติมว่า “เขียนภาษาไหนก็ตามแบบนั้นไป” ดีที่สุด
การตั้งชื่อตัวแปร หรือ attribute ของ Class ในภาษา Obj-C นั้น ถูกระบุในเอกสารของ apple อย่างชัดเจนว่า “ขึ้นต้นด้วยตัวพิมพ์เล็ก เสมอ!!” ใครที่กำลังติดนิสัยนี้อยู่ เปลี่ยนพฤติกรรมเถอะครับ เรื่องการตั้งชื่อเป็นเรื่องสามารถทำให้เกิดความเข้าใจผิดได้อย่างมากมาย เพราะการตั้งชื่อขึ้นต้นด้วยตัวพิมพ์ใหญ่ มันหมายถึง “ชื่อ Class” อันนี้เรื่องใหญ่ครับ ขอจัดความสำคัญอยู่ในระดับ “พึงปฏิบัติตามด้วยประการทั้งปวง”
ส่วนการตั้งชื่อโดยใช้ “_(Underscore) ในการเติมด้านหน้าหรือต่อท้าย“ เป็นเรื่องที่ “ทำได้” ครับ เป็นการป้องกันการเรียกใช้ตัวแปรที่ชื่อซ้ำกันได้ เช่น tableView ที่เป็น attribute กับ tableView ที่เป็นค่าที่ return มาจาก delegate method หรืออาจใช้เพื่อระบุว่าเป็น class attribute เจาะจงว่าเป็น private class attribute แบบนี้ก็ยังโอเคครับ ไม่ผิดกฎอะไรใดๆ และเป็นที่ใช้กันอยู่ทั่วไป
เรื่องก้ำกึ่งอยู่เรื่องนึงเกี่ยวกับการตั้งชื่อคือเรื่องการ “ย่อ” เรื่องนี้อยากจะบอกถึงน้องๆที่เริ่มเขียนโปรแกรมลงไปเลยด้วยซ้ำ ว่า “อย่าติดนิสัยการตั้งชื่อโดยไม่สื่อความหมายเลยครับ” ไอ้ int a, bool b, char *c เนี่ย หยุดเถอะครับ โอเคว่ามันไม่ใช่กฎ แต่เรียกว่าเป็น “มารยาท” ก็แล้วกันครับ จะมียกเว้นไว้บ้างบางตัวก็ถ้าเป็น i แล้ววนลูป อันนี้เชื่อว่าเป็น de-facto (หมายถึงมาตรฐานที่รู้ๆกันทั่วไป) แต่ผมก็ใช้ idx มากกว่านะ อันนี้ก็แนะนำว่า “ชื่อยาวนิด แต่สื่อความหมาย ดีกว่าสั้นกุดแต่ไม่รู้ห่าอะไรเลยครับ”
…นี่แหละครับ หลักๆของการตั้งชื่อในภาษา Objective-C แค่นี้เอง ง่ายมาก บางคนอาจไม่เข้าใจเพราะคุ้นกับภาษาอื่นมากกว่า เลยติดมา อันนี้ก็คงต้องปรับตัวให้เหมาะสมกับงานที่ทำและภาษาที่ใช้ไปนั่นแหละครับ ส่วนใครที่เริ่มหัดเขียนก็เริ่มฝึกให้ถูกต้องนะครับ
Entry นี้อาจจะดูเขียนแบบ “ใส่อารมณ์” เข้าไปบ้าง เพราะเจอกับตัวเองมาตรงๆทุกข้อ(เจอความลำบากในการแก้งานที่ตั้งชื่ออย่างมีปัญหา) ใครไม่พอใจก็ผ่านไปนะครับ อย่าว่ากัน สำหรับ Entry นี้ ขอจบแต่เท่านี้ครับ Happy clean coding ครับ :)
Entry filed under: Cocoa Programming, iPhone Programming, Tips & Techniques. Tags: Clean Code, cocoa, Cocoa Programming, Cocoa Touch Programming, iPhone, iPhone SDK, Xcode.
1.
memogames | สิงหาคม 17, 2011 ที่ 4:56 pm
ผมว่าหลักๆ ทุกภาษาก็น่าจะมีกฎประมาณนี้?ครับ แต่ไม่แน่ใจนะ ที่มหาลัยผมเน้น Java ตอนเรียนการตั้งชื่อ Class หรือ ตัวแปร อะไรพวกนี้ก็ตามนี้เลยครับ แต่ภาษาอื่นไม่แน่ใจนะ แต่ถ้าเจองานเร่งๆ ก็จัดมั่วไปเหมือนกัน เพลีย ฮ่าๆ
2.
Jerapong Nampetch | สิงหาคม 17, 2011 ที่ 11:38 pm
ครับ หลักๆเลยเรื่องตัวพิมพ์เล็กพิมพ์ใหญ่นี่น่าจะเหมือนกันแทบทุกภาษา ยกเว้นเรื่อง camel case ที่ไม่ได้เหมือนกันทุกภาษา อย่างเช่น C หรือ php จะใช้ _ คั่นคำมากกว่า
แต่ก็อย่างที่เคยเห็นอ่ะครับตั้ม ว่ามีโค้ดที่ไม่เขียนตามนี้มันมีจริง(จากที่เราเคยทำงานกัน) แล้วมันเพลียแค่ไหนตอนแก้ :P