1

私は、このコードをより洗練された効率的なコーディング方法に変換しようとしていました。

final ContentSlotForPageModel rel = modelService.create(ContentSlotForPageModel.class);
rel.setUid("rel_1");
rel.setPosition("no");
rel.setCatalogVersion(catalogVersionModel);
rel.setPage(firstContentPage);
rel.setContentSlot(slot);
modelService.save(rel);

final ContentSlotForTemplateModel relTemplate = modelService.create(ContentSlotForTemplateModel.class);
relTemplate.setUid("relTemplate_1");
relTemplate.setPosition("no");
relTemplate.setCatalogVersion(catalogVersionModel);
relTemplate.setPageTemplate(template);
relTemplate.setContentSlot(slot);
modelService.save(rel);

ContentSlotForPageModelContentSlotForTemplateModelは のサブタイプですCMSRelationModel。そこで、次のようなスーパータイプを使用してこれらの属性を設定するメソッドを作成しようとしました。

private void setRelationModel(final CMSRelationModel rel, final ContentSlotModel slot, final String id)
{
    rel.setUid(id);
    rel.setCatalogVersion(catalogVersionModel);

    if (rel instanceof ContentSlotForPageModel)
    {
        ((ContentSlotForPageModel) rel).setPage(firstContentPage);
        ((ContentSlotForPageModel) rel).setContentSlot(slot);
        ((ContentSlotForPageModel) rel).setPosition("no");
    }
    else if (rel instanceof ContentSlotForTemplateModel)
    {
        ((ContentSlotForTemplateModel) rel).setPageTemplate(template);
        ((ContentSlotForTemplateModel) rel).setContentSlot(slot);
        ((ContentSlotForTemplateModel) rel).setPosition("no");
    }

    modelService.save(rel);

}

ただし、多くのメソッドは CMSRelationModel で定義されていないため、正しい呼び出しを行うには検証を作成する必要があります。スーパークラスでこのメソッドを定義することはできません。これをもっとうまく書く方法はありますか?

ありがとうございました

4

3 に答える 3

1

以下をせよ。
No instanceof、厳密に型指定された、重複コードの最小化。

private void setRelationModel(ContentSlotForPageModel rel, ContentSlotModel slot, String id) {
    rel.setPage(firstContentPage);
    rel.setContentSlot(slot);
    rel.setPosition("no");
    setCMSRelationModel(rel);
}

private void setRelationModel(ContentSlotForTemplateModel rel, ContentSlotModel slot, String id) {
    rel.setPageTemplate(template);
    rel.setContentSlot(slot);
    rel.setPosition("no");
    setCMSRelationModel(rel);
}

private void setCMSRelationModel(CMSRelationModel rel, String id) {
    rel.setUid(id);
    rel.setCatalogVersion(catalogVersionModel);
    modelService.save(rel);
}

finalまた、「コードノイズ」を減らすためにパラメーターから削除しました。

于 2012-04-20T11:04:50.547 に答える
0

これを試していただけませんか。

まず、から継承されたフィールドにデータを入力し、次に、演算子CMSRelationModelの使用など、子クラスに基づいてフィールドにデータを入力します。instanceof

これがサンプルです

private void setRelationModel(final CMSRelationModel rel, final ContentSlotModel slot, final String id)
{
    rel.setUid(id);
    rel.setCatalogVersion(catalogVersionModel);
    rel.setContentSlot(slot); // assume this is inherited method from CMSRelationModel
    rel.setPosition("no"); // assume this is inherited method from CMSRelationModel

    if (rel instanceof ContentSlotForPageModel)
    {
        ((ContentSlotForPageModel) rel).setPage(firstContentPage);
    }
    else if (rel instanceof ContentSlotForTemplateModel)
    {
        ((ContentSlotForTemplateModel) rel).setPageTemplate(template);
    }

    modelService.save(rel);
}
于 2012-04-20T08:57:35.387 に答える
0

それらの間に新しいスーパークラスを作成できますか?

public abstract class SuperContentSlotModel extends CMSRelationModel{
    private String position;
    private ContentSlotModel slot;
    //...
}

class ContentSlotForPageModel extends SuperContentSlotModel{
    private int page;
    //...
}

また、次の代わりにメソッドのオーバーロードを使用できますinstanceof

private void setRelationModel(final ContentSlotForPageModel rel, final ContentSlotModel slot, final String id){
    //...
}
private void setRelationModel(final ContentSlotForTemplateModel rel, final ContentSlotModel slot, final String id){
    //...
}
于 2012-04-20T08:36:47.973 に答える