建议使用继承来存储和检索对象的方法

时间:2018-06-06 14:21:17

标签: neo4j

在Neo4j中存储和检索从其他对象继承属性的对象的推荐方法是什么?

模型看起来像这样:

public class Base
{
    public string BaseProperty { get; set; }
}

public class DerivedA : Base
{
    public string DerivedAProperty{ get; set; }
}

public class DerivedB : Base
{
    public string DerivedBProperty{ get; set; }
}

我们有很多派生模型。我们的第一个解决方案是为每个派生类型创建一个事务,其中包括Base的属性。问题:每当Base发生变化时,我们都必须更改所有派生类型的所有事务。

下一个解决方案是编写一个单独的Transaction for Base,它首先将其属性存储到neo4j中。然后在确定哪个派生类型之后,创建另一个事务来存储派生类型的剩余属性。这样,交易数量翻倍,但我们有一个清晰的分离,使更改变得更容易。

检索更难。如果我们想要获取存储在Neo4j中的所有DerivedA类型,我们首先要有一个检索基本属性的事务。然后我们确定派生的Type并跟进一个从派生类型中检索属性的新事务。现在我们必须以正确的方式将两个事务的结果混合在一起,以获得包含所有属性的完整derivedA列表。

有更简单/更好的方式吗?

1 个答案:

答案 0 :(得分:1)

虽然你的问题很广泛,但还有一种替代方法可以继承。如果这是你的问题,我认为这是一个有效的问题。

继承的替代方法是(例如)装饰器模式:

核心原则(来自头脑设计模式的接受者):

  

装饰器模式的关键点在于它是继承的替代方法,具有在运行时更改和扩展行为的能力,并且不会绑定到具有特定版本或其他依赖项的某个基类。

一个例子,来自这个答案here

有关wikipedia

主题的更多信息

我会改变它以使其更具代表性。

public interface IStudent //this would rather be called an IInformationDisplayer
{
     string DisplayInformation();
}

public class Student : IStudent
{
    public string Name, Grade, Age, etc... { get; set; }
    private IStudent _student = null;

    public Student() { }
    public Student(IStudent student) {  _student = student; }

    public string DisplayInformation()
    {
        return $"{_student?.DisplayInformation()}" + 
               $"{Name} - {Age} years old is in {Grade} grade";
    }
}

public class ScienceStudent : IStudent //it's still a decorator
{
    public string Labs { get; set; }
    private IStudent _student;
    public ScienceStudentDecorator(IStudent student)
    {
        _student = student;
    }

    public string DisplayInformation()
    {
        var info =  _student?.DisplayInformation();
        return $"{info}. Labse are {Labs}";
    }
}