การรับ parameter ของ method

[ ถ้าเป็นภาษาโปรแกรมอื่นคงเรียกว่า ฟังก์ชัน]

ผมคิดว่า เราๆ ท่านๆ ต้องเคยเขียนเมธอดกันแน่นอน
เช่น

public class Test{
     public static void add(int x, int y){
          System.out.println( x + " + " + y + " = " + (x+y) );
     }
}

อืมมมมมมมมมม

มันก็ธรรมดานิ
มันมีเรื่องอะไรถึงกับต้องมาเขียนบทความหว่า

คืออย่างนี้
สมมุตินะครับ ผมต้องการสร้างคลาส Student
และมี Constructor ที่รับ parameter อยู่ซัก 6 ตัว

public class Student{
     //... variables
     public Student(String firstname, String lastname, int age, String address, String email, String telephone){
          //... set variables value
     }
}

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

หรือถ้าตัวอย่างนี้ยังไม่ชัด เพราะมันสามารถ “แถ” ได้
ประมาณว่า ก็ new ธรรมดาแล้วเรียกเมธอด set ก็ได้นิ

อ่ะ งั้นยกตัวอย่าง เรากำลังพยายามไปเรียกเมธอดชาวบ้าน
ที่รับตัวแปร ประมาณ สิบ ค่า
เป็นผมก็คงเมื่อยอ่ะ
เกิดส่งลำดับค่าผิดไป แต่ type เดียวกัน compiler มันก็ไม่ได้แจ้งซะด้วย

ถ้าถามว่า ถ้าให้ผมแก้ จะแก้ยังไง
เช่นถ้าจะเรียกเมธอดนี้

public void createCustomer(
String titleTH, String titleEN,String firstnameTH,String lastnameTH,String firstnameEN,String lastnameEN,String address,String district,String province,String zipcode,String mobilePhone,String officePhone,String fax){
     // bla bla bla
}

ก็จะเริ่มออกอาการมึน มากขึ้นหล่ะซิ
ทำไงดีหว่า ถึงไม่มึนๆ

ทางออกของผมก็คือ
จัดกลุ่มตัวแปร แล้วก็แตกเป็นคลาสซิครับ
ก็จัดได้ประมาณสามกลุ่มคือ

  • ชื่อ
  • ที่อยู่
  • เบอร์ติดต่อ

แล้วก็มาเขียนเป็นคลาส ได้หน้าตาดังนี้

class Person{
	FullName engName;
	FullName thName;
	Address address;
	TelNo fax;
	TelNo mobile;
	//TelNo สารพัด Tel

}

class FullName{
	String title;
	String firstname;
	String middlename;//เผื่อไว้
	String lastname;
}

class TelNo{
	String countryCode;
	String areaCode;
	String localNumber;
}

class Address{
	String address;
	String district;
	String province;
	String zipcode;
}

เพราะฉะนั้นก็จะสบายตาขึ้นอีกนิดหนึ่งดังนี้

public void createCustomer(Person person){
	//bla bla bla
}

ลอง งม เขียนวิธีสร้าง parameter เพื่อเรียกเมธอดนี้ดูนะ
เหมือนมันจะเรียกใช้ยากขึ้นกว่าเดิมอีกป่าวหว่ะ
= =a น่าคิด

ผมว่าแบบนี้มีข้อดีอย่างหนึ่งคือ


เราสามารถแก้ไข เพิ่มลบ parameter ได้ โดยไม่กระทบต่อการประกาศเมธอด
เพราะเราก็ไปปรับเพิ่มลบได้ ในคลาสที่ถูกแยกออกมาแล้ว
ดังนั้นเราก็ไม่ได้ไปแก้ไขการประกาศเมธอด

ที่เห็นคนอื่นแก้ไขเหตุการณ์เดียวกันนี้ก็จะมี

  • ใช้ตัวแปรประเภท List ทั้งหลาย (List, ArrayList, Vector)
  • ใช้ HashMap

ซึ่งข้อเสียของ List ก็คงเป็น ไม่ทราบแน่นอนว่า ตำแหน่งต่างๆ เก็บ parameter อะไรบ้าง
ยกเว้นสร้างเมธอดเอง เรียกเอง แบบนั้นหน่ะ น่าจะได้
แต่ถ้าคนอื่นมาเขียนต่อ บรรลัย บังเกิด

และข้อเสียของ HashMap ก็คือ
ไม่รู้ว่าส่งตัวแปรอะไรมาให้
และก็ต้องรู้ว่า Key คืออะไร ตัวใหญ่เล็กของ Key ก็มีผลด้วย
และเมื่อ Get ค่าออกมาจาก HashMap แล้วจะต้อง convert เป็น Type อะไร

ผมก็เลยว่า วิธีที่ทำให้ดูนี้ก็ work นะ

4 thoughts on “การรับ parameter ของ method

    1. มันก็คงแล้วแต่เคสหล่ะมั๊ง
      และก็บวกกับประสบการณ์ของแต่ละคนด้วย

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s