首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获得3个最新的病人生命体征的功能

获得3个最新的病人生命体征的功能
EN

Code Review用户
提问于 2013-10-19 12:33:42
回答 2查看 593关注 0票数 6

我只是把一个小项目放在一起,看看这是否是最快/最干净的方法来写出一个函数,抓住最新的3个生命迹象。

编辑:我认为GetRecentVitalSigns应该在域模型中。

而且,如果我想获取所有的生命迹象,我只需要调用VitalSigns列表,但我想我可以把它作为private并创建一个GetAllVitalSigns,但这似乎是多余的。任何建议都是极好的(任何相关的)。

代码语言:javascript
复制
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; }
}

新结构

代码语言:javascript
复制
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; }
}
EN

回答 2

Code Review用户

回答已采纳

发布于 2013-10-19 13:14:11

我只想调用VitalSigns列表,但我想我可以将其作为私有的,并创建一个GetAllVitalSigns,但这似乎是多余的。

这取决于您希望类的用户允许什么。实际上,任何用户都可以修改有关对象内容的所有内容。取决于您将如何使用它们,这可能不是一个好主意。

考虑一下让(一些)您的设置器private是否有意义,或者VitalSigns是否应该更像:

代码语言:javascript
复制
private List<VitalSign> vitalSigns;
public IEnumerable<VitalSign> VitalSigns { get { return vitalSigns; } } 

现在,转到GetRecentVitalSigns()方法:

代码语言:javascript
复制
public List<VitalSign> GetRecentVitalSigns()
{
    if(VitalSigns.Count > 0)
    {
        var results = VitalSigns
            .Take(3)
            .OrderBy(x => x.DateTimeChecked)
            .ToList();

        return results;
    }
    return null;
}

在我看来,这在几个层面上是不对的:

  1. 最重要的是,我认为这是错误的,因为您首先从列表中获取前3项,然后再订购这3项。你应该以相反的方式去做:首先排序,然后在此基础上得到最后的3。根据列表中有多少项,每次对整个集合进行排序可能太慢。但是,在不知道如何使用该类的情况下,很难提出最好的解决方案。
  2. 当没有结果时,返回null。这是一种糟糕的做法,当您想要表示一个空集合时,请使用空集合,而不是null。它将使使用结果的代码和方法中的代码更简单,并避免NullReferenceException错误。
  3. 你返回List。在这里我看不出有什么好的理由,只需返回IEnumerable。如果这个方法的调用者想要一个他们可以修改的List,他们可以通过调用ToList()自己轻松地做到这一点。
  4. 当它有意义时,甚至让你的lambda中的变量至少有一点描述性。例如,将vs用于VitalSign比只使用x更好。
  5. 考虑要返回的项数是否应该是可配置的。你确定3总是正确的号码吗?你还是可以把它变成默认的。(另一方面,如果你期望3永远是正确的数字,就不要这么做。)

这意味着我可能会这样编写方法:

代码语言:javascript
复制
public IEnumerable<VitalSign> GetRecentVitalSigns(int vitalSignsCount = 3)
{
    return VitalSigns
        .OrderByDescending(vs => vs.DateTimeChecked)
        .Take(vitalSignsCount);
}

另外:

代码语言:javascript
复制
public decimal BodyTemperature { get; set; }

是。我认为大多数人都会在这里使用double (decimal只是为了钱,对吗?),但是decimal可能是正确的选择。(假设温度是人类输入的)。如果它是从温度计上直接读出的,那么double就有意义了。)

票数 6
EN

Code Review用户

发布于 2013-10-19 13:34:59

您应该使用OrderByDescending,并在Take之前执行

代码语言:javascript
复制
var results = VitalSigns
                    .OrderByDescending(x => x.DateTimeChecked)
                    .Take(3)
                    .ToList();

VitalSigns应该是IReadOnlyList<VitalSign>,这样类将始终知道何时更改列表,这样我们就可以安全地支持缓存。

代码语言:javascript
复制
public IReadOnlyList<VitalSign> VitalSigns { get; set { ... } } 

还可以为最近的生命迹象创建一个属性,我们可以缓存它并使用create方法。

代码语言:javascript
复制
public IReadOnlyList<VitalSign> RecentVitalSigns { ... }

还使VitalSign不可变,从而防止缓存的最近值的任何更改和差异。对于我来说,最终的课程设计应该是这样的:

代码语言:javascript
复制
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;
    }
}

我的设计中没有几个主要特点:

  1. 我们已经准备好了RecentVitalSigns的缓存版本,因此多个调用(例如频繁的UI更新)将需要单个LINQ执行。
  2. 设置VitalSigns只会使RecentVitalSigns缓存失效,而不是重新创建它,因此设置VitalSigns不会影响性能。
  3. 数据是只读的,所以我们可以确保我们的缓存对真实的数据总是有效的,没有人会把它搞砸。
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/32916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档