顧客の支払いの処理に使用するクラスがあります。このクラスの1つを除くすべてのメソッドは、すべての顧客で同じです。ただし、顧客のユーザーが負う金額を(たとえば)計算するものを除きます。これは顧客ごとに大きく異なる可能性があり、カスタムファクタはいくつも存在する可能性があるため、計算のロジックをプロパティファイルのようなものにキャプチャする簡単な方法はありません。
customerIDに基づいて切り替えるいコードを書くことができます。
switch(customerID) {
case 101:
.. do calculations for customer 101
case 102:
.. do calculations for customer 102
case 103:
.. do calculations for customer 103
etc
}
ただし、新しい顧客を獲得するたびにクラスを再構築する必要があります。より良い方法は何ですか?
[編集]「複製」の記事はまったく異なります。私はswitchステートメントを回避する方法を求めているのではなく、このケースに最も適したモダンなデザインを求めています-恐竜のコードを書きたい場合はswitchステートメントで解決できます。そこで提供されている例は一般的なものであり、本質的には「スイッチはある場合には非常にうまく機能し、他の場合には機能しない」と言っているため、役に立たない。
[編集]次の理由から、トップランクの回答(標準インターフェイスを実装する顧客ごとに個別の「顧客」クラスを作成する)を採用することにしました。
一貫性:他の開発者によって作成された場合でも、すべてのCustomerクラスが同じ出力を受け取って返すことを保証するインターフェイスを作成できます。
保守性:すべてのコードは同じ言語(Java)で記述されているため、デッドシンプルな機能を維持するために他の誰かが別のコーディング言語を学ぶ必要はありません。
再利用:コードで同様の問題が発生した場合、Customerクラスを再利用して、任意の数のメソッドを保持して「カスタム」ロジックを実装できます。
親しみやすさ:私はすでにこれを行う方法を知っているので、すぐにそれを完了させ、他のより差し迫った問題に進むことができます。
欠点:
新しい顧客ごとに、新しいCustomerクラスのコンパイルが必要です。これにより、変更をコンパイルおよびデプロイする方法が複雑になる場合があります。
新しい顧客はそれぞれ、開発者が追加する必要があります。サポート担当者は、プロパティファイルのようなものにロジックを追加することはできません。これは理想的ではありません...しかし、サポート担当者が必要なビジネスロジックをどのように書き出すことができるのか、特に多くの例外を伴う複雑な場合(そうである可能性が高い場合)もわかりませんでした。
多くの新しい顧客を追加した場合、うまく拡張できません。これは予期されていませんが、もしそうなった場合、コードの他の多くの部分とこの部分を再考する必要があります。
興味のある方は、Java Reflectionを使用して名前でクラスを呼び出すことができます。
Payment payment = getPaymentFromSomewhere();
try {
String nameOfCustomClass = propertiesFile.get("customClassName");
Class<?> cpp = Class.forName(nameOfCustomClass);
CustomPaymentProcess pp = (CustomPaymentProcess) cpp.newInstance();
payment = pp.processPayment(payment);
} catch (Exception e) {
//handle the various exceptions
}
doSomethingElseWithThePayment(payment);