長いパラメーターリストが表示されたときの最初の質問は、この関数またはオブジェクトが実行しすぎているかどうかです。検討してください:
EverythingInTheWorld earth=new EverythingInTheWorld(firstCustomerId,
lastCustomerId,
orderNumber, productCode, lastFileUpdateDate,
employeeOfTheMonthWinnerForLastMarch,
yearMyHometownWasIncorporated, greatGrandmothersBloodType,
planetName, planetSize, percentWater, ... etc ...);
もちろん、この例はわざとばかげていますが、実際のプログラムの多くは、ほんの少しばかげているだけの例で見ました。1つのクラスを使用して、ほとんど関係のない、または関係のない多くのものを保持しています。プログラマーはたまたま両方を同時に考えました。時々簡単な解決策は、クラスを複数の部分に分割することです。それぞれが独自のことを行います。
やや複雑なのは、クラスが実際に顧客の注文と顧客に関する一般的な情報の両方など、複数の論理的なものを処理する必要がある場合です。このような場合は、お客様用のクラスと注文用のクラスを作成し、必要に応じて会話させてください。だから代わりに:
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);
心配になります。呼び出しを見て、これらすべての不可解な数字、コード、およびフラグが何を意味するのかは、まったく明確ではありません。これはエラーを要求するだけです。プログラマーはパラメーターの順序について混乱し、誤って2つを切り替えてしまう可能性があり、それらが同じデータ型であれば、コンパイラーはそれを受け入れるだけです。私はむしろこれらすべてが列挙型であるシグネチャを持っているので、呼び出しは「A」の代わりにType.ACTIVEや「false」の代わりにCreditWatch.NOなどのように渡されます。