C# 强制不同对象之间的数据完整性
我正在通过开发一个C#音乐管理软件来学习OOP。到目前为止,我已经展示了不同类和对象之间的交互,如类图所示 然而,我很困惑如何使我的设计坚实,因为我发现了无数的可能性,如何可以做的事情,但我不想以一个糟糕的设计结束。我面临的主要问题是确保在不同对象之间强制执行数据完整性(据我所知,我假设在OOP中,就像在数据库设计中一样,有一种方法可以提供不同对象中数据存储的准确性、一致性和可靠性,就像在数据库设计中一样(例如,外键约束的使用)。例如,在我的应用程序中,我有艺术家、歌曲和专辑对象,它们应该一起交互。例如,我不想让一首歌曲错误地与错误的专辑关联。我被告知我应该执行以下操作:C# 强制不同对象之间的数据完整性,c#,oop,class,integration,C#,Oop,Class,Integration,我正在通过开发一个C#音乐管理软件来学习OOP。到目前为止,我已经展示了不同类和对象之间的交互,如类图所示 然而,我很困惑如何使我的设计坚实,因为我发现了无数的可能性,如何可以做的事情,但我不想以一个糟糕的设计结束。我面临的主要问题是确保在不同对象之间强制执行数据完整性(据我所知,我假设在OOP中,就像在数据库设计中一样,有一种方法可以提供不同对象中数据存储的准确性、一致性和可靠性,就像在数据库设计中一样(例如,外键约束的使用)。例如,在我的应用程序中,我有艺术家、歌曲和专辑对象,它们应该一起交
class Album
{
public String Name{ get; set;}
List<Track> tracks;
public void AddTrack(Track t)
{
tracks.Add(t);
t.Album = this;
}
}
class Track
{
public Album Album{ get; set;}
public String AlbumName
{
get{ return this.Album.Name}
}
public String ArtistName{ get; set}
}
类相册
{
公共字符串名称{get;set;}
列出曲目;
公共轨道(t轨道)
{
增加(t);
t、 相册=这个;
}
}
班级轨道
{
公共相册相册{get;set;}
公共字符串名称
{
获取{返回this.Album.Name}
}
公共字符串ArtistName{get;set}
}
但是,这对我来说不起作用。有人能建议我如何真正做到这一点吗?特别是,我如何添加一首带有标题、专辑和艺术家的新歌,并确保如果由于某种奇怪的原因更改了专辑的名称,所有曲目仍将返回正确的专辑名称,因为它们从al获取数据自焚
还有,有人能推荐一个更好的设计吗?我应该使用继承或任何多态性来使我的设计更健壮吗?在DB design中,您必须根据您的业务需求做出选择。意思是: 你必须问自己关于可能的星座的问题 -CD上的所有歌曲都来自同一位艺术家吗?否->歌手场在轨道上,是->专辑上的歌手场 -当你知道一首歌时,你是否必须能够得到专辑,或者仅仅是一张特定专辑中的所有曲目 - 从Track对象引用被引用唱片集的名称的方式来看,您所做的是正确的。值得一提的是:它们确实返回唱片集名称,但仅返回唱片集在获取时的名称。 因此,如果将AlbumName属性指定给可视控件或其他任何控件,则在更改Albums名称时,该属性不会自动更新
如果这不是您想要听到的,请询问更具体的问题。在DB design中,您必须根据业务需求做出选择。意思是: 你必须问自己关于可能的星座的问题 -CD上的所有歌曲都来自同一位艺术家吗?否->歌手场在轨道上,是->专辑上的歌手场 -当你知道一首歌时,你是否必须能够得到专辑,或者仅仅是一张特定专辑中的所有曲目 - 从Track对象引用被引用唱片集的名称的方式来看,您所做的是正确的。值得一提的是:它们确实返回唱片集名称,但仅返回唱片集在获取时的名称。 因此,如果将AlbumName属性指定给可视控件或其他任何控件,则在更改Albums名称时,该属性不会自动更新
如果这不是你想听到的,那就问得更具体些。事实上,你没有做关联 在面向对象编程中,您关联对象而不是“键”。没有“外键”的概念 如果对象B具有父对象a,且a具有唯一标识符,则不会通过设置此唯一标识符来关联B的父对象,而是对象本身: B有父母a: 以这种方式工作,因为“的实例”可能与许多其他对象关联,从任何引用更改同一对象,将导致修改该对象 如何实现完整性约束?有一些设计模式,但最常见的模式之一是规范 这就创建了一个公共接口“isSpecification”,它有一个方法,可以称为“Check”,它接受一个参数(要检查规范的对象)。在实现中,该方法将检查某个对象是否符合某个规范
public interface ISpecification { bool Check(object some); }
public class Person { public string Name { get; set; } }
public class PersonSpecification : ISpecification
{
public bool Check(object some)
{
// Checks that some person won't be null and his/her name isn't null or empty
return some != null && !string.IsNullOrEmpty(((Person)some).Name);
}
}
这是一个关于如何实现业务规则和/或约束的非常简单和通用的示例
在这方面,有许多框架可以帮助您:
- Microsoft模式与实践验证块:
- NHibernate验证器:(它是NHibernate项目的一部分,但是它可以在没有NHibernate的情况下独立使用)
public interface ISpecification { bool Check(object some); }
public class Person { public string Name { get; set; } }
public class PersonSpecification : ISpecification
{
public bool Check(object some)
{
// Checks that some person won't be null and his/her name isn't null or empty
return some != null && !string.IsNullOrEmpty(((Person)some).Name);
}
}
这是一个非常简单和通用的示例,介绍了如何实现businessr