[YMIR-280] *[ymir-extension] Converterのメソッド構成の見直し Created: 2009-01-19  Updated: 2009-02-02  Resolved: 2009-01-30

Status: Closed
Project: Ymir
Component/s: ymir-extension
Affects Version/s: 1.0.0
Fix Version/s: 1.0.1

Type: Improvement Priority: Major
Reporter: jflute Assignee: skirnir
Resolution: Fixed Votes: 0
Labels: None


 Description   

【概要】
現状、何をオーバーライドすればいいのかわかりにくい。
補完の絞り込みがしづらいメソッドになっている(Copyで始まるメソッドが多いなど)

【環境】
Mac OS X
Safari
Java 5.0

【仕様案】
o オーバーライド必至なメソッドcopyTo(Entity, DTO)はcopyTo(DTO, Entity)を
 copyDtoToEntity()とcopyEntityToDto()にする。
 → 現状どっちがどっちだかわかりにくいため
 → メソッド名で判断できればメソッドのシグネチャは意識する必要ない

o ユーザがオーバーライドする想定のメソッドは「_」始まりにする。
 → Pageクラスの良い仕様をこっちにも適用
 → 代表的なのは先述のcopyDtoToEntity()を「_copyDtoToEntity()」に

o リスト変換とプロパティ個別変換のメソッド名の始まりを違うものに
 → 現状Copyで補完中あまりにメソッドが表示されすぎてわかりづらい
 → プロパティ変換は「Copy」という言葉は使わず別のにするのが良いかと

o プロパティ個別変換のメソッドで安全なオーバーライドメソッドの提供
 → 現状、CopyMemberNameTo(dto, entity)という形で、結局サブクラスでは
  好きなような変換ができてしまい安全でない
  「String extractMemberNameFromEntity(Entity entity)」
  というような感じのメソッドを作成して、オーバーライド単位を
  狭めた方が安全である。

o 配列同士の変換メソッドは、プロパティに配列がいなければ出力しない
 → オーバーロードメソッドがたくさん補完されて選びづらい
 → YMIR-279の話とも多少なり関連する

全体イメージはこんな感じ:

_copyDtoToEntity(...)
_copyEntityToDto(...)

reflectMemberNameToDto()
_extractMemberNameFromEntity()

reflectMemberNameToEntity()
_extractMemberNameFromDto()

【補足】
この機能は、将来Ymirの大傑作となる可能性を秘めているので、
こういった細かいところもこだわった方が良いと考える。



 Comments   
Comment by skirnir [ 2009-02-02 ]

確認ありがとうございました。closeとします。

Comment by jflute [ 2009-02-01 ]

確認しました。ありがとうございます!
とてもよくなりました!

Comment by skirnir [ 2009-01-30 ]

対処しました(r2718)。

[互換性に関する注意]
この変更によりConverterBaseクラスの生成内容の互換性がなくなりました。

以前と同じConverterBaseクラスを生成するには、ymir-extension.jarに含まれる

org/seasar/ymir/extension/freemarker/template/ConverterBase-1.0.0.java.ftl

をプロジェクトのリソースディレクトリ(src/main/resourcesなど)にコピーして下さい。

Comment by skirnir [ 2009-01-29 ]

対処します。

Comment by jflute [ 2009-01-27 ]

議論の結果:

<メソッド名>

copyToDtoList(List<Entity>)
 |- copyTo(Dto, Entity)
      |-copyFooTo(Dto, Entity)

が、以下のようになる

toDtoList(List<Entity>)
 |- copyEntityToDto(Entity, Dto)
      |-reflectFooToDto(Entity, Dto)
          |-extractFooFromEntity(Entity)

reflectFooToDto()とextractFooFromEntity()の関係は以下のイメージ:

protected void reflectFooToDto(Member entity, MemberDto dto) {
    dto.setFormalizedDatetime(extractFooFromEntity(entity));
}
protected java.util.Date extractFooFromEntity(Member entity) {
    return convert(entity.getFormalizedDatetime(), java.util.Date.class);
}

<配列メソッド>
とりあえずなしで、必要になったら設定で生成できるようにする。

Comment by jflute [ 2009-01-19 ]

重要度の再確認:

毎回ほぼ必ずオーバーライドするメソッド:

DtoのリストをEntityのリストへ変換
EntityのリストをDtoのリストへ変換

とにかくこのメソッドがわかりやすく(区別しやすく)、
かつ、オーバーライドしやすいことが最重要です。

Comment by jflute [ 2009-01-19 ]

メソッド名の先頭文字の具体的な単語に関しては、
Ymir内でのポリシーがあればそれでいいです。

reflectとかextractにこだわる必要はないです(これはDBFluteっぽい)。
(先頭の一文字は違う文字になることは前提ですが)

Comment by jflute [ 2009-01-19 ]

「_」に関しては、もっと細かくメソッド名の先頭が
分かれてれば、こだわる必要は無いです。

Generated at Sat Apr 20 17:46:51 JST 2024 using Jira 9.15.0#9150000-sha1:9ead8528714127d8cfabf2446010d7e62c0a195c.