[YMIR-299] PageクラスのBaseに古い名前のプロパティが残ってしまう Created: 2009-01-24 Updated: 2009-03-05 Resolved: 2009-03-05 |
|
Status: | Closed |
Project: | Ymir |
Component/s: | ymir-extension |
Affects Version/s: | 1.0.0 |
Fix Version/s: | 1.0.2 |
Type: | Improvement | Priority: | Major |
Reporter: | jflute | Assignee: | skirnir |
Resolution: | Fixed | Votes: | 0 |
Labels: | None |
Description |
【概要】 【原因考察】 【解決案】 SystemNotificationで、クラス毎に「スーパークラス手動追加OK」を |
Comments |
Comment by skirnir [ 2009-03-05 ] |
完了とします。 |
Comment by jflute [ 2009-03-05 ] |
Pageクラスのプロパティ、DTOクラスのプロパティともに不要なプロパティは削除されることを確認しました。 ありがとうございます! |
Comment by skirnir [ 2009-03-05 ] |
対処しました(r2896)。 |
Comment by jflute [ 2009-01-27 ] |
議論の結果、 |
Comment by jflute [ 2009-01-26 ] |
思いつきですが、提案ということで書いておきます。 PageクラスのBaseの各プロパティに、 例えば、FooPage(foo.html)とBarPage(bar.html)とあるとします。 BarPageのプロパティ例: Bar自体のプロパティ → Hoge Fooからのプロパティ → Fuga この状態で最初に書いた「PageクラスのBaseは毎度全部上書き」 そこで、それぞれのプロパティに「自分の出身地」を付与します。 @Meta(from="bar.html") public void setHoge() { ... @Meta(from="foo.html") public void setFuga() { ... この情報を自動生成時に利用します。 Hogeプロパティをbar.htmlからを削除もしくは別の名前のプロパティにしたとします。 万が一、複数出身地があったらあったで、「@Meta(from= {"foo.html", "bar.html"})」と表現して、 )」に修正されて(出身を消す)、 このやり方だと、互換性が保つことができて、 上記の例はあくまで例で「出身地の表現」や「アノテーション」は、 |
Comment by jflute [ 2009-01-25 ] |
ご説明ありがとうございます。 > あるページクラスが複数のHTMLから生成されうるため > この件はまずは「どのプロパティがどのプロパティに変更されたかを検出する方法」 あと、とりあえず今の時点では、古いのはBaseクラスの変数定義を手動削除して、 ありがとうございます。 |
Comment by skirnir [ 2009-01-25 ] |
これは不具合ではなく、どちらかというと仕様です。 プロパティ名を変更するような再生成をした場合、どのプロパティがどのプロパティに変更されたかを自動生成機構は(今のところ)知ることができません。そのため古いプロパティは残ってしまいます(DBFluteでも昔のEntity?クラスが残ってしまっていたのと似ています)。 これを避けるには、プロパティ変更の対応関係をどうにか検知するか、おっしゃるように「Baseクラスには手を入れてはいけない」というルールにするかどちらかだと思います。前者は今のところ困難なのでやるとしたら後者です。 ところが、実は以前この機能は存在していたんですが、あるページクラスが複数のHTMLから生成されうるためこの機能はうまく働かないことがあることが発覚し、安全のためこの機能が廃止されたという経緯があります。 具体的には、例えばedit.htmlにポストバックのformタグがあった場合、EditPageBaseが自動生成されますが、一方でlist.htmlにedit.html?id=XXXのような、edit.htmlへのリンクが存在する場合はlist.htmlに変更があった場合EditPageBaseが更新されてしまいます。この時、list.htmlに含まれるedit.htmlが持つ情報は不完全(edit.htmlのサブセット)であるため、Baseクラス差し替えとしてしまうと、edit.htmlの情報のうちlist.htmlに*含まれれない*情報が全て消えてしまうのです。 これを避けるには、やはりBaseクラスのマージ作業が必要となり、そうすると古いプロパティを残すか消すかの判定をしないといけなくなりますが、どのプロパティが「古い」のかの判定はできないので結局適切に処理ができないことになります。 ところでPageクラスのBaseに手動で何かを追加できるという機能は、主に2つの理由から存在します: 1. アノテーションを追加したいだけなのにSetterなどをオーバライドしないといけないのは面倒 1は、久保さんのおっしゃるように、 発散してきましたが、この件はまずは「どのプロパティがどのプロパティに変更されたかを検出する方法」を考える方向で進めたいと思います。 |