我有一个产品在生产过程中将非易失性值存储在EEPROM中。我目前将EEPROM建模为一个结构体,因此我可以很容易地对缓冲区进行编组。
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public class EEPROM
{
public const ushort MEMORY_VERSION = 0x01;
ushort memoryVersion;
byte value1 = 0;
byte value2 = 0;
public EEPROM() : this(MEMORY_VERSION) { }
protected EEPROM(ushort memoryVersion) { this.memoryVersion = memoryVersion; }
}
这些装置投入使用后的一段时间,我可能需要添加一个新的EEPROM设置。我需要想出一种方法来处理EEPROM的现场更新。我们的升级过程不能很好地支持外部应用程序,因此我需要处理系统中的升级。
我的第一个想法是添加虚拟升级方法。
public virtual void Update() {}
然后在新的
中继承过时的EEPROM结构[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public class EEPROM_V2 : EEPROM
{
public new const ushort MEMORY_VERSION = 0x02;
byte value3 = 0;
public EEPROM_V2() : base(MEMORY_VERSION) { }
protected TestEeprom(ushort memoryVersion) : base(MEMORY_VERSION) { }
public override void Upgrade() { base.Upgrade(); value3 = 0; }
}
但这会迫使EEPROM的客户端更改为EEPROM_V2。我必须过分思考这一点。如果我只是添加新值,我很容易就会产生一个讨厌的if语句链。
if( memoryVersion == X) { do this }
if( memoryVersion == Y) { do this }
etc...