1

我正在开发一个库,该库有很多类,这些类都由一个中心类组合在一起。这个中心类必须调用其他类的某些方法来进行设置/配置。这些方法必须是公共的,以便中心类可以调用它们,但我不希望用户调用这些方法(因为它可能会导致不良行为)。

我的一个朋友提出的一个建议是使用带参数的构造函数可以在构造时完成设置。对于这个库来说,这并不容易。有问题的类旨在扩展,如果用户想要拥有自己的构造函数,我不想对构造函数参数施加任何奇怪的要求。更复杂的是,一些用于配置的信息对用户不可用。我必须将其提供给用户,并相信他们会在构建过程中将其路由回正确的类。

目前,我的解决方案是在这些方法前面加上一些东西,并提醒用户不要调用带有上述前缀的方法。这足够“灵活”,可以让我添加更多受限制的方法,但它仍然假设用户将遵循我的指示。它也不是最优雅的解决方案。

我想知道是否有某种方法可以轻松地限制这些方法。我考虑在它们中添加一条线来检查是否是中心类在调用它们,但这似乎也不是最好的解决方案。

编辑:我应该解释这个架构的目的。每个类在一组操作中执行一个特定的任务。中心班级的工作是指挥一个班级执行任务,收集结果,并将结果分发给需要它们的其他班级。然后班级移动到下一个班级并做同样的事情。如何执行任务取决于扩展类。我想要限制的方法是有助于分散结果的方法。我希望这能让我的意图更清楚。

4

1 回答 1

1

这一切都取决于您的中心班级的角色。根据您的描述,它似乎是一个假脱机程序或调度程序。如果假脱机对象实际上是由该中心类创建的,则可以通过将这些对象设为私有来对客户端隐藏这些对象,然后在中心对象中创建存根,以允许客户端调用您允许的函数。

例如(概念代码,可能无法实际编译)

class HiddenSubClass {
  public function MyFunc() {
    echo "hello";
  }
}

class CentralClass {
  private $obj;

  function __construct() {
     $obj=new HiddenSubClass();
  }

  function SubClassMyFunc () {
    $obj->MyFunc();
  }
}

客户端只有 CentralClass 对象,因此只能调用 SubClassMyFunc,而不能调用 MyFunc。这样做的缺点是,这也会对客户端隐藏库的面向对象结构,这可能是可取的,也可能不是。

但是,如果对象是由客户端创建的,然后移交给您的中心类,那么您几乎无法阻止对象的所有者(客户端)对其进行任何操作。客户端可以调用您的中心类可以调用的任何内容。然后,您可能必须将要保护的代码移出所述类 - 进入“帮助类”或中心类本身。

编辑:如果您确实想“破解”它,这将是一种方法(尽管我不推荐它,因为它很臭):

在你的中心班级有一个“秘密”。

class CentralClass {
  private $MySecret=42;

  function IsValidSecret($anumber) {
    return ($anumber==$this->MySecret);   
  } 
}

现在,当中心类在假脱机对象上调用某些“受保护”函数时,可以将 $MySecret 作为参数传递。如果 CentralClass 是单例,则假脱机对象可以调用该单例来检查传递的密钥是否正确。如果 CentralClass 不是单例,您也必须传递该对象。

class MySpooledObject {
  function SuperSecretFunction ($asecret) {
    if (!$CentralSingleton->isValidSecret($asecret)) { die(); }
  }

  function SuperSecretFunction2 ($acentralobject,$asecret) {
    if (!$acentralobject->isValidSecret($asecret)) { die(); }
  }
}

这有很多变化。中心类可以在调用对象的方法之前设置一个内部标志,并在它返回时重置它。在这种情况下,对象可以询问中心类是否设置了该标志,并且不需要传递任何秘密。但是,您仍然需要 $acentralobject,除非它是单例。

于 2013-02-23T18:09:08.700 回答