เมื่อฉันเห็นรายการพารามิเตอร์แบบยาวคำถามแรกของฉันคือฟังก์ชั่นหรือวัตถุนี้ทำงานมากเกินไปหรือไม่ พิจารณา:
EverythingInTheWorld earth=new EverythingInTheWorld(firstCustomerId,
lastCustomerId,
orderNumber, productCode, lastFileUpdateDate,
employeeOfTheMonthWinnerForLastMarch,
yearMyHometownWasIncorporated, greatGrandmothersBloodType,
planetName, planetSize, percentWater, ... etc ...);
แน่นอนว่าตัวอย่างนี้เป็นเรื่องที่ไร้สาระโดยเจตนา แต่ฉันเคยเห็นโปรแกรมจริงมากมายที่มีตัวอย่างเพียงเล็กน้อยที่ไร้สาระโดยที่คลาสหนึ่งใช้เพื่อเก็บสิ่งที่แทบจะไม่เกี่ยวข้องหรือไม่เกี่ยวข้องกันเห็นได้ชัดเพียงเพราะโปรแกรมการโทรเดียวกันต้องการทั้งสองอย่างหรือ โปรแกรมเมอร์เกิดขึ้นเพื่อคิดถึงทั้งสองอย่างในเวลาเดียวกัน บางครั้งวิธีแก้ปัญหาง่ายๆก็คือการแบ่งชั้นเรียนออกเป็นหลาย ๆ ชิ้นซึ่งแต่ละชิ้นจะทำในสิ่งของตัวเอง
ความซับซ้อนกว่าเล็กน้อยก็คือเมื่อชั้นเรียนจำเป็นต้องจัดการกับสิ่งที่มีเหตุผลหลายอย่างเช่นคำสั่งซื้อของลูกค้าและข้อมูลทั่วไปเกี่ยวกับลูกค้า ในกรณีเหล่านี้ให้จัดชั้นเรียนสำหรับลูกค้าและชั้นเรียนสำหรับคำสั่งซื้อและปล่อยให้พวกเขาพูดคุยกันตามความจำเป็น แทนที่จะเป็น:
Order order=new Order(customerName, customerAddress, customerCity,
customerState, customerZip,
orderNumber, orderType, orderDate, deliveryDate);
เราสามารถมี:
Customer customer=new Customer(customerName, customerAddress,
customerCity, customerState, customerZip);
Order order=new Order(customer, orderNumber, orderType, orderDate, deliveryDate);
แม้ว่าฉันจะชอบฟังก์ชั่นที่ใช้พารามิเตอร์เพียง 1 หรือ 2 หรือ 3 แต่บางครั้งเราก็ต้องยอมรับว่าตามความเป็นจริงฟังก์ชันนี้มีจำนวนมากและจำนวนของตัวเองไม่ได้สร้างความซับซ้อนอย่างแท้จริง ตัวอย่างเช่น:
Employee employee=new Employee(employeeId, firstName, lastName,
socialSecurityNumber,
address, city, state, zip);
ใช่มันเป็นช่องต่างๆมากมาย แต่สิ่งที่เรากำลังจะทำก็คือบันทึกลงในบันทึกฐานข้อมูลหรือโยนลงบนหน้าจอหรือบางส่วน ที่นี่มีการประมวลผลไม่มากนัก
เมื่อรายการพารามิเตอร์ของฉันยาวฉันชอบมากถ้าฉันสามารถให้ฟิลด์ประเภทข้อมูลต่างๆ เช่นเดียวกับเมื่อฉันเห็นฟังก์ชันเช่น:
void updateCustomer(String type, String status,
int lastOrderNumber, int pastDue, int deliveryCode, int birthYear,
int addressCode,
boolean newCustomer, boolean taxExempt, boolean creditWatch,
boolean foo, boolean bar);
แล้วฉันเห็นมันถูกเรียกด้วย:
updateCustomer("A", "M", 42, 3, 1492, 1969, -7, true, false, false, true, false);
ฉันกังวล เมื่อมองไปที่การโทรยังไม่ชัดเจนว่าตัวเลขรหัสและธงที่เป็นความลับเหล่านี้หมายถึงอะไร นี่เป็นเพียงการขอข้อผิดพลาด โปรแกรมเมอร์อาจสับสนได้ง่ายเกี่ยวกับลำดับของพารามิเตอร์และสลับไปมาสองตัวโดยไม่ได้ตั้งใจและหากเป็นประเภทข้อมูลเดียวกันคอมไพเลอร์ก็ยอมรับ ฉันอยากจะมีลายเซ็นที่ทุกสิ่งเหล่านี้เป็น enums ดังนั้นการโทรจะส่งผ่านในสิ่งต่างๆเช่น Type.ACTIVE แทนที่จะเป็น "A" และ CreditWatch.NO แทนที่จะเป็น "false" เป็นต้น