【发布时间】:2015-04-15 04:09:57
【问题描述】:
我有一个相当大的类XYZ,它具有不同的行为,给出了不同的参数。每个参数都应该有一个帮助文本。
由于XYZ 类非常大,我想将所有参数函数封装到argumentManager 类中,并将所有帮助相关函数封装到helpManager 类中。这是可能的,因为它们具有独立于 XYZ 的功能。结果是这样的:
<?php
class ArgumentManager {
// DO NOT CALL
public function addArgument($option, $argumentCount) {
...
}
// Other functions MAY be called by the user
public function isArgumentInList($option) {
...
}
...
}
class HelpManager {
// DO NOT CALL
public function addHelpEntry($option, $helptext) {
...
}
// Other functions MAY be called by the user
public function printHelpPage() {
...
}
...
}
class XYZ {
private $helpManager;
private $argumentManager;
// The user may call everything in there, EXCEPT HelpManager::addHelpEntry, since it must be a created pair by XYZ::addArgumentWithHelp
public function getHelpManager() {
return $this->helpManager;
}
// The user may call everything in there, EXCEPT ArgumentManager::addArgument, since it must be a created pair by XYZ::addArgumentWithHelp
public function getArgumentManager() {
return $this->argumentManager;
}
// Create classes which contain independent functionalities
public function __construct() {
$this->helpManager = new HelpManager();
$this->argumentManager = new ArgumentManager();
}
// Intended usage for creating an argument with help (they should always be a couple)
public function addArgumentWithHelp($option, $helptext, $argumentCount) {
$this->argumentManager->addArgument($option, $argumentCount);
$this->helpManager->addHelpEntry($option, $helptext);
}
// Many other functions of the big class XYZ
.....
}
XYZ 类现在要小得多。
可以通过调用$XYZ->addArgumentWithHelp() 来添加带有帮助文本的参数。
帮助相关的功能相关的功能可以调用e.g.通过$XYZ->getHelpManager()->printHelpPage()。 Argument 相关函数也是如此。
问题是我不希望 $XYZ->getHelpManager()->addHelpEntry() 或 $XYZ->getArgumentManager->addArgument() 被除 XYZ 之外的任何其他人调用,因为我想强制 argumentManager 和 helpManager 都有关于选项。
【问题讨论】:
-
我有点不清楚你想要的结果是什么。您是说要将 argumentManager/helpManager 的调用限制为 XYZ,还是要从类外部隐藏 argumentManager/helpManager 但仍允许 addArgument 方法?还是别的什么?
-
可以调用 $argumentManager 和 $helpManager 中的函数,以便用户可以使用它们。唯一不应调用的函数是我用“DO NOT CALL”标记的函数。它们只能由 XYZ 类调用。在 Delphi 等其他编程语言中,我会将可见性设置为“仅单元”(单元 = 脚本文件)