public class HourlyForecastData { public DateTime DateTime { get; private set; } public decimal TemperatureCelcius { get; private set; } public decimal DewPoint { get; private set; } public string Condition { get; private set; } public int ConditionCode { get; private set; } public int WindSpeed { get; private set; } public string WindDirection { get; private set; } public decimal WindDegrees { get; private set; } public int UltravioletIndex { get; private set; } public decimal Humidity { get; private set; } public decimal WindChill { get; private set; } public int HeatIndex { get; private set; } public decimal FeelsLike { get; private set; } public decimal Snow { get; private set; } public HourlyForecastData(DateTime dateTime,decimal temperatureCelcius,...) { DateTime = dateTime; TemperatureCelcius = temperatureCelcius; //...set all the other properties via constructor } }
我正在努力学习更好的软件设计和OOP.我正在创建一个可以访问回复XML的气象服务的库.服务提供了许多不同的字段,因此我为每个XML字段创建了属性.但是,通过构造函数设置该数量的属性会感觉有点混乱.我可以省略构造函数并拥有公共setter但我正在尝试创建一个不可变类.
我已经环顾了不同的设计模式,似乎有一些“Builder”和“Factory”模式.但是,我很难理解如何将其应用到我的代码中.或者我应该使用完全不同的东西来填充这些对象中的属性?
解决方法
在这种情况下,组合可能是一个很好的选择.特别是因为有些参数属于特定类别.
例如:
public int WindSpeed; public string WindDirection; public decimal WindDegrees;
为它们创建一个新对象,然后访问不同的值:
weatherData.Wind.Speed;
并将新的wind对象传递给构造函数:
var wind = new Wind(xmlData.WindSpeed,xmlData.WindDirection,xmldata.WindDegrees); var weatherReport = new WeatherReport(wind,/* .... */);
我还会介绍几个枚举.因为到目前为止,weatherReport的用户例如必须知道字符串WindDirection可以具有哪些值.如果将字符串转换为枚举,则使用不同的值会更容易.
最后要注意的是,我通常只使用构造函数,如果实际上必须为类指定一些有效状态的值.例如,在您的情况下,最小有效状态是日期和温度?然后将它们放在构造函数中.