该程序解析日志文件 - 每个日志文件可能具有不同类型的字段格式(固定宽度、逗号分隔等)。此外,每个日志文件都混合了几种不同类型的日志 - 每种都有不同的字段定义)。例如,CSV 日志文件可能看起来像
日志文件 A
logType1, 10/1/2012, 12, abc logType2,a,b,c,d,2012 年 11 月 1 日 logType1,2012 年 10 月 2 日,21,定义 logType2,e,f,c,d,2012 年 12 月 1 日 logType3, 3.23, ....
以下是代码。下面的代码中违反了多少个坚实的原则?一个人说布局定义列表不应该与解析日志混合。所以它至少违反了 SRP(或更多)?重构结构的最佳方法是什么?
// Field
public interface IField { .... }
public class Field : IField { ... common field methods, etc.... }
public class FixedWidthField : Field { }
public class CommaDelimField : Field { ... }
// Log type
public interface ILogType<out T> where T : IField { ... IEnumerable<T> Fields { get; } }
public class LogType<T> : ILogType<T> where T : IField
{ ....
public LogType(..., List<T> fields) { ... Fields = fields; }
}
// File
public inteface ILogFile<out T> where T: IField { ... IEnumerable<ILogType<T>> LogTypeList { get; set; } }
public abstract class LogFile<T> : ILogFile<T> where T: IField
{ ....
public IEnumerable<ILogType<T>> LogTypeList { get; set; }
public virtual string Row { get { ... } set { ...} }
public string GetParsedFieldString() { ... }
}
public class CommaDelimLog : LogFile<CommaDelimField>
{
public override string Row { get { ... } set { ...code to parse the line...} }
public override string GetParsedFieldString() { ... }
}
// The following initilize code store all the layout information
public static List<ILogFile<IField>> LogFileList = new List<ILogFile<IField>>
{
new CommaDelimLog("logFileA", ...., new List<ILogType<CommaDelimField>> {
new LogType<CommaDelimField>("logType1", ... new List<CommaDelimField>{ .... }
new LogType<CommaDelimField>("logType2", ... new List<CommaDelimField>{ .... }
....
}),
new CommaDelimLog("logFileB", .... a long long list
主程序根据文件名模式从LogFileList中获取一项,逐行读取日志文件并赋值Row
,然后得到解析后的字符串。