【发布时间】:2020-05-03 06:08:44
【问题描述】:
我有两个函数:myFunctionA() 和 myFunctionB()。
myFunctionA() 返回一个 Object,其中包括具有字符串值的键 Page_Type。
myFunctionB() 处理myFunctionA() 返回的Object 中的多个条目,包括Page_Type 及其字符串值。
稍后,myFunctionA() 已更新,因此它不再返回包含键 Page_Type 的对象,而是返回键 Page_Types - 它具有数组值。
因此,myFunctionB() 现在也需要更新 - 它将不再处理 Page_Type 这是一个字符串,而是 Page_Types 这是一个数组。 p>
如果我理解正确(我可能没有理解),以上是 依赖请求 的示例,并且可以通过(我认为)部署 来避免它引发的大量重构依赖注入模式(或者甚至可能是服务定位器模式?)而不是(??)
但是,尽管阅读了这个主题,我仍然不确定依赖注入如何在 PHP 或 Javascript 函数中工作(大部分解释涉及像 C++ 这样的编程语言和像 Classes 这样的 OOP 概念,而我正在处理 PHP 和 javascript 中的第三方函数)。
是否有任何方式来构建我的代码,以便更新myFunctionA()(以任何重要方式)将不需要我也更新myFunctionB()(以及所有其他 em> 函数调用myFunctionA() - 例如myFunctionC()、myFunctionD()、myFunctionE() 等)?
如果myFunctionH() 需要myFunctionG() 需要myFunctionF() 而需要myFunctionA() 怎么办?我不希望现在更新myFunctionA() 意味着另外三个函数(F、G 和H)都必须更新。
尝试回答:
目前我能想到的最佳答案 - 这可能不是最佳实践答案,因为我还不知道是否存在与我所描述的问题相对应的正式问题在上面的问题中 - 以下是我如何呈现设置的重述:
我有两个(不可变的)函数:
myFunctionA__v1_0()和myFunctionB__v1_0()。
myFunctionA__v1_0()返回一个包含键的对象Page_Type有一个字符串值。
myFunctionB__v1_0()处理对象中的多个条目 由myFunctionA__v1_0()返回,包括Page_Type及其 字符串值。后来,
myFunctionA__v1_0()仍然存在,但也由myFunctionA__v2_0()继任 返回一个包含键Page_Types的对象 - 它有一个数组值。为了让
myFunctionB访问myFunctionA__v2_0()返回的对象, 现在还需要一个myFunctionB__v1_1(),能够处理 数组Page_Types。
这可以概括为:
-
myFunctionB__v1_0()需要myFunctionA__v1_0()返回的对象 -
myFunctionB__v1_1()需要myFunctionA__v2_0()返回的对象
由于每个函数在被正式命名后都变得不可变,所以永远不会发生的是,我们最终得到了一个myFunctionB__v1_0() 需要myFunctionA__v2_0() 返回的对象的示例。
我不知道我的方法是否正确,但这是迄今为止我想出的最好方法。
【问题讨论】:
-
您似乎将“依赖注入”(这是一种实践)与“依赖注入容器”(这是一个具体的解决方案/库,并且在“服务定位器”解决方案中有替代方案)混淆了。另外,开始推动使用 OOP 而不是这种疯狂的程序。
-
谢谢,@tereško。为了确保给定函数不会调用一个函数然后返回第一个函数无法处理的数据,您能否推荐一种明确的替代方法来按名称对函数进行版本控制,然后使它们不可变(正如我上面建议的那样)?
-
您拥有的是“已发布的 API”,但由于愚蠢地坚持使用函数,您无法使用接口作为边界(输入和输出)。因此,要么开始使用像 21 世纪这样的类,要么坚持使用版本化和不可变函数。这是自伤。
-
谢谢。我应该强调(尽管应该很明显)我不是程序员。您对“输入/输出接口和边界”有任何阅读建议吗?我在 OOP 上找到了这个:cs.utexas.edu/~mitra/csSummer2012/cs312/lectures/oop.html,但它相当高级/抽象。你能推荐其他人吗?非常感谢,@tereško。
-
我还在Entity-Control-Boundary pattern 上找到了一个维基百科条目。当您提到“边界接口”时,您所指的是那种东西吗?
标签: javascript php design-patterns architecture