我只是把一个小项目放在一起,看看这是否是最快/最干净的方法来写出一个函数,抓住最新的3个生命迹象。
编辑:我认为GetRecentVitalSigns应该在域模型中。
而且,如果我想获取所有的生命迹象,我只需要调用VitalSigns列表,但我想我可以把它作为private并创建一个GetAllVitalSigns,但这似乎是多余的。任何建议都是极好的(任何相关的)。
public class Patient
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime AdmissionDate { get; set; }
public List<string> Allergies { get; set; }
public List<VitalSign> VitalSigns { get; set; }
public List<VitalSign> GetRecentVitalSigns()
{
if(VitalSigns.Count > 0)
{
var results = VitalSigns
.Take(3)
.OrderBy(x => x.DateTimeChecked)
.ToList();
return results;
}
return null;
}
}
public class VitalSign
{
public decimal BodyTemperature { get; set; }
public int Pulse { get; set; }
public int BloodPressure { get; set; }
public int RespiratoryRate { get; set; }
public DateTime DateTimeChecked { get; set; }
}public class Patient
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime AdmissionDate { get; set; }
public List<string> Allergies { get; set; }
private List<VitalSign> vitalSigns;
private IEnumerable<VitalSign> VitalSigns
{
get { return vitalSigns; }
}
public IEnumerable<VitalSign> GetRecentVitalSigns(int vitalSignsCount = 3)
{
var recentVitalSigns = new IEnumerable<VitalSign>();
if (recentVitalSigns.Any())
{
recentVitalSigns = vitalSigns
.OrderBy(vs => vs.DateTimeChecked)
.Take(vitalSignsCount);
}
return recentVitalSigns;
}
}
public class VitalSign
{
public decimal BodyTemperature { get; set; }
public int Pulse { get; set; }
public int BloodPressure { get; set; }
public int RespiratoryRate { get; set; }
public DateTime DateTimeChecked { get; set; }
}发布于 2013-10-19 13:14:11
我只想调用VitalSigns列表,但我想我可以将其作为私有的,并创建一个GetAllVitalSigns,但这似乎是多余的。
这取决于您希望类的用户允许什么。实际上,任何用户都可以修改有关对象内容的所有内容。取决于您将如何使用它们,这可能不是一个好主意。
考虑一下让(一些)您的设置器private是否有意义,或者VitalSigns是否应该更像:
private List<VitalSign> vitalSigns;
public IEnumerable<VitalSign> VitalSigns { get { return vitalSigns; } } 现在,转到GetRecentVitalSigns()方法:
public List<VitalSign> GetRecentVitalSigns()
{
if(VitalSigns.Count > 0)
{
var results = VitalSigns
.Take(3)
.OrderBy(x => x.DateTimeChecked)
.ToList();
return results;
}
return null;
}在我看来,这在几个层面上是不对的:
null。这是一种糟糕的做法,当您想要表示一个空集合时,请使用空集合,而不是null。它将使使用结果的代码和方法中的代码更简单,并避免NullReferenceException错误。List。在这里我看不出有什么好的理由,只需返回IEnumerable。如果这个方法的调用者想要一个他们可以修改的List,他们可以通过调用ToList()自己轻松地做到这一点。vs用于VitalSign比只使用x更好。这意味着我可能会这样编写方法:
public IEnumerable<VitalSign> GetRecentVitalSigns(int vitalSignsCount = 3)
{
return VitalSigns
.OrderByDescending(vs => vs.DateTimeChecked)
.Take(vitalSignsCount);
}另外:
public decimal BodyTemperature { get; set; }是。我认为大多数人都会在这里使用double (decimal只是为了钱,对吗?),但是decimal可能是正确的选择。(假设温度是人类输入的)。如果它是从温度计上直接读出的,那么double就有意义了。)
发布于 2013-10-19 13:34:59
您应该使用OrderByDescending,并在Take之前执行
var results = VitalSigns
.OrderByDescending(x => x.DateTimeChecked)
.Take(3)
.ToList();VitalSigns应该是IReadOnlyList<VitalSign>,这样类将始终知道何时更改列表,这样我们就可以安全地支持缓存。
public IReadOnlyList<VitalSign> VitalSigns { get; set { ... } } 还可以为最近的生命迹象创建一个属性,我们可以缓存它并使用create方法。
public IReadOnlyList<VitalSign> RecentVitalSigns { ... }还使VitalSign不可变,从而防止缓存的最近值的任何更改和差异。对于我来说,最终的课程设计应该是这样的:
public class Patient
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime AdmissionDate { get; set; }
public List<string> Allergies { get; set; }
private IReadOnlyList<VitalSign> _vitalSigns;
private IReadOnlyList<VitalSign> _recentVitalSigns;
public IReadOnlyList<VitalSign> VitalSigns {
get { return _vitalSigns; }
set {
_vitalSigns = value;
_recentVitalSigns = null;
}
}
public IReadOnlyList<VitalSign> RecentVitalSigns {
get {
if (_recentVitalSigns == null) {
_recentVitalSigns = GetRecentVitalSigns ();
}
return _recentVitalSigns;
}
}
private IReadOnlyList<VitalSign> GetRecentVitalSigns()
{
var results = VitalSigns
.OrderByDescending(x => x.DateTimeChecked)
.Take(3)
.ToList();
return results;
}
}
public class VitalSign
{
public decimal BodyTemperature { get; private set; }
public int Pulse { get; private set; }
public int BloodPressure { get; private set; }
public int RespiratoryRate { get; private set; }
public DateTime DateTimeChecked { get; private set; }
public VitalSign (decimal bodyTemperature, int pulse, int bloodPressure, int respiratoryRate, DateTime dateTimeChecked)
{
this.BodyTemperature = bodyTemperature;
this.Pulse = pulse;
this.BloodPressure = bloodPressure;
this.RespiratoryRate = respiratoryRate;
this.DateTimeChecked = dateTimeChecked;
}
}我的设计中没有几个主要特点:
RecentVitalSigns的缓存版本,因此多个调用(例如频繁的UI更新)将需要单个LINQ执行。VitalSigns只会使RecentVitalSigns缓存失效,而不是重新创建它,因此设置VitalSigns不会影响性能。https://codereview.stackexchange.com/questions/32916
复制相似问题