说我有以下两个类:
public class MyDevice
{
int id;
string name;
// other resources
public MyChannel CreateChannel()
{
return new MyChannel(this);
}
}
public class MyChannel
{
int id;
MyDevice _device;
// other resources
public MyChannel(MyDevice device)
{
_device = device;
}
}
实际上,每个设备可以具有可变数量的通道。所以关系是每个设备都有一个频道集合。编写代码的方式MyChannel
对象具有MyDevice
对象,这让我感到困扰。但是,代码中定义的关系更方便,我也希望保持简单。
为了平息我脑后的唠叨 - 我一直指着SqlConnection
和SqlCommand
的结构方式,每个SqlCommand
对象都有一个SqlConnection
尽管事实上每个SQL连接都有一系列SQL命令。
我是否违反了面向对象编程的任何原则/这段代码闻到了什么?
编辑:
明确地说:在面向对象的设计方面,转变它的关系是一个很大的禁忌吗?如果是这样,那么忽略了什么是单一的原则/忽略?
答案 0 :(得分:3)
我假设示例所说的Device
意味着MyDevice
。您基本上可以引用父级即设备。我认为这不会破坏OO并且在许多情况下是有用的。纯粹主义者会说它破坏了父母的封装,并创建了从通道到通道外的任何东西的耦合。
答案 1 :(得分:2)
这并没有违反任何原则。您经常会有包含其他对象的对象。
我假设你的意思是MyChannel._device字段实际上是MyDevice?
此外,您可能需要考虑在MyDevice对象中包含MyChannel对象列表,以便在需要时更轻松地进行双向遍历。只需确保您在两个字段之间实施一致性。
答案 2 :(得分:2)
我认为这种模式原则上没有任何错误。有时,存在两个真正紧密耦合的类。
但是,我认为让你的频道类变为私有是一个非常好的主意,只使用CreateChannel方法实例化它,同时添加一个私有的频道对象集合公共吸气者,没有公共设定者作为您设备的成员。这样,您可以确保您的设备类始终控制其自己的通道。