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

What's a good way to couple and decouple linked classes?

我有两个 class 放在一起,但在任何给定时间,给定 class 的对象可能会或可能不会与另一个 [=20] 的对象合作=],并且合作伙伴可能会在程序的过程中发生变化。

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

我想出了一些似乎可行的方法(如下),但它需要三个函数调用才能避免陷入无限循环,而且看起来有点乱。有没有更好的方法我没有看到?

(顺便说一下,这是 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;
    }
}

我建议创建第三个 class。马与马车是分开的,反之亦然——它们不需要彼此存在。当他们在一起的时候,他们就是一个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)。如果您想知道分配给马的是什么马车,反之亦然,您只需在 HorseAndCarriages 的集合中查找条目即可。

我在上面的模型中使用了 id,因为你不能在不同的机器之间共享引用,也不能将它们持久化到数据库中。如果您不关心这一点,您可以更新 HorseAndCarriage class 以改为使用引用:

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

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

我认为您不需要那么多代码。像这样简单的事情应该可以解决问题:

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;
    }
}