【问题标题】:How to define a class that represents an age group?如何定义一个代表一个年龄段的类?
【发布时间】:2014-12-15 02:39:48
【问题描述】:

我需要能够定义不同的年龄组,即 10 - 11、12 - 13 岁等。

我如何代表一个 AgeGroup 类,以便该年龄可以将今天、明天和将来的人适当地分组在一起,即今天的 11 岁可能明天 12 岁(在这种情况下,他将被分组到 12-13组而不是昨天的 10-11 岁组)。

到目前为止,我有这个:

public class AgeGroup
{
    public string Name { get; protected set; }
    public DateRange BirthDateRange { get; protected set; }
    public Guid Id { get; protected set; }
    public Status Status { get; protected set; }
    public virtual DateRange ApplicableDateRange { get; set; }

    public AgeGroup(Guid id, string name, DateRange birthDateRange,DateRange applicableDateRange)
    {
        Id = id;
        Name = name;
        Status = status;
        BirthDateRange = birthDateRange;
        ApplicableDateRange = applicableDateRange;
    }
}

public class DateRange
{
    public DateRange(DateTime startDate, DateTime endDate)
    {
        StartDate = startDate;
        EndDate = endDate;
    }

    DateTime _startDate;
    DateTime _endDate;

    public virtual DateTime StartDate
    {
        get { return _startDate; }
        set { _startDate = value.ToUniversalTime(); }
    }
    public virtual DateTime EndDate
    {
        get { return _endDate; }
        set { _endDate = value.ToUniversalTime(); }
    }
}

这个类定义了这个年龄组适用的时间范围。当适用的日期范围过去时,我们需要及时转移所有内容。但是有没有更好的方法来做到这一点?

【问题讨论】:

    标签: date-range domain-model


    【解决方案1】:

    如果您正在考虑将年龄范围存储在某个描述的 person 对象中,我不会,因为 (1) 它是从出生日期开始的一个易于计算的值; (2) 它并不是对象的真正属性(可以这样认为,但它的瞬态特性会使事情变得比需要的更复杂)。

    相反,只存储出生日期,然后提供一些代码,该代码可以根据该出生日期和当前日期给出年龄范围。

    您仍然可以有年龄范围,但人本身并不存在于“内部”。相反,您可以将 person 对象传递给函数并让它返回相关范围。

    而且,如果可能的话,年龄范围应该基于 ages 而不是出生日期,因为前者是不变的 - 你不必在范围之间“移动”对象,因为这是自动的他们的范围是从他们的出生日期和当前日期计算出来的。

    如果这不可能可能(并且从您提供的图表中可以看出这可能很困难):

    那么您可以像现在一样使用出生日期,但稍作修改以允许每年发生变化。

    有一个season 对象,它具有以下字段:

    • 开始日期。
    • range 对象的集合。

    这将允许您拥有多个 season 对象,例如,如果年龄范围在随后几年发生变化。只要它们不改变,您将只有一个 season 对象,其开始日期为 2014/15 赛季开始的时间。

    range 对象本身就是以下形式的对象的集合:

    Start birth date  End birth date  Range name
    ----------------  --------------  ----------
    1993-01-01        1993-07-31      U22
    1993-08-01        1994-07-31      U21
    1994-08-01        1995-07-31      U20
    :
    2009-08-01        2010-07-31      U5
    2010-08-01        2010-12-31      U4
    

    那么,为了找出某人属于哪个年龄段,你:

    • 根据季节日期(通常是今天,尽管您可能还想查看早期的季节)查找当前的 season 对象。
    • 遍历该季节的所有范围对象,直到找到一个人的出生日期介于范围的开始日期和结束日期之间的对象。如果您没有找到符合条件的范围,则不允许他们玩。
    • 然后提取范围名称。

    【讨论】:

    • 但正如您所见,我需要将某些信息与年龄范围相关联。名字等等与之相关的属性。
    • @richard,我明白这一点,但您对通过年龄组“转移”事物的描述只有在您将年龄组放入年龄组时才有意义。我要说的是你不应该那样做。一定要创建具有某些属性的年龄组,但是应该将“老化的事物”(人)与范围的匹配外部化。
    • 是的,我同意...我不会将“人”放入年龄组。但我需要的是具有年龄组的属性,例如“CanWatchHorrorMovies”。有些年龄组可以,有些不能。将根据与该班级的比较将一个人分配到该年龄段,然后确定是否允许他们观看恐怖电影。
    • 好的,那么您的问题似乎是您使用生日而不是年龄作为键。尽管孩子们长大得更快,但 13 岁(或其他任何时间)的 年龄 将永远是他们可以开始观看恐怖电影的年龄,无论当前日期如何。我怀疑如果您只在范围内使用年龄而不是生日,您将解决所有问题。
    • 问题在于年龄的定义...... 13 岁是多少?在这种情况下,它不仅仅是“13 年前”。看看这个:usclubsoccer.org/wp-content/uploads/2013/11/… 这就是我要编写的代码。
    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多