ComBioLaw.De » Blog » เขียนโปรแกรม » โค้ดสั้น vs โค้ดยาว
โค้ดสั้น vs โค้ดยาว
เหมือนทุกครั้งที่ผมจะเขียนเรื่องเขียนโปรแกรม ผมต้องออกตัวก่อนว่าผมไม่ได้เรียนด้านนี้มาโดยตรง เรื่องที่เขียนส่วนมากก็มักจะเป็นประสบการณ์งู ๆ ปลา ๆ ที่ผมพอมีอยู่บ้าง หากผิดพลาดประการใด ก็ขอคำชี้แนะด้วยครับ ผม (และเชื่อว่าอคนส่วนใหญ่) คงไม่สามารถวิเคราะห์สถานการณ์ที่เกิดขึ้น ณ ที่ทำงานของคุณ darkleonic ได้ เพราะต้องดูปัจจัยหลาย ๆ อย่างที่เกิดขึ้นในสถาณการณ์จริง ต้องดูตัวโค้ดจริง ๆ ต้องดูหลักการออกแบบของโปรแกรม และอื่น ๆ อีกมากมาย ซึ่งในเรื่องนี้หลายคนได้ออกความคิดเห็นและเสนอแนะทางออกให้คุณ darkleonic ค่อนข้างดีทีเดียว ดังนั้น ผมจะไม่เขียนถึงเหตุการณ์ที่เกิดขึ้นมากนัก แต่จะเขียนถึงการออกแบบโปรแกรมที่เกี่ยวข้องมากกว่า โดยพื้นฐานแล้วผมเชื่อว่า โค้ดสั้นย่อมดีกว่าโค้ดยาว แต่ก็ไม่สามารถครอบคลุมได้ทุกกรณี ทั้งนี้มีสองกรณีที่เราสามารถบอกได้ทันทีว่าโค้ดสั้น หรือโค้ดยาวอย่างไหนดีกว่ากัน ... |
|
สาเหตุหลักที่ผมคิดว่าโค้ดสั้นดีกว่าโค้ดยาวก็เพราะว่า ในการเขียนโปรแกรมของคนหนึ่ง ๆ ย่อมมีข้อผิดพลาด และยิ่งโค้ดยาวเท่าไร โอกาสที่โปรแกรมที่ออกมาจะมีข้อผิดพลาดก็ยิ่งมากขึ้นเท่านั้น อีกทั้ง โค้ดปริมาณมาก ๆ ก็จะทำให้การหาข้อผิดพลาด และการต่อยอดโปรแกรมยากขึ้นด้วย ซึ่งในทาง Software Architecture เอง ผมก็เชื่อว่าการทำให้โค้ดสั้นลงและดูแลง่ายขึ้น ก็เป็นหนึ่งในเป้าหมายของการออกแบบ ซึ่งจะเห็นได้จากแนวทางในการออกแบบมักจะมีเรื่องของการลด duplicate code เข้ามาเกี่ยวข้องเสมอ ในความคิดเห็นของคุณ bossalove มีประเด็นหนึ่งที่น่าสนใจทีเดียว นั่นคือ การทำให้โค้ดสั้นลงอาจเป็นการเพิ่ม coupling ผมเลยลองเปิดตำรา ค้นหาความรู้ในเรื่องที่เกี่ยวข้องมาวิเคราะห์ดู ปรากฏว่าไปเจอเรื่องของ coupling & cohesion ในส่วนของ design concept Coupling คือ ความสัมพันธ์ระหว่างหน่วยต่าง ๆ ของโปรแกรม (โมดูล, คลาส, ออพเจ็ค, etc.) การที่หน่วยต่าง ๆ ของโปรแกรมมีความสัมพันธ์กันมากเท่าไร หรือยิ่งซับซ้อนขึ้นเท่าไร ก็ยิ่งทำให้โปรแกรมมีความซับซ้อนมากขึ้นเท่านั้น ปัญหาต่าง ๆ ก็จะตามมา ดังนั้น การออกแบบที่ดีต้องลด coupling ระหว่างหน่วยให้น้อยที่สุด Cohesion คือ ความเฉพาะเจาะจงในการทำงานของหน่วยต่าง ๆ ยิ่งหน่วยต่าง ๆ ของโปรแกรมมีหน้าที่ที่เฉพาะเจาะจงเท่าไร cohesion ของหน่วยนั้น ๆ ก็จะยิ่งสูงขึ้น โดยปกติแล้ว หาก cohesion ของหน่วยนั้น ๆ ต่ำ โอกาสที่จะเกิด duplicate code ก็จะสูง การออกแบบที่ดีจึงควรเพิ่ม cohesion ของหน่วยต่าง ๆ ให้มากที่สุด ปัญหาทั้งหมดอยู่ที่ว่า หากเราเพิ่ม cohesion มากเท่าไร จำนวนหน่วยของโปรแกรมก็จะเพิ่มขึ้นเท่านั้น นั่นหมายถึงการเพิ่มของ coupling ที่ตามมา ศิลปะในการออกแบบจึงอยู่ตรงนี้เอง ว่าเราจะ ลด coupling ได้อย่างไร ในขณะที่เราเพิ่ม cohesion เมื่อนำหลักตรงนี้ มาประเมินสถานการณ์ที่คุณ darkleonic นำมาเล่าให้ฟังคือ คุณ darkleonic ได้ลดจำนวนเมโธทจาก 14 เมโธท ให้เหลือเพียงเมโธทเดียว จึงเท่ากับว่า คุณ darkleonic กำลังลด cohesion อยู่ หากมองแบบหยาบ ๆ ก็ต้องบอกว่าเป็นการลด coupling ไปด้วย ดังนั้น การที่คุณ bossalove ให้ความคิดเห็นว่า การทำเช่นนั้นจะเป็นการเพิ่ม coupling ผมจึงไม่ค่อยเห็นด้วย (แต่เรื่องนี้ การประเมินของผมเป็นการประเมินที่หยาบมาก เพราะไม่มีใครเห็นโค้ดและการออกแบบจริง ๆ) ตามคำแนะนำของตำรา เราสามารถลด coupling เพิ่ม cohesion ได้ด้วยวิธีการต่าง ๆ ดังนี้
นั่นคือคำแนะนำตามตำรา แต่หากเราคิดต่อไปว่า การเพิ่ม cohesion จะมีประโยชน์อะไรกับการออกแบบ นอกจากในเรื่องของการลด duplicate code ผมหาคำตอบให้กับตัวเองได้สองคำตอบคือ
นอกจากการแยกส่วนของโปรแกรม ด้วยหลักของ cohesion เพื่อทำให้โค้ดสั้นลงแล้ว อีกวิธีการหนึ่งที่ผมชอบทำเวลาเขียนโปรแกรมมากเป็นพิเศษ คือ การรวมส่วนที่เหมือนกันของโปรแกรมเข้าด้วยกัน (generalization) ซึ่งวิธีการนี้ไม่จำเป็นต้องขัดกับหลักของ cohesion เสมอไป เราสามารถแยกส่วนต่าง ๆ ของโปรแกรมตามหน้าที่ แต่หากว่าส่วนต่าง ๆ ที่เราแยกออกมา มีส่วนที่คล้ายกันอยู่ เราก็ generalization ในส่วนนั้น แล้วแยกมันออกมาเป็นอีกส่วนหนึ่ง แต่ปัญหาที่เกิดขึ้นคือ จะทำให้ coupling มากขึ้นด้วย ซึ่งก็ต้องระวังตรงนี้เป็นพิเศษ แต่โดยทั้งหมดทั้งสิ้นแล้ว ผมไม่เชื่อว่าในการหลักการออกแบบโปรแกรม เราต้องทำตามหลักการออกแบบในตำราเสมอไป เพราะเป้าหมายของการสร้างหลักการออกแบบทั้งหมด ก็เพื่อให้การทำงานร่วมกันง่ายขึ้น โค้ดมีคุณภาพมากขึ้น การหาข้อผิดพลาด และการต่อยอดของโปรแกรมง่ายขึ้น เมื่อพิจรณาดูแล้ว มีวิธีการที่ดีกว่าที่ว่ากันตามตำรา ก็ทำไปเถิดครับ เพราะเราต้องไม่ลืมว่า หลักการออกแบบเกือบทั้งหมด ยืนอยู่บนพื้นฐานของ OOP และ static typing ซึ่งในโลกของการเขียนโปรแกรมไม่ได้มี OOP เพียงอย่างเดียว อีกทั้งยังไม่เคยมีใครสามารถพิสูจน์ได้ว่า OOP เป็น paradigma ที่ดีที่สุด หรือว่า static typing เป็นแนวทางในการเขียนโปรแกรมที่ดีที่สุด หากสังเกตการเปลี่ยนแปลงแนวทางในการเขียนโปรแกรมที่เปลี่ยนไปในช่วงทศวรรษที่ผ่านมา เราจะเห็นได้ว่าทิศทางการเขียนโปรแกรมจะเดินทางไปทางใด สำหรับผมแล้ว การเขียนโค้ดให้สั้น กระชับ โดยที่ส่งผลข้างเคียงน้อยที่สุด เพื่อลดต้นทุนการผลิตซอพท์แวร์ ย่อมเป็นทางเลือกที่ดีกว่าเสมอ |
|
16 Aug 09 | by | tags เขียนโปรแกรม
<<Departures : ของขวัญแห่งการจากลา || Inglourious Basterds>>
bow_der_kleine
ผมติดอ่านแบบเยอรมันครับ หากมีโอกาสเขียนเรื่องเกี่ยวกับ OOP ครั้งหน้าจะปรับปรุงครับ |
coffee planet
| การนั่งถกเถึยงกันเรื่องสั้นและยาว มันต่างจากสมัยmodernismอย่างไรครับ อธิบายหน่อยดิ |
deans4j
มีความเห็นเหมือนกันนะครับ ข้อแยกเป็นสองเรื่องใหญ่ละกัน - เรื่องกระทู้ใน BN - เสริมๆ เรื่อง c & c
เรื่องแรก ขอผมพูดกับคุณโบว์ละกันนะ อันเนื่องจากผมไม่มี login BN แล้ว เนื่องจากวิเคราะห์จากสิ่งที่ให้มาเท่านั้น เอาแค่ข้อมูลเกี่ยวกับโค้ด การบอกว่ามี class เดียว 14 parameters ผมว่าก็ไม่ถูกต้องแล้วนะ แต่การบอกว่าออกแบบใหม่แล้วแยกเป็น 14 classes ก็ไม่ถูก ไม่ต่างกันนะ
14 parameters ก็มากไป ยิ่งสำหรับบางภาษาที่ไม่มี name parameter แล้วยิ่งบาปมากเลย สำคัญคือ method ไม่ควรครอบจักรวาล และมันควรบอก intention ของสิ่งที่มันพยายามแก้ปัญหา แต่แยกออกแล้วกลายเป็น 14 class นี่ก็เป็น bad smell เหมือนกันนะ เหมือนจะ reuse อะไรกันแทบไม่ได้ เป็นความสัมพันธ์แบบ 1:1 อยู่ดี สรุปผมเชื่อว่ายังมีอะไรไม่ถูกไม่ควรอยู่ทั้งคู่ อาจจะเพราะเลือก design pattern ผิด
เรื่องโค้ดสั้นโค้ดยาวก็เห็นด้วยครับ ว่า line of code น้อยกว่าก็ maintain ง่ายกว่า แต่ทั้งนี้ทั้งนั้นมันต้องอยู่บนพื้นฐานที่ว่า มันสามารถเขียน test case ได้ง่ายด้วยนะ บางทียุบโค้ดไปแล้วทำให้ test ไม่ได้ หรือลำบาก ก็แยกเสียดีกว่าแหละครับ ถ้าแยกออกมาแล้ว maintain ง่ายกว่า readability สูงกว่า สื่อ intention ของ domain bussiness มากกว่า ผมไม่เกรงใจจะแยกเหมือนกันครับ ลองดูตัวอย่าง โค้ด ใน Seam Hangman http://www.seam66.com/blog/?p=118 ของผมก็น่าจะเป็นตัวอย่างที่ดีครับ ทั้งๆ ที่จะยุบ method บางตัวออกก็ได้แต่ไม่ทำ เพื่อเพิ่ม intension ของ domain ที่พยายามแก้ปัญหา
เรื่อง low coupling + high cohesion ผมว่าเรื่อง low coupling เนี้ยะ โปรแกรมเมอร์มือใหม่มองคิดได้ง่ายกว่า high cohesion นะ ผมเชื่อว่าเรื่อง high cohesion จะทำได้ไม่เต็มที่เลยถ้าไม่ได้ code ด้วยแนวคิด TDD, BDD ผสมความคิดแบบ DDD เข้าไป refactoring เล่นบทบาทสำคัญมากในจุดนี้ ก็คงต้องฝึกๆ กันไป ผมก็ฝึกของผมอยู่ทุกวันเหมือนกัน ภูมิใจทุกครั้งที่เห็นโค้ดตัวเองสวยขึ้น สั้นลง อ่านง่าย test ได้ เรื่องพวกนี้หาสอนกันยากเหมือนกันครับว่าไป น่าเป็นห่วงสำหรับ developer มือใหม่ที่กำลังเคว้ง อาการ "เห็นแล้ว ได้กลิ่นแล้ว ว่ามี bad smell" แต่ไม่รู้จะแก้ยังไง ผมก็เคยอยู่ในจุดนั้น อาศัยความอยากพัฒนาตัวเองล้วนๆ ดันตัวเองขึ้นมา |
bow_der_kleine
coffee planet : ถือว่าเป็นคำถามที่ยากพอสมควรเลยครับ หากมองอย่างผม modernism น่าจะเป็นยุคที่ Object Oriented Programming กำลังเข้ามา เราพยายามมองทุกอย่างให้เป็นสากล พยายามแก้ปัญหาทุกอย่างด้วย paradigma เดียว และพยายาม generalization ปัญหา (คนละประเด็นกับการ generalization โค้ด) และมองทุกปัญหาให้อยู่ในรูปของวัตถุ (object) ปัญหาที่เกิดขึ้นก็คงเหมือนกับ modernism อื่น ๆ เมื่อมีการ generalization มันจะขาดความละเอียดในการแก้ปัญหา หรือแก้ได้แบบละเอียดแต่ลุ่มล่าม ตอนนี้เลยมีโปรแกรมเมอร์บางกลุ่ม (รวมถึงผมด้วย) เริ่มหันมาสนใจการเขียนโปรแกรมแบบ multi paradigma และ minimalist คือเอาแนวทางในการแก้ปัญหาหลาย ๆ แบบมาใช้ โดยเน้นในเรื่องของการใช้ทรัพยากรให้น้อยที่สุด แก้ปัญหาให้ตรงจุดที่สุด ซึ่งก็คือการทำให้โค้ดสั้นนั่นเอง แต่พวก minimalist อย่างผมอาจจะผิดก็ได้ ไม่มีใครรู้ deans4j : เรื่อง 14 parameters vs 14 methods ผมก็ประเมินมากไม่ได้ครับ เพราะไม่ได้เห็นโค้ด แต่หากให้ผมแก้สถานการณ์แบบคร่าว ๆ ผมอาจจะแก้ปัญหาด้วย default parameter ซึ่งก็ลดปัญหามาได้ระดับนึง แต่ไม่ทั้งหมด อีกอย่างบางภาษาไม่มี default parameter ให้ใช้ด้วยสิ อีกวิธีอาจต้องใช้ container object ที่เอาไว้บรรจุ parameter โดยเฉพาะ และหากมี case ให้แยก ผมคิดว่าหากทั้ง 14 เคสมันทำงานคล้าย ๆ กัน เราอาจแยกแล้วยุบรวม method สุดท้ายหากเหลือสัก 3-4 method ผมว่ากำลังดี แต่ผมก็ได้แต่คาดการณ์ครับ สถานการณ์จริงอาจทำอย่างนั้นไม่ได้ และเมื่อมีคนออกแบบมาแล้ว ก็ต้องทำตามเขา |
coffee planet
| minimalist มันมีต้นขั้วมาจาก less is moreในสมัยmodernismอยู่ดีไหมครับ ผมมองว่าminimalistก็คือผู้สีบทอดเชื้อสายจากmodernครับ ในสายงานที่ผมประสบพบเห็นมา เคยไปฟังlecture เกี่ยวกับแก่นแท้ของmodernism ซึ่งคนเยอรมันมาlectureที่ไทย ผมฟังแล้วรู้สึกว่าแก่นมันชักเหมือนกับpost modern & contemporary คือเข้าไปเจาะให้ถึงแก่น หรือจัดแก่นใหม่ให้ได้ หลังจากนั้นgenerateอย่างไรก็เร่องของคุณ สรุปก็คือ ทุกmethodology มันก็มีข้อดี และสุดท้ายมันจะหลอมเข้าหากันในที่สุด แต่การหาโครงสร้างพันธะของแก่นในรูปแบบใหม่ คือเรื่องสำคัญกว่า developing methodology??? ถ้าผมพูดจาเลอะเทอะก็ขอโทษไว้นะตรงนี้นะครับ แหะๆ |
9neo
ผมชอบแบบสั้นๆ ถ้าจะบอกว่า บางทีเขียนแบบสั้นๆ ก็ไม่ได้หมายความว่ามันจะทำงานได้เร็วขึ้น สุดท้ายแล้ว จะยาวหรือสั้น ถ้าเป็นเทพไม่มีปัญหาอยุ่แล้วมองหรือแกะโค๊ดแปปเดียวก็เก็ต
|
ไอเดียของบล็อกนี้มีที่มามาจาก 

Thaina
อยากบอกอย่างนึงว่า อ่านคำศัพท์แต่ละคำได้แปลกมากเลยครับ หรือว่าที่เยอรมันอ่านกันแบบนั้น??
Method ปกติผมจะเรียก เมธอด Attribute ผมจะเรียก แอททริบิวท์
16 Aug 09