「レガシー」システムのフォーマットに対応できるフレームワークに遭遇する可能性はほとんどありません。ほとんどの場合、レガシーシステムは標準フォーマットを使用しませんが、フレームワークはそれらを期待します。レガシーCOBOLシステムとJava/Groovy変換の保守者として、私はこの不一致に頻繁に遭遇します。「変換、パディング、配置、フィラーなどの心配」は、主にレガシーシステムを扱うときに行うことです。もちろん、その一部を便利なヘルパーにカプセル化することもできます。しかし、ほとんどの場合、java.util.Formatterに精通する必要があります。
たとえば、デコレータパターンを使用して、変換を行うデコレータを作成できます。以下は少しグルーヴィーです(Javaに簡単に変換できます):
class Entity{
String name = "name"; // length = 10; align left; fill with spaces
Integer id = 123; // length = 5; align left; fill with spaces
Integer serial = 321 // length = 5; align to right; fill with '0'
Date register = new Date();// length = 8; convert to yyyyMMdd
}
class EntityLegacyDecorator {
Entity d
EntityLegacyDecorator(Entity d) { this.d = d }
String asRecord() {
return String.format('%-10s%-5d%05d%tY%<tm%<td',
d.name,d.id,d.serial,d.register)
}
}
def e = new Entity(name: 'name', id: 123, serial: 321, register: new Date('2011/05/06'))
assert new EntityLegacyDecorator(e).asRecord() == 'name 123 0032120110506'
これは、これらの数が多すぎず、オブジェクトが複雑すぎない場合に機能します。しかし、すぐにフォーマット文字列が耐えられなくなります。次に、次のようなDateのデコレータが必要になる場合があります。
class DateYMD {
Date d
DateYMD(d) { this.d = d }
String toString() { return d.format('yyyyMMdd') }
}
したがって、%sでフォーマットできます。
String asRecord() {
return String.format('%-10s%-5d%05d%s',
d.name,d.id,d.serial,new DateYMD(d.register))
}
ただし、かなりの数のBeanプロパティの場合、文字列はまだ粗すぎるため、渡されたCOBOL仕様のように見える列と長さを理解するものが必要なので、次のように記述します。
class RecordBuilder {
final StringBuilder record
RecordBuilder(recordSize) {
record = new StringBuilder(recordSize)
record.setLength(recordSize)
}
def setField(pos,length,String s) {
record.replace(pos - 1, pos + length, s.padRight(length))
}
def setField(pos,length,Date d) {
setField(pos,length, new DateYMD(d).toString())
}
def setField(pos,length, Integer i, boolean padded) {
if (padded)
setField(pos,length, String.format("%0" + length + "d",i))
else
setField(pos,length, String.format("%-" + length + "d",i))
}
String toString() { record.toString() }
}
class EntityLegacyDecorator {
Entity d
EntityLegacyDecorator(Entity d) { this.d = d }
String asRecord() {
RecordBuilder record = new RecordBuilder(28)
record.setField(1,10,d.name)
record.setField(11,5,d.id,false)
record.setField(16,5,d.serial,true)
record.setField(21,8,d.register)
return record.toString()
}
}
レガシーシステムを処理するのに十分なsetField()メソッドを作成したら、それを「フレームワーク」としてGitHubに投稿することを簡単に検討します。これにより、次の貧弱な樹液が再びそれを行う必要がなくなります。しかし、次に、COBOLが「日付」(MMDDYY、YYMMDD、YYDDD、YYYYDDD)と数値(10進数、明示的な小数点、末尾の小数点としての符号、または先頭の浮動小数点文字としての符号)を格納するのを見たすべてのばかげた方法を検討します。次に、このための優れたフレームワークを誰も作成していない理由を理解し、例として、作成コードの一部をSOに投稿することがあります...;)