プログラムはログ ファイルを解析します。各ログ ファイルは、異なる種類のフィールド形式 (固定幅、カンマ区切りなど) を持つ場合があります。また、各ログ ファイルにはいくつかの異なる種類のログが混在しています (種類ごとに異なるフィールド定義があります)。たとえば、CSV ログ ファイルは次のようになります。
ログファイル A
logType1、2012 年 10 月 1 日、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 から項目を取得し、ログ ファイルを 1 行ずつ読み取り、プロパティを割り当て、Row
解析された文字列を取得します。