用于开源库的Api /插件?

时间:2010-05-01 12:54:34

标签: php design-patterns api oop

每当我使用开源库时,例如。 Doctrine我总是编写一个类(所谓的Facade)来使用Doctrine库。

所以下次我想创建一个用户,我只需输入:

 $fields = array('name' => 'peter', 'email' => 'peter@gmail.com');
 Doctrine_Facade::create_entity($entity, $fields);

然后它创建一个包含所提供信息的实体。

所以我想,所有程序员都会创建自己的“Facade”。

我想知道开源外墙下载和与开源库交互的常见程度如何?这是罕见的原因,我没有看到任何这些。在一些框架中,我看到它们被称为插件,例如。 twitter api或facebook api的插件。

所以每当你下载一个库时,你应该在网上搜索插件/外墙,还是尝试自己编写代码?我只是觉得每个人都不要重新发明轮子会很棒。

感谢。

2 个答案:

答案 0 :(得分:1)

立面的目的是(quoting

  
      
  • 为子系统中的一组接口提供统一接口。 Facade定义了一个更高级别的界面,使子系统更易于使用。
  •   
  • 使用更简单的界面包装复杂的子系统。
  •   

虽然上述内容可以说适用于您的示例,但对我来说感觉更像是AbstractFactory。您可能希望在没有Doctrine部分的情况下将其重命名为EntityFactory,因为它在内部使用Doctrine这一事实是一个实现细节。对于面向公众的工厂API,没关系。也许您希望稍后从Doctrine更改为Propel,然后您只需更改类中的代码,而不是API。

您可能也对Gateway pattern感兴趣。

但回答你的问题是否这是一种常见的方法:是的,我想是的。抽象使代码更易于理解和维护。但由于外观/网关的API - 无论什么适用 - 通常取决于应用程序的功能,因此很少可以重复使用,所以我怀疑你会在网上找到现成的外观/网关。

答案 1 :(得分:1)

让我们说这不仅仅是关于工厂,让我们说,你经常为你使用的图书馆写外墙。有什么意义?你为什么这样做?关键是,您以特定方式使用库。如果您编写的Facade是通用的,并且每个人都倾向于写这样的东西,那么Facade肯定会成为图书馆的一部分。所以它不是为什么以及为什么要编写它的原因是,您以非常特定的方式使用它,这是特定于您的库应用程序。因此,您将从库的抽象过渡到应用程序的抽象。这可以从您的应用程序中删除库的大部分复杂性,但它也限制了您使用库的方式。因此,如果您理解我的观点,您可能会确信,以某种方式释放每个Facade是没有意义的,可以使用该库。然而,有时候,当我们谈论一个有影响力的大型图书馆,它与其他一些图书馆相结合,并且一起构成了可以广泛使用的抽象图时,可能会发生新的图书馆。