我正在设计一个用于测试的服务域区域。不同类别的参与者将参加各种测试:学校的学生,学校的老师和学校的前学生,该学校的前学生。需要注意的是,在测试的时候,学校以前的学生一般都附在学校里,他没有课(他已经没学了)。
您经常可以在网上看到这样的说法,即您应该尽可能使用组合而不是继承。但是还有另一个我更同意的说法:您只需要了解这两种关系中的哪一种存在is (继承)或has (组合/聚合)。
这是我的课程:
/// <summary>
/// При тестировании бывших учеников школы, используются объекты данного класса
/// </summary>
public class SchoolParticip
{
public string Surname { get; set; }
public string Name { get; set; }
public DateTime Birthday { get; set; }
/// <summary>
/// Ходил ли участник в садик до поступления в школу?
/// </summary>
public bool WentKindergarten { get; set; }
public School School { get; set; }
public DateTime AddedDate { get; set; }
public string DataSourceName { get; set; }
}
/// <summary>
/// Ученик школы
/// </summary>
public class ClassParticip : SchoolParticip
{
/// <summary>
/// Класс в школе
/// </summary>
/// <example>1А | 3Б и т.п.</example>
/// <remarks>Class - это отдельный класс</remarks>
public Class Class { get; set; }
}
/// <summary>
/// Учитель школы
/// </summary>
/// <remarks>
/// Объекты данного класса используются, когда проходит какое-то тестирование учителей,
/// которые также закреплены за определенными школами.
/// </remarks>
public class TeachParticip : SchoolParticip
{
/// <summary>
/// Стаж работы
/// </summary>
public int Experience { get; set; }
/// <summary>
/// Категория
/// </summary>
/// <remarks>
/// Класс Category описывает категории (первая категория, высшая категория и т.д.).
/// </remarks>
public Category Category { get; set; }
}
问题
整个问题是这样的:
1. 我是否做了正确的事情,主要从概念的角度来看,我在这里选择了继承,而不是组合?
子问题是:
1.1)这些实体将被投影到关系数据库表上,我需要字段AddedDate- 添加记录的时间和DataSourceName- 数据源的名称(通过 LC 添加时,这将是登录名)。但是从概念的角度来看,说“我是测试参与者并且我有属性“TimeAddingMeToDatabase””是否正确?除非可以将类似的属性放在一行中,例如姓氏和名字。也许这里需要某种模式?我缺乏什么设计知识?
1)如果我们谈论与类之间的关系有关的信号英语动词,那么
Composition- thishas a ..., butAggregation- thispart of ...。2)我们必须意识到,优先考虑组合而不是继承的建议是非常合理的,因为程序员经常开始构建类的层次系统,有时除了希望少写之外没有任何理由重复的属性名称,例如“......哦!
Id-我将创建一个类Entity......”等等。作为这种方法的结果,出现了一个层次化的类系统,原则上,应用程序中可能不需要它,甚至可能在未来产生很大的干扰。如果您开始使用抽象进行设计,最好求助于继承,即 您从接口和抽象类开始编程,虽然在接口的情况下,继承称为实现,但您理解我...3)具体来说,在你的情况下,以我的拙见,你有实体:
Человек,Опыт并且与之相关的ТипОпыта是字面上的字典名称(学生、教师等),它们存储在一个单独的数据库表中。该实体Опыт必须具有ACC。属性(StartDate、EndDate、Experience Type、Experience 等。无论您需要什么),因此Опыт您可以使用数据库中的表跟踪正确人员的整个教育和工作路径。可你的这点遗产,不好。
4)“...AddedDate 是添加记录的时间,DataSourceName 是数据源的名称...” 这样的东西以一对一的关系放在数据库中的单独表中。那些。有一个表“Person”,其中一个“trailer”是一个单独的表“PersonSecret”,它将存储登录名、密码等。服务信息。