Oop 不必要地通过中间人传递对象引用
我经常发现自己需要引用一个相隔几个对象的对象,或者看起来是这样。我看到的选项是通过中间人传递引用,或者只是静态地提供一些东西。我理解全局范围的危险,但是通过一个与之无关的对象传递引用感觉很可笑。我想我可以随便转转。我怀疑在某个地方会有一条界线 有人知道这条线在哪里吗Oop 不必要地通过中间人传递对象引用,oop,Oop,我经常发现自己需要引用一个相隔几个对象的对象,或者看起来是这样。我看到的选项是通过中间人传递引用,或者只是静态地提供一些东西。我理解全局范围的危险,但是通过一个与之无关的对象传递引用感觉很可笑。我想我可以随便转转。我怀疑在某个地方会有一条界线 有人知道这条线在哪里吗 还是处理在依赖对象之间分配引用问题的好方法?这是一种可能需要改进的抽象。你似乎违反了的使用规则(适度且有品位,而不是教条主义)。如果您正在编写a.b.c.d.e,那么一定是出了问题--您已经将a的实现永远钉在了一个b上,它有一个c它
还是处理在依赖对象之间分配引用问题的好方法?这是一种可能需要改进的抽象。你似乎违反了的使用规则(适度且有品位,而不是教条主义)。如果您正在编写
a.b.c.d.e
,那么一定是出了问题--您已经将a
的实现永远钉在了一个b
上,它有一个c
它。。。EEP!-)一个或最多两个点是您应该使用的最大值。但另一种选择是不要把东西塞进全局(并确保线程不安全、有缺陷、难以维护的代码!),而是让每个对象“表面化”它设计用来维护的那些特性,作为其与客户机接口的一部分,而不只是让可怜的客户机通过嵌套的引用链 我有三种模式:
在某些情况下,全球变暖并不太糟糕 考虑一下,您可能正在针对操作系统的API进行编程。这里面充满了全局变量,您可能可以访问文件或注册表,写入控制台。向上看窗把手。你可以做大量的事情来访问整个计算机甚至整个互联网的全局状态。。。您不必向类传递一个引用就可以访问它。如果你访问操作系统的API,所有这些都是全球性的 <> P>这样,当你考虑经常存在的全局事物的数量时,你自己的程序中的一个全局可能并不像许多人尝试、制造和尖叫的那么糟糕。 然而,如果你想拥有非常好的OO代码,并且这些代码都是可以进行单元测试的,我想你应该围绕着对全局变量的任何访问编写包装类,不管这些全局变量是来自操作系统,还是自己声明来封装它们。这意味着使用此全局状态的类可以获取包装器的引用,并且可以用赝品替换它们
嗯,不管怎样。我不太确定我想在这里给出什么建议,除了说,结构化代码是一种平衡!而且,如何解决您的特定问题取决于您的偏好、将使用代码的人的偏好、您在从学术到实用的范围内的感受、代码库有多大,系统的安全性有多重要,离完成期限还有多远。我相信你的问题揭示了你的课程。也许责任可以改进?也许移动一些代码可以解决问题
告诉我,不要问 我就是这样解释的。人们自然倾向于调用类来获取一些数据。走得太远,要求太多,通常会导致沉重的“getter序列”。但还有另一种方法。我必须承认,这并不容易找到,但在特定的代码和程序员的习惯中会逐渐改进 类A想要执行计算,并询问B的数据。有时,A告诉B做这项工作是合适的,可能会传递一些参数。这可以用B上的“isValid()”方法替换A用来检查名称有效性的B的“getName()”。 “询问”已被“告诉”(调用执行计算的方法)取代 对我来说,当我发现太多的getter电话时,我会问自己这个问题。渐渐地,这些方法在正确的对象中找到了它们的位置,一切都变得更简单了,我有更少的getter和对它们的调用。我有更少的代码,它提供了更多的语义,更好地符合功能需求
移动数据 在其他情况下,我会移动一些数据。例如,如果一个字段向上移动两个对象,“getter链”的长度将减少两个 我相信最初没有人能找到正确的模型。 我先想一想(用手写的图表很快而且很有帮助),然后编写代码,然后面对真实的东西再想想。。。然后我对其余的代码进行编码,我在代码中感觉到的任何气味,我会再次思考
拆分和合并对象 如果a上的方法需要C的数据,则B为