У меня довольно большой класс XYZ
, который отличается поведением с разными аргументами. Каждый аргумент должен иметь helptext.Инкапсулировать функциональные возможности в классы
Поскольку класс 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
теперь гораздо меньше.
Аргумент с helptext может быть добавлен путем вызова $XYZ->addArgumentWithHelp()
.
Функции, связанные с соответствующими функциями, могут быть вызваны, например, через $XYZ->getHelpManager()->printHelpPage()
. То же самое относится к связанным с Аргументом функциям.
Проблема заключается в том, что я не хочу, чтобы $XYZ->getHelpManager()->addHelpEntry()
или $XYZ->getArgumentManager->addArgument()
называют кем-то другим, кроме XYZ
, так как я хочу, чтобы обеспечить соблюдение, что обоих, argumentManager
и helpManager
имеют информацию о опции.
Немного неясно, для чего вы хотите, чтобы результат был. Вы утверждаете, что хотите ограничить вызов аргументаManager/helpManager XYZ или что вы хотите скрыть аргументManager/helpManager извне класса, но все же разрешить метод addArgument? Или что-то другое? – kellanburket
Функции внутри $ argumentManager и $ helpManager могут быть вызваны, чтобы пользователь мог работать с ними. Единственными функциями, которые не следует вызывать, являются те, которые я обозначил как «НЕ ЗВОНО». Они должны быть вызваны только классом XYZ. В других языках программирования, таких как Delphi, я бы установил видимость только «unit only» (unit = script file) –