"Если ввод был несколько структурирован и хорошо определен, как бы вы защитились от будущих изменений в его структуре. Как бы вы спроектировали и внедрили читатель?"
Вы должны определить макет таким образом, чтобы его можно было гибко разделить.
Вот версия Python
class Field( object ):
def __init__( self, name, size ):
self.name= name
self.size = size
self.offset= None
class Record( object ):
def __init__( self, fieldList ):
self.fields= fieldList
self.fieldMap= {}
offset= 0
for f in self.fields:
f.offset= offset
offset += f.size
self.fieldMap[f.name]= f
def parse( self, aLine ):
self.buffer= aLine
def get( self, aField ):
fld= self.fieldMap[aField]
return self.buffer[ fld.offset:fld.offset+fld.size+1 ]
def __getattr__( self, aField ):
return self.get(aField)
Теперь вы можете определять записи
myRecord= Record(
Field('aField',8),
Field('filler',1),
Field('another',5),
Field('somethingElse',8),
)
Это дает вам реальный шанс выделить некоторые входные данные достаточно гибким способом.
myRecord.parse(input)
myRecord.get('aField')
Как только вы сможете анализировать, добавление конверсий - это вопрос создания подкласса Field для определения различных типов (даты, суммы и т. Д.)