18 September 2013

ว่าด้วยเรื่อง Function จะมีใครบ้างนะที่จะเข้าใจมัน

Updated on

        บทความรอบนี้เจ้าของบล็อกว่า มากลับสู่พื้นฐานกันบ้างดีกว่า เพราะเจ้าของบล็อกเริ่มเจอมาเยอะแล้วกับผู้ที่หลงเข้ามาอ่านที่พยายามจะเขียนแอปพลิเคชันแอนดรอยด์ แต่ไม่ศึกษาพื้นฐานมาถึงก็กะจะเขียนให้มันเสร็จๆไปเลย หาตัวอย่างมาแก้ๆแล้วส่งๆ แต่พอถึงต้องเขียนเองจริงๆ (ไม่มีตัวอย่างให้ดู) ก็ไปไม่รอด พอศึกษาเองก็ดันไม่เข้าใจเสียแล้ว เพราะไม่ได้เริ่มอย่างถูกต้อง

        โดยเจ้าของบล็อกจะขอเริ่มที่เรื่องฟังก์ชัน (Function) ก่อนนี่แหละ เพราะเป็นอะไรที่ผู้ที่หลงเข้ามาอ่านหลายๆคนยังใช้ไม่เป็นก็มี

ฟังก์ชันนั้นคืออะไร?

       สมมติว่าเจ้าของบล็อกเขียนโปรแกรมมาชุดนึงที่มีหลายบรรทัดแล้วทีนี้เจ้าของบล็อกต้องการใช้คำสั่งชุดนั้นบ่อยๆ ซัก 10 รอบ นึกภาพว่า ถ้าชุดคำสั่งที่ว่านั้นมีจำนวน 5 บรรทัดด้วยกัน ถ้าทำงานเหมือนกัน 10 รอบ ก็จะใช้บรรทัดไปถึง 50 บรรทัด ซึ่งมันจะยาวมาก และถ้าโปรแกรมยิ่งเยอะ เวลาที่จัดการกับโค๊ด พอมาดูโค๊ดที่มีจำนวนบรรทัดเยอะมากแล้วมันก็จะงงได้ง่าย



        แต่ทีนี้ถ้ารวบโค๊ดชุดนั้นไว้ที่ใดที่นึงล่ะ? เวลาเรียกใช้ก็พิมคำสั่งสั้นๆก็จะช่วยรวบโค๊ดให้ดูกระชับขึ้นเวลาไล่ดูโค๊ดทีหลังก็จะงงน้อยลง

        จะเห็นว่าเจ้าของบล็อกรวมคำสั่งไว้ในฟังก์ชัน myFunction แล้วเวลาเรียกใช้ก็เรียกที่ชื่อฟังก์ชันไปเลย ก็จะสั้นลงเยอะเลย

        ทีนี้มาดูรูปแบบของฟังก์ชันกันต่อเลย เจ้าของบล็อกขอยกตัวอย่างฟังก์ชันในรูปแบบที่ง่ายสุดก่อน คือไม่มีการกำหนด Parameter ใดๆ และไม่มีการ Return ค่าใดๆ

