首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为类集合提供健壮的一致性检查

为类集合提供健壮的一致性检查
EN

Stack Overflow用户
提问于 2014-05-23 05:49:55
回答 2查看 46关注 0票数 0

给出一些我正在做的事情的背景:

我有一个程序,允许用户修改和创建一个通用的校准。在这种校准中,包括组。组因其执行的分析类型而不同。这些组还包括光谱集合,每个集合仅包含一个分子的数据。在这些集合中还包括不同浓度的光谱数据。每个光谱数据都是一组离散的数据,由其分辨率(每个点之间的x轴空间)和光谱范围(x轴范围)指定。

建立这些校准文件的一个主要方面是保持每个集合中所有光谱数据的分辨率和光谱范围的一致性。这意味着,除非光谱数据与其余光谱数据匹配,否则无法添加光谱数据。此外,如果用户删除所有光谱数据,则分辨率和范围将被重置,允许将任何范围或分辨率的光谱数据添加到校准中。

问题是:如何提供一种有效的方法来防止在校准中添加与当前分辨率和光谱范围不匹配的光谱数据?

下面是对校准类的一般描述。这是一个非常一般的描述,包含了唯一需要解释我正在尝试做的事情的信息。

代码语言:javascript
复制
class calibration
{
    List<Group> groups;
}


class Group
{
    List<SpectralSet> sets;
}

class SpectralSet
{
    List<SpectraData> spectras;
}

class SpectraData
{
    double firstXPoint;
    double lastXPoint;
    double resolution;
    double[] Ypoints; 
}
EN

回答 2

Stack Overflow用户

发布于 2014-05-23 06:13:21

我相信您可以应用各种花哨的设计模式来执行您提到的规则。

但是,为了简单起见,我只使用AddGroup方法将逻辑封装在calibration类中,该方法可以验证添加的group是否符合校准的要求。类似地,我将为group类创建一个AddSpectralSet方法,作为sets集合的网关守护设备。

在这一点上,根据这些更改的频率,我会考虑将groups集合和sets集合公开为ReadOnlyCollection,以确保代码不会在不使用指定方法的情况下尝试添加项。

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2014-05-23 06:31:00

您的方法可能会有所不同,但这里概述了如何实现这一点。您需要执行以下操作:

  • 仅公开不可变的公共集合属性以及Add方法,以便您可以进行自己的验证。

例如,您不想执行以下操作:

代码语言:javascript
复制
class Group
{
    public List<SpectralSet> sets;
}

因为这样任何人都可以只做myGroup.sets.Add(mySet),而不需要你有机会在集合上做任何验证。实现这一目标的一种常见模式如下:

代码语言:javascript
复制
class Group
{
    private List<SpectralSet> _sets;
    public IEnumerable<SpectralSet> Sets { get { return _sets; } }

    public void Add(SpectralSet set)
    {
        //Do validation here, throw an exception or whatever you want to do if the set isn't valid
        _sets.Add(set);
    }

    //Have a similar Remove method
}

  • 存储数据必须与

匹配的条件

我不太确定什么是光谱范围,所以我将仅以分辨率为例。您可以简单地将其扩展到任何范围标准。至少有三种可能的方法可以做到这一点:

  1. 构造类时,将构造函数中允许的解析传递给它,并添加和删除此immutable.
  2. When,将允许的解析更新为necessary.
  3. Don't显式存储解析,每次添加或删除时都对其进行计算。

到目前为止,选项1是最简单的。当你能让事情尽可能地保持不变时,生活总是会变得容易得多。所以你会做类似这样的事情:

代码语言:javascript
复制
class Group
{
    private List<SpectralSet> _sets;
    public IEnumerable<SpectralSet> Sets { get { return _sets; } }
    public readonly double Resolution;

    public Group(double resolution)
    {
        Resolution = resolution;
    }

    public void Add(SpectralSet set)
    {
        if(set.Resolution != resolution)
            //Throw an Exception here, or however you want to handle invalid data
        _sets.Add(set);
    }

    //Have a similar Remove method
}

按照这个例子,您包含的每个类都需要一个具有相同逻辑的Resolution参数,只是检查您尝试添加的任何直接子类的Resolution。同样地,你使用的任何光谱范围也是如此。

如果所有数据都被清除,您还希望能够更改允许的分辨率。要做到这一点,最简单的方法是在清除数据时创建新对象,而不是只清除现有对象中的集合。

  • Make SpectraData immutable

如果您可以从一个经过仔细管理的集合中获得一个SpectraData并任意更改它,那么所有这些都是无用的。使任何需要验证的东西都是不可变的,只允许它在构造时设置。如果您有不这样做的要求,您需要非常仔细地考虑如何允许它被更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23817647

复制
相关文章

相似问题

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