应用c#泛型对代码进行微调
我已经编写了一个代码来生成的图表数据,需要知道是否有任何可能的改进。我已经应用了泛型,但认为它可以进一步微调。有人能推荐什么吗 我基本上编写了一个GenerateExplotChartSeries方法,该方法将按照名称生成BoxPlotChartSeries 有两个同名的方法接受不同的参数。有两个不同的方法是一个好主意,还是最好有一个通用方法,对参数应用泛型,然后根据参数进行检查,并在方法中执行if-else条件?我唯一担心的是这种方法的长度会继续增加。还要注意,我将创建更多的图形,如折线图和样条曲线图。类和方法也需要考虑到这一点。因此,该方法还需要相应地生成样条曲线图数据和折线图数据 请注意以下几点 1.NpvGraphs将包含CommIns、CaptiveIns、SelfIns,EVAGraphs将包含CaptiveView和ParentView应用c#泛型对代码进行微调,c#,C#,我已经编写了一个代码来生成的图表数据,需要知道是否有任何可能的改进。我已经应用了泛型,但认为它可以进一步微调。有人能推荐什么吗 我基本上编写了一个GenerateExplotChartSeries方法,该方法将按照名称生成BoxPlotChartSeries 有两个同名的方法接受不同的参数。有两个不同的方法是一个好主意,还是最好有一个通用方法,对参数应用泛型,然后根据参数进行检查,并在方法中执行if-else条件?我唯一担心的是这种方法的长度会继续增加。还要注意,我将创建更多的图形,如折线图和样
public class Series<T>
{
public List<T> data { get; set; }
}
public class BloxPlotSeriesData
{
[JsonMinify]
public double low { get; set; }
[JsonMinify]
public double q1 { get; set; }
[JsonMinify]
public double median { get; set; }
[JsonMinify]
public double q3 { get; set; }
[JsonMinify]
public double high { get; set; }
[JsonMinify]
public string Color { get; set; }
}
public class NPVGraphData
{
[JsonMinify]
public List<double> CommIns { get; set; }
[JsonMinify]
public List<double> CaptiveIns { get; set; }
[JsonMinify]
public List<double> SelfIns { get; set; }
}
public class EVAGraphData
{
[JsonMinify]
public List<double> CaptiveView { get; set; }
[JsonMinify]
public List<double> ParentView { get; set; }
}
类似地,我还要对该方法进行两次调用,该方法将相应地生成样条曲线图和折线图。上述方法调用仅适用于BoxPlotChart
StressResult = new Models.StressTestAnalysis()
{
SeriesData=GenerateSplineChartSeries(trigger2Output.StressTestAnalysis.GraphData)
}
EndingSurplus = new EndingSurplus()
{
SeriesData=GenerateLineChartSeries(trigger2Output.EndingSurplus.GraphData)
}
方法
private Series<BloxPlotSeriesData> GenerateBoxPlotChartSeries(EVAGraphData evaResultsGraphData)
{
//CaptiveView
var captiveViewSeriesData = new BloxPlotSeriesData
{
low = evaResultsGraphData.CaptiveView[0],
q1 = evaResultsGraphData.CaptiveView[1],
median = evaResultsGraphData.CaptiveView[2],
q3 = evaResultsGraphData.CaptiveView[3],
high = evaResultsGraphData.CaptiveView[4],
Color = "#C111A0"
};
//ParentView
var parentViewSeriesData = new BloxPlotSeriesData
{
low = evaResultsGraphData.ParentView[0],
q1 = evaResultsGraphData.ParentView[1],
median = evaResultsGraphData.ParentView[2],
q3 = evaResultsGraphData.ParentView[3],
high = evaResultsGraphData.ParentView[4],
Color = "#FFB81C"
};
return new Series<BloxPlotSeriesData>
{
data = new List<BloxPlotSeriesData> { captiveViewSeriesData, parentViewSeriesData }
};
}
private Series<BloxPlotSeriesData> GenerateBoxPlotChartSeries(NPVGraphData npvResultsGraphData)
{
//CaptiveIns
var captiveInsSeriesData = new BloxPlotSeriesData
{
low = npvResultsGraphData.CaptiveIns[0],
q1 = npvResultsGraphData.CaptiveIns[1],
median = npvResultsGraphData.CaptiveIns[2],
q3 = npvResultsGraphData.CaptiveIns[3],
high = npvResultsGraphData.CaptiveIns[4],
Color = "#C111A0"
};
//CommIns
var commInsSeriesData = new BloxPlotSeriesData
{
low = npvResultsGraphData.CommIns[0],
q1 = npvResultsGraphData.CommIns[1],
median = npvResultsGraphData.CommIns[2],
q3 = npvResultsGraphData.CommIns[3],
high = npvResultsGraphData.CommIns[4],
Color = "#FFB81C"
};
//SelfIns
var selfInsSeriesData = new BloxPlotSeriesData
{
low = npvResultsGraphData.SelfIns[0],
q1 = npvResultsGraphData.SelfIns[1],
median = npvResultsGraphData.SelfIns[2],
q3 = npvResultsGraphData.SelfIns[3],
high = npvResultsGraphData.SelfIns[4],
Color = "#5D63D3"
};
return new Series<BloxPlotSeriesData>
{
data = new List<BloxPlotSeriesData>{ captiveInsSeriesData, commInsSeriesData, selfInsSeriesData }
};
}
专用系列生成器ExplotChartSeries(EVAGraphData evaResultsGraphData)
{
//CaptiveView
var captiveViewSeriesData=新的BloxPlotSeriesData
{
low=evaResultsGraphData.CaptiveView[0],
q1=evaResultsGraphData.CaptiveView[1],
中位数=evaResultsGraphData.CaptiveView[2],
q3=evaResultsGraphData.CaptiveView[3],
高=evaResultsGraphData.CaptiveView[4],
Color=“#C111A0”
};
//父视图
var parentViewSeriesData=新的BloxPlotSeriesData
{
low=evaResultsGraphData.ParentView[0],
q1=evaResultsGraphData.ParentView[1],
中位数=evaResultsGraphData.ParentView[2],
q3=evaResultsGraphData.ParentView[3],
高=evaResultsGraphData.ParentView[4],
Color=“#FFB81C”
};
返回新系列
{
数据=新列表{captiveViewSeriesData,parentViewSeriesData}
};
}
专用系列生成器ExplotChartSeries(NPVGraphData npvResultsGraphData)
{
//俘虏
var captiveInsSeriesData=新的BloxPlotSeriesData
{
低=npvResultsGraphData.CaptiveIns[0],
q1=npvResultsGraphData.CaptiveIns[1],
中位数=npvResultsGraphData.CaptiveIns[2],
q3=npvResultsGraphData.CaptiveIns[3],
高=npvResultsGraphData.CaptiveIns[4],
Color=“#C111A0”
};
//康明斯
var commInsSeriesData=新的BloxPlotSeriesData
{
低=npvResultsGraphData.CommIns[0],
q1=npvResultsGraphData.CommIns[1],
中位数=npvResultsGraphData.CommIns[2],
q3=npvResultsGraphData.CommIns[3],
高=npvResultsGraphData.CommIns[4],
Color=“#FFB81C”
};
//塞尔芬斯
var selfInsSeriesData=新的BloxPlotSeriesData
{
低=npvResultsGraphData.SelfIns[0],
q1=npvResultsGraphData.SelfIns[1],
中位数=npvResultsGraphData.SelfIns[2],
q3=npvResultsGraphData.SelfIns[3],
高=npvResultsGraphData.SelfIns[4],
Color=“#5D63D3”
};
返回新系列
{
数据=新列表{CaptiveInSeriesData、ComminSeriesData、SelfInSeriesData}
};
}
我不知道您是否真的需要泛型,因为您的工作似乎相当专业,而且不是非常“泛型”:您需要从共享特定结构的类中提取绘图数据。
也许一个简单的类层次结构就可以了?
我所做的只是:
- 重命名公共属性并在抽象类中“向上拉”,抽象类具有操作公共数据的方法(即共享属性CaptiveView和ParentView
- 如果子类支持虚拟方法,则创建一个虚拟方法以提供更多数据,就像SelfIns一样
- 更改公共属性的大小写,因为它们应该是大写的,除非您的团队遵循不同的指导原则
- 将特定值隔离到私有常量中,以便更好地了解在类中要使用的内容(以及其他原因)
- 使GenerateExplotChartSeries成为一种“鸟瞰”方法,即一种在没有实现细节的情况下让您快速了解情况的方法
- 创建两个私有(较小)方法,GetCaptivePlotData和GetParentData,它们保存实现细节。
- 编辑:将所有方法放在抽象类中,这样它们将更易于阅读,参数更少,并且在OOP方面更有意义
public class Series<T>
{
public List<T> Data { get; set; }
}
public class BloxPlotSeriesData
{
[JsonMinify]
public double Low { get; set; }
[JsonMinify]
public double Q1 { get; set; }
[JsonMinify]
public double Median { get; set; }
[JsonMinify]
public double Q3 { get; set; }
[JsonMinify]
public double High { get; set; }
[JsonMinify]
public string Color { get; set; }
}
/// <summary>
/// The base class, holding common drawing data.
/// </summary>
public abstract class GraphData
{
private const string CaptivePlotColor = "#C111A0";
private const string ParentPlotColor = "#FFB81C";
[JsonMinify]
public List<double> CaptiveView { get; set; }
[JsonMinify]
public List<double> ParentView { get; set; }
/// <summary>
/// Override this method in subclasses if you needto provide additional data.
/// </summary>
/// <returns>More data to be plotted.</returns>
public virtual BloxPlotSeriesData ReturnMoreData()
{ return null; }
/// <summary>
/// Returns plot data.
/// </summary>
/// <returns>Plot data.</returns>
public Series<BloxPlotSeriesData> GenerateBoxPlotChartSeries()
{
BloxPlotSeriesData captiveViewSeriesData = GetCaptivePlotData();
BloxPlotSeriesData parentViewSeriesData = GetParentData();
var Result = new Series<BloxPlotSeriesData>
{
Data = new List<BloxPlotSeriesData> { captiveViewSeriesData, parentViewSeriesData }
};
return AddMoreData(Result);
}
/// <summary>
/// Adds more data if the first argument can provide it.
/// </summary>
/// <param name="Result"></param>
/// <returns></returns>
private Series<BloxPlotSeriesData> AddMoreData(Series<BloxPlotSeriesData> Result)
{
var MoreData = ReturnMoreData();
if (MoreData != null)
{
Result.Data.Add(MoreData);
}
return Result;
}
private BloxPlotSeriesData GetParentData()
{
return new BloxPlotSeriesData
{
Low = ParentView[0],
Q1 = ParentView[1],
Median = ParentView[2],
Q3 = ParentView[3],
High = ParentView[4],
Color = ParentPlotColor
};
}
private BloxPlotSeriesData GetCaptivePlotData()
{
return new BloxPlotSeriesData
{
Low = CaptiveView[0],
Q1 = CaptiveView[1],
Median = CaptiveView[2],
Q3 = CaptiveView[3],
High = CaptiveView[4],
Color = CaptivePlotColor
};
}
}
public class EVAGraphData : GraphData
{
}
public class NPVGraphData : GraphData
{
[JsonMinify]
public List<double> SelfIns { get; set; }
public override BloxPlotSeriesData ReturnMoreData()
{
return new BloxPlotSeriesData
{
Low = SelfIns[0],
Q1 = SelfIns[1],
Median = SelfIns[2],
Q3 = SelfIns[3],
High = SelfIns[4],
Color = "#5D63D3"
};
}
}
公共类系列
{
公共列表数据{get;set;}
}
公共类BloxPlotSeriesData
{
[JsonMinify]
公共双低位{get;set;}
[JsonMinify]
公共双Q1{get;set;}
[JsonMinify]
公共双中位数{get;set;}
[JsonMinify]
公共双Q3{get;set;}
[JsonMinify]
公共双高{get;set;
public class Series<T>
{
public List<T> Data { get; set; }
}
public class BloxPlotSeriesData
{
[JsonMinify]
public double Low { get; set; }
[JsonMinify]
public double Q1 { get; set; }
[JsonMinify]
public double Median { get; set; }
[JsonMinify]
public double Q3 { get; set; }
[JsonMinify]
public double High { get; set; }
[JsonMinify]
public string Color { get; set; }
}
/// <summary>
/// The base class, holding common drawing data.
/// </summary>
public abstract class GraphData
{
private const string CaptivePlotColor = "#C111A0";
private const string ParentPlotColor = "#FFB81C";
[JsonMinify]
public List<double> CaptiveView { get; set; }
[JsonMinify]
public List<double> ParentView { get; set; }
/// <summary>
/// Override this method in subclasses if you needto provide additional data.
/// </summary>
/// <returns>More data to be plotted.</returns>
public virtual BloxPlotSeriesData ReturnMoreData()
{ return null; }
/// <summary>
/// Returns plot data.
/// </summary>
/// <returns>Plot data.</returns>
public Series<BloxPlotSeriesData> GenerateBoxPlotChartSeries()
{
BloxPlotSeriesData captiveViewSeriesData = GetCaptivePlotData();
BloxPlotSeriesData parentViewSeriesData = GetParentData();
var Result = new Series<BloxPlotSeriesData>
{
Data = new List<BloxPlotSeriesData> { captiveViewSeriesData, parentViewSeriesData }
};
return AddMoreData(Result);
}
/// <summary>
/// Adds more data if the first argument can provide it.
/// </summary>
/// <param name="Result"></param>
/// <returns></returns>
private Series<BloxPlotSeriesData> AddMoreData(Series<BloxPlotSeriesData> Result)
{
var MoreData = ReturnMoreData();
if (MoreData != null)
{
Result.Data.Add(MoreData);
}
return Result;
}
private BloxPlotSeriesData GetParentData()
{
return new BloxPlotSeriesData
{
Low = ParentView[0],
Q1 = ParentView[1],
Median = ParentView[2],
Q3 = ParentView[3],
High = ParentView[4],
Color = ParentPlotColor
};
}
private BloxPlotSeriesData GetCaptivePlotData()
{
return new BloxPlotSeriesData
{
Low = CaptiveView[0],
Q1 = CaptiveView[1],
Median = CaptiveView[2],
Q3 = CaptiveView[3],
High = CaptiveView[4],
Color = CaptivePlotColor
};
}
}
public class EVAGraphData : GraphData
{
}
public class NPVGraphData : GraphData
{
[JsonMinify]
public List<double> SelfIns { get; set; }
public override BloxPlotSeriesData ReturnMoreData()
{
return new BloxPlotSeriesData
{
Low = SelfIns[0],
Q1 = SelfIns[1],
Median = SelfIns[2],
Q3 = SelfIns[3],
High = SelfIns[4],
Color = "#5D63D3"
};
}
}