什么是耦合和解耦链接类的好方法?

时间:2017-09-09 23:35:01

标签: c# oop encapsulation decoupling

我有两个课程在一起,但在任何特定时间,某个课程的某个对象可能会或可能不会与另一个课程的某个对象合作,并且合作伙伴可能会在程序。

我希望每个对象能够访问其合作伙伴(如果有),并且我想确保两个对象都保持其当前合作伙伴的准确记录。

我已经想出了一些似乎有用的东西(下图),但它需要三个函数调用来避免陷入无限循环,而且它看起来有点混乱。有没有更好的方法让我看不到?

(顺便说一句,这是C#,因此所有这些变量都是引用。如果它不明显。)

class Horse {
    private Carriage existingCarriage;

    public Horse(int num) { horseNumber = num;}

    public void setCarriage(Carriage newCarriage) {

        if(existingCarriage != null) {
            Carriage temp = existingCarriage;
            existingCarriage = null;
            temp.setHorse(this);
        }

        existingCarriage = newCarriage;
    }
}

//pretty much the same thing with "Horse" and "Carriage" switched.
class Carriage {
    private Horse existingHorse;

    public Carriage() {}

    public void setHorse(Horse newHorse) {

        if(existingHorse != null) {
            Horse temp = existingHorse;
            existingHorse = null;
            temp.setCarriage(this);
        }

        existingHorse = newHorse;
    }
}

2 个答案:

答案 0 :(得分:2)

我建议创建第三堂课。马与马车是分开的,反之亦然 - 他们不需要彼此存在。当他们在一起时,他们是一个HorseAndCarriage:

public class Horse
{
    public int Id { get; set; }

    public Horse(int id)
    {
        Id = id;
    }
}

public class Carriage
{
    public int Id { get; set; }

    public Carriage(int id)
    {
        Id = id;
    }
}

public class HorseAndCarriage
{
    public int HorseId { get; set; }
    public int CarriageId { get; set; }

    public HorseAndCarriage(int horseId, int carriageId)
    {
        HorseId = horseId;
        CarriageId = carriageId;
    }
}

当您将马分配给马车时,您不会修改马匹或马车的属性,而是创建一个新的HorseAndCarriage实体(如果该马已被分配到另一辆马车,或者马车已被分配给另一匹马,你会删除HorseAndCarriage)。如果您想知道为马分配了什么样的马车,反之亦然,您只需在HorseAndCarriage s的集合中查找一个条目。

我在上面的模型中使用了ID,因为您无法在不同的计算机上共享引用,并且您无法将它们持久保存到数据库中。如果您不关心这一点,可以更新HorseAndCarriage类以改为使用引用:

public class HorseAndCarriage
{
    public Horse Horse { get; set; }
    public Carriage Carriage { get; set; }

    public HorseAndCarriage(Horse horse, Carriage carriage)
    {
        Horse = horse;
        Carriage = carriage;
    }
}

答案 1 :(得分:0)

我认为你不需要那么多代码。像这样简单的东西可以解决这个问题:

class Horse
{
    public Carriage existingCarriage;

    public void setCarriage(Carriage newCarriage)
    {
        existingCarriage = newCarriage;
        if (existingCarriage != null) existingCarriage.existingHorse = this;
    }
}

class Carriage
{
    public Horse existingHorse;

    public void setHorse(Horse newHorse)
    {
        existingHorse = newHorse;
        if (existingHorse != null) existingHorse.existingCarriage = this;
    }
}