Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 这种情况是对抽象的过度使用吗?_Oop - Fatal编程技术网

Oop 这种情况是对抽象的过度使用吗?

Oop 这种情况是对抽象的过度使用吗?,oop,Oop,我们正在使用其他人提供的图书馆。最近由于库中的更改,我们的项目有500个错误。当迁移到新库时,我们发现只有15个API出现故障,500个错误是重复的(这15个错误的次数是这15个错误的倍数,因为相同的调用被多次使用) 所以,对于迁移,我建议创建另一个内部静态包装类,包装那些库API调用。因为若库再次更改,我们将有更少的代码要更改,所以将来代码将更易于维护。此外,通过包装调用,我们还避免了人为错误(或意外(过载)的API使用) 但是这里的一些人不认为有另一个包装器类有什么意义,他们觉得这完全没有必

我们正在使用其他人提供的图书馆。最近由于库中的更改,我们的项目有500个错误。当迁移到新库时,我们发现只有15个API出现故障,500个错误是重复的(这15个错误的次数是这15个错误的倍数,因为相同的调用被多次使用)

所以,对于迁移,我建议创建另一个内部静态包装类,包装那些库API调用。因为若库再次更改,我们将有更少的代码要更改,所以将来代码将更易于维护。此外,通过包装调用,我们还避免了人为错误(或意外(过载)的API使用)

但是这里的一些人不认为有另一个包装器类有什么意义,他们觉得这完全没有必要。他们唯一的论点是,由于大多数API更改只是一行程序,所以我们总是可以使用CTRL+H(查找和替换)来更改它们。他们还说,我建议的这个额外的抽象消除了编码器/阅读器的可读性(因为它将实际的API调用隐藏在另一个方法名称后面(尽管有意义))


这里最好的方法是什么?我的建议错了吗?

这实际上就是所谓的模式,它是专门针对您的具体问题创建的


适配器专门用于而不是添加功能,只是为了使API的接口适应调用者期望的接口。接口只是一个方便的OO工具,用于以一致和可管理的方式实现适配器功能,模式本身基本上描述了如何解决问题。

如果不了解您的代码,很难说,但我觉得facade/adapter是从您自己的代码中分离api调用的好方法。我不想说这是必要的,但它更清楚

使用自定义包装器包装不稳定的API和库是一种相对常见的做法。 例如,一个常见的用法是将该库的异常转换为您的异常命名法

更一般地说,这些包装器被称为适配器,尽管适配器(IMHO)更适合于提供一方所需的功能,同时隐藏另一方的确切“语言”,而不是因为另一方不稳定

不过你提到了使用静力学——我一般不太喜欢使用静力学。IMHO有时最好让一个接口代表您需要的功能,然后当其中一个子类型使用第三方库时,让该接口的子类型代表您需要的功能。这样做的好处是,有一天可以切换到另一个供应商,而无需更改系统中的每个呼叫

不管怎样,你通常都在正确的轨道上。我认为任何认为CTRL-H是有效的重构工具的人都是自找麻烦。他们是否至少在代码中使用了getter和setter(如果适用)


另外,可读性部分我也不清楚。具有可读名称的适配器与具有可读名称的原始API一样好

如果API正在更改,那么包装器是保护您自己的唯一方法。如果您已经确定了一个正在改变的API,那么您的项目将面临一些巨大的风险。如果您想切换到另一个库,使用包装器降低这些风险还可以保护您自己

要实现包装器,您必须制作包装器并进行搜索和替换


无论哪种方式,由于最初的API更改,您仍然需要处理所有调用,因此我不认为额外的小投资是一个问题。

这取决于API正在做什么,以及添加另一层是否真的增加了隔离/封装,或者仅仅是添加了另一层间接寻址。如果API中的一个更改需要对包装器的公共接口进行更改,那么它将成为一个障碍


当您可以在对您的应用程序有意义的抽象级别上公开功能、隐藏您不需要的API灵活性以及标准化您访问所需功能的方式时,包装层最适合。这还包括使用更特定于您的问题域的函数和参数名称,这可以减少理解API如何集成到您的应用程序中的概念难度。

这不是一个坏主意。不要让反对者让你失望。如果他们坚持要删除这个抽象,那么下次他们就可以解决500多个库依赖编译器问题。而且,在整个解决方案中使用Find/Replace可以保证整个团队几个小时的乐趣。斯维科:我想我错过了一个笑话。是否存在这样一种情况,即全局查找/替换会比查找/替换人员花费更多的时间?通常认为查找/替换是一个好的解决方案的人,也认为共享文件夹是一个足够好的源代码存储库(一个真实而不幸的故事)SWeko,你的故事让我不寒而栗。是的,连我都对可读性部分感到困惑。但他们就是这么说的:)。他们可能是在暗示隐藏在另一个包装器中的API调用可能不会让读者知道API的语法/用法或类似的东西。@Chandan:为什么读者需要知道底层API的语法/用法?关键在于,您希望最小化底层系统上的耦合API@Chandan:我通常倾向于在太多抽象方面出错-我不信任任何不是“标准”的库(即,不信任建立apache项目的可靠性)。我也是API可用性的狂热爱好者,所以我经常编写自己的适配器。我认为适配器是为了对现有的第三方功能进行一些调整(例如添加逻辑等)。我正在包装对第三方API的调用。它仍然有资格被称为适配器吗?(因为我也没有定义接口)。