* สมมติว่าประกาศตัวแปร a b c และ d ไว้ข้างนอกอยู่แล้ว

        ถ้าดูกันง่ายๆจะเห็นว่าฟังก์ชันนี้ชื่อว่า clearData เห็นตรง void มั้ย? เจ้าของบล็อกเชื่อว่าเห็นกันประจำ แต่ผู้ที่หลงเข้ามาอ่านหลายคนไม่รู้ว่ามันคืออะไร ถ้าแปลตรงตัวมันก็คือ "ว่างเปล่า" ว่างเปล่าที่ว่านี้ คือไม่มีการ Return ค่าใดๆ กลับมาจากฟังก์ชันนี้ ก็คือฟังก์ชันนี้สั่งให้ทำงานเสร็จก็จบ ไม่มีค่าส่งกลับมา ส่วนคำสั่งสีฟ้าก็คือโค๊ดที่จะให้ทำงานในฟังก์ชันนี้

        ตัวอย่างดังกล่าวก็เอาไว้ประมาณว่าเคลียร์ค่าในตัวแปรทั้ง 4 เวลาทำคำสั่งหรือคำนวณค่าอะไรเสร็จแล้วเริ่มใหม่อีกรอบ ก็ต้องเคลียร์ค่าให้อยู่ในค่าเริ่มต้นใหม่อีกครั้งก่อนนั่นเอง เวลาเรียกใช้ก็แค่พิมว่า clearData();


        ทีนี้ขอเพิ่มมาเป็นฟังก์ชันที่มีการกำหนด Parameter บ้าง ก็คือสามารถกำหนดค่าเข้าไปในฟังก์ชันนั้นได้ โดยจะกำหนด Parameter กี่ตัวก็ได้

        ในวงเล็บที่ต่อท้ายชื่อฟังก์ชันก็มีเอาไว้กำหนด Parameter ที่จะให้ใส่ โดยจะต้องบอกด้วยว่าเป็นตัวแปรแบบไหน และตัวแปรจะให้ชื่อว่าอะไร ในตัวอย่างก็คือฟังก์ชัน setAllData จะมีการกำหนด Parameter ด้วย เป็นค่า Integer โดยจะนำค่าที่กำหนดมาเก็บเป็นตัวแปรชื่อ data เวลาเรียกใช้งานในฟังก์ชันนี้ก็เรียกจากตัวแปร data ได้เลย


        เจ้าของบล็อกยกตัวอย่างการเรียกใช้งานไว้ให้สองแบบคือแบบกำหนดค่าลงไปโดยตรงกับกำหนดค่าด้วยตัวแปร เพราะผู้ที่หลงเข้ามาอ่านมือใหม่หลายคนดันไปเข้าใจว่าต้องกำหนดเป็นค่าลงไปโดยตรงเท่านั้น ทั้งๆที่การเก็บค่าไว้ในตัวแปร แล้วเอาตัวแปรมากำหนดลงไปก็ไม่ต่างกัน มันก็แค่เป็นทางอ้อม


        ทีนี้ถ้าเป็น Parameter ที่มากกว่า 1 ตัวล่ะ?


        ถึงตรงจุดนี้แล้วขอบอกไว้ก่อนเลยว่า Parameter ไม่จำเป็นต้องกำหนดเป็น Variable หรือตัวแปรเท่านั้น แต่ยังรวมไปถึง Object หรือวัตถุก็ได้เช่นกัน ขึ้นอยู่กับจุดประสงค์ของการสร้างฟังก์ชันนั้นๆ ในตัวอย่างก็คือ เจ้าของบล็อกสร้างฟังก์ชันเอาไว้กำหนดข้อความและขนาดตัวอักษรของ Text View


        เวลาเอาไปใช้งานก็ต้องกำหนด Parameter ให้ถูกประเภทด้วยเช่นกัน

        ทีนี้มาลองดูแบบมีการ Return ค่ากลับมาด้วยบ้างดีกว่า


        ให้ดูที่คำว่า float เดิมทีที่ยกตัวอย่างที่ผ่านมาจะเป็น void เนื่องจากไม่ได้มีการ Return ค่าอะไรกลับไป แต่ในคราวนี้เมื่อต้องการ Return ค่าอะไรกลับไปจะต้องกำหนดด้วยว่าเป็นตัวแปรแบบไหน ให้ดูที่ Parameter ก่อน จะเห็นว่ากำหนดเป็น float เข้ามา แล้วนำค่าไปคำนวณแล้วเก็บไว้ในตัวแปรเดิม แล้ว Return ออกมาเป็นผลลัพธ์ของฟังก์ชันนั่นเอง


        ให้สังเกตในตัวอย่างข้างบนนี้ จะเห็นว่า number เริ่มต้นมีค่า 10.52 เมื่อนำไปเข้าในฟังก์ชัน doubleValue (กำหนด number เป็น Parameter) ก็จะทำการคูณค่าของตัวแปร value ด้วย 2 (value ถูกกำหนดให้เท่ากับ number) number เดิมมีค่าเป็น 10.52 เมื่อเข้ามาในฟังก์ชัน value ก็จะมีค่าเป็น 10.52 ตาม เมื่อทำการคูณด้วย 2 ก็จะได้เป็น 21.04 จากนั้นก็ Return ผลลัพธ์ที่ได้กลับไป ทีนี้จะเห็นว่าตรงบรรทัดที่เรียกใช้ฟังก์ชันนี้มีการกำหนดค่าให้กับ number ด้วย ก็เพื่อให้ number มีค่าเท่ากับผลลัพธ์ที่ได้จากฟังก์ชันนี้นั่นเอง ดังนั้น number สุดท้ายแล้วก็จะมีค่า 21.04 โดยมีความสัมพันธ์ดังนี้


        พอเห็นลูกศรชี้ทิศทางแล้วน่าจะดูง่ายมากขึ้น โดยลูกศรชี้ลงก็คือ การกำหนด Parameter ให้กับ float value ด้วย number และลูกศรชี้ขึ้นก็คือการ Return ค่าที่ได้กลับมาเก็บไว้ใน number อีกที


        Parameter และตัวแปรที่รับค่า Return ไม่จำเป็นต้องเป็นตัวเดียวกัน จะเป็นตัวแปรจากไหนก็ได้ สร้างตอนนั้นเลยก็ได้ ขอแค่ตัวแปรนั้น เป็นประเภทเดียวกับที่กำหนดไว้ใน Return ของฟังก์ชันก็เพียงพอแล้ว

        Parameter ก็สามารถมีหลายตัวได้ดังเดิม และ Return ก็ไม่จำเป็นต้องเหมือนกับ Parameter ขึ้นอยู่กับว่าสร้างฟังก์ชันนั้นขึ้นมาเพื่ออะไรมากกว่า


        ในตัวอย่างข้างบนนี้ก็เป็นการสร้างฟังก์ชันเทียบตัวแปร Integer ว่ามีค่าเท่ากันหรือป่าว ถ้าเท่ากันก็จะ Return ออกมาเป็น TRUE แต่ถ้าทั้งสองไม่เท่ากันก็จะ Return ออกมาเป็น FALSE ซึ่งจะเห็นว่า Return สามารถ Return แยกตามเงื่อนไขได้

        ในการ Return นั้นหมายถึงฟังก์ชันนั้นจบการทำงานทันทีด้วยเช่นกัน ก็คือคำสั่งต่อท้ายจากการ Return ไม่มีผลทันที (โปรแกรมแจ้งเออเรอให้เลย)


        ทั้งนี้การเขียนฟังก์ชันจะขึ้นอยู่ผู้เขียนเป็นหลัก เขียนขึ้นมาทำไม เขียนมาเพื่อใช้ทำงานอะไร ซึ่งสิ่งเหล่านี้ไม่มีกำหนดตายตัวหรอก ส่วนมากก็มีไว้เพื่ออำนวยความสะดวกและเพื่อจัดการโค๊ดได้ง่ายขึ้นน่ะแหละ