Web サービスと同期する必要がある一連のアプリがあります。
- Web サービスから XML をダウンロードします。
- その XML を解析します。
- 次に、解析された XML と一致するようにデータベースを更新します。
重複を避けるために、できるだけ多くの関連コードを共通ライブラリに保持したいと考えています。また、さまざまなアプリがすべて、コードの解析と更新をかなり単純な共通フレームワークにスロットインしたいと考えています。
したがって、一般的な sync() メソッドがあります。
public void sync(URI updateUrl, XMLParser parser, Updater animalUpdater) {
String raw = getXML();
List<ParsedAnimal> parsed = parser.parse(raw);
// try:
// begin transaction
for (ParsedAnimal pi : parsed) {
animalUpdater.updateItem(pi);
}
// commit transaction
// catch: rollback transaction, rethrow
// finally: close database connection
}
パーサーは、ParsedCat、ParsedDog、またはその他のいずれかを返します。これらはすべて、共通の ParsedAnimal クラスから継承されます。
public abstract class ParsedAnimal {...}
public class ParsedCat extends ParsedAnimal {...}
public class ParsedDog extends ParsedAnimal {...}
次に、解析されたアイテムを取得し、コンテンツをデータベースに挿入する必要があるアップデーターがあります。
public abstract class Updater {
public abstract void updateItem(ParsedAnimal parsed);
}
public class CatUpdater extends Updater {
@Override
public void updateItem(ParsedCat parsed) {}
}
public class DogUpdater extends Updater {...}
これは機能しません — Updater のコントラクトは updateItem() が ParsedAnimal を受け入れることを指定しており、CatUpdater と DogUpdater はどちらも特定の種類の動物のみを受け入れることでそのコントラクトを破っています。
私が持っているのは並列クラス階層です — ParsedX は XUpdater と 1 対 1 で一致します。Coding HorrorのCode Smellsのページでは、2 つのクラス階層を 1 つの階層に統合することを提案していますが、「作業中のもの」と「作業中のもの」は十分に異なるため、別のクラスにする必要があるように感じます。
これを構造化するきちんとした方法、または便利な設計パターンはありますか?