耦合和解耦链接 类 的好方法是什么?
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
)。如果您想知道分配给马的是什么马车,反之亦然,您只需在 HorseAndCarriage
s 的集合中查找条目即可。
我在上面的模型中使用了 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;
}
}
我有两个 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
)。如果您想知道分配给马的是什么马车,反之亦然,您只需在 HorseAndCarriage
s 的集合中查找条目即可。
我在上面的模型中使用了 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;
}
}