2

Webページをスキャンして特定の情報を探し、それらからオブジェクトを作成するスクレーパーがあります。プロパティの1つは、後で新しいオブジェクトの残りのプロパティを照会するために使用されるIDです。

このオブジェクトを構築する責任はいくつかのクラス(スクレーパークラスとプロパティの1つを使用してクエリを実行するクラス)に分かれているため、 Builderを渡すことは避けたいと思います(また、アクセサーを使用したBuilderパターンは自分)。

同時に、ビルド中のオブジェクトでnull参照を避けたいと思います。

GuavaのOptionalは、構築のすべてのステップが完了した後、オブジェクトのプロパティが確実にnullにならないため、適切ではないようです。

次のように、個別のクラスを作成できます。

class ScrapeablePersonImportPart {

    String surname;
    Year yearOfBirth;
    String externalId;

    // ... getters, constructor ...

}

class PersonImport extends ScrapeablePersonImportPart {

    SocialSecurityNumber ssn;
    Color favoriteColor;

    // ... getters, constructor ...

    PersonImport( ScrapeablePersonImportPart part, SocialSecurityNumber ssn, Color favoriteColor ) {
        this.surname = part.getSurname();
        this.yearOfBirth = part.getYearOfBirth();
        this.externalId = part.getExternalId();
        this.ssn = ssn;
        this.favoriteColor = favoriteColor;
    }

}

または、サブクラス化を避けて、代わりに構成を使用することもできます。

プログラムが進化するにつれて、構築はさらに多くのステップで構成される可能性が非常に高くなります。

いくつかの別々のクラスを持つソリューションは合理的に見えますか?

4

1 に答える 1

1

代わりにコンポジションを使用します。これは、を渡すのでScrapeablePersonImportPart、継承するのではなく、コンポジションに委任することができるためです。渡される新しいものがあるかもしれないのでXYZPart、とにかく両方から継承することはできないので、委任することは理にかなっています。

これらがデータの動的フィールドを保持するための単なるダミーオブジェクトである場合、私はを使用したくなるでしょうHashMap

于 2012-08-23T19:46:38.893 に答える