【问题标题】:best way to reference an object before it is assigned?在分配对象之前引用对象的最佳方法?
【发布时间】:2018-10-01 02:02:21
【问题描述】:

对我来说,编码主要是为了清晰和概览。因此,我很想调用尚未在类的构造函数中分配的对象。听起来像一个愚蠢的想法,所以这里有一个例子(无论如何可能很愚蠢):

// this doesn't work but looks clear
SomeClass a = new SomeClass(b, c);
SomeClass b = new SomeClass(a, c);
SomeClass c = new SomeClass(a, b);


// this functions but has bad overview:
SomeClass a = new SomeClass(null, null);
SomeClass b = new SomeClass(a, null);
SomeClass c = new SomeClass(a, b);
a.first = b;
a.snd = c;
b.snd = c;

有没有更好的方法去底部的那个?

随着 halfedge 数据结构的实现,对这一点的需求上升,其中边缘对象存储对另一个边缘对象的 prev 和 next 引用。我认为循环引用并不好,但例如列表也对每个下一个项目都有这样的引用。

【问题讨论】:

  • 这看起来像是设计中的一个严重缺陷。这些只是想法还是您有实际用例?
  • 您能否更具体并详细说明您想要实现的目标是什么?这个问题至少对我来说不是很清楚!
  • 也许您正在寻找依赖注入之类的东西(它不涵盖此特定场景,但通常此类依赖项依赖于其他人等)
  • @SaurabhRai A 的构造函数需要B 的实例,但B 的构造函数需要A 的实例。他有循环依赖。
  • @BradleyUffner 确实如此,但在我使用过的所有 DI 框架中,它们真的非常讨厌循环依赖,而不仅仅是在构造函数注入中。

标签: c# .net


【解决方案1】:

不要在构造函数中分配边,而是在单独的方法中进行:

SomeClass a = new SomeClass();
SomeClass b = new SomeClass();
SomeClass c = new SomeClass();
a.SetEdges(b, c);
b.SetEdges(a, c);
c.SetEdges(a, b);

这看起来更具可读性。您可能需要添加一些保护机制以防止在分配边之前使用该类;但如果您在构造函数中接受空值,情况也是如此。

【讨论】:

  • ...附带说明:如果您关心代码的可读性,first 尤其是snd 不是好的属性名称。像 FirstEdgeSecondEdge 这样的东西读起来更好。
  • 谢谢。这看起来更均匀。 @Konnamiman 我想如果我使用虚拟名称,我可以让它更通用。感谢您的所有建议!
【解决方案2】:

这只是第一个想法,但我认为主要方法应该是将类创建与定义它们的关系分离。

也许这样的事情会起作用(不确定你的确切关系):

void Connect(SomeClass a, SomeClass b) {
    a.first = b;
    b.snd = a;
}

并像这样使用它:

SomeClass a = new SomeClass();
SomeClass b = new SomeClass();
SomeClass c = new SomeClass();

Connect(a, b);
Connect(a, c);
Connect(c, b);

(该设计仍然不完美,但至少让恕我直言会发生什么)

【讨论】:

  • 您可以将这一切包装在工厂中,以确保这些项目始终以正确的顺序创建,并提供依赖项。
  • 是的。虽然我可能需要更多地了解实际用例才能提出真正有用的建议。
【解决方案3】:

不幸的是,没有办法实现这一点,因为它是一个循环依赖。

  • 你需要一辆车去上班(Someclass a = new Someclass(b))
  • 买车需要钱(Someclass b = new Someclass(c))
  • 你需要工作才能赚钱(Someclass c = new Someclass(a))

这不合适,您必须用其他东西替换一件物品。步行去,不需要钱!

交换 2 个变量的值也有同样的问题:

var a = 5;
var b = 2;
var tempvar = a;
a = b;
b = tempvar;

您必须在初始化后摆脱依赖或绑定它们。这是一个逻辑问题,不是编程问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2014-04-30
    • 2013-09-09
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多