【发布时间】:2014-02-26 19:31:00
【问题描述】:
我必须承认,我不知道我的设计模式是否存在问题、过度思考甚至可能只是类命名,所以欢迎任何建议。这一定是一个简单的问题,但我什至很难用语言来解释它(语言障碍),所以我会尝试用代码来做。
例如我正在尝试逐字节迭代网络数据流(该任务与问题完全无关,只是为了更好地解释伪代码,请不要说我使用了错误的工具来做到这一点) .基类看起来像这样:
class BaseNetworkIterator implements Iterator {
protected $stream;
protected $currentByte;
public function __construct() {
$this->stream = open_network_stream();
}
/** .... * */
public function next() {
$this->currentByte = $this->stream->getByte();
}
public function current() {
return $this->currentByte;
}
}
现在想象一下,这个类中的逻辑本身就很复杂(每个方法不是一行,还有更多的辅助方法),但我需要做的更多。例如,我需要在每个字节中反转位顺序。我不想在基类中包含这个逻辑,因为它已经很大了,所以我扩展了它:
class ReverseByte extends BaseNetworkIterator {
/** .... * */
public function next() {
parent::next();
$this->currentByte = $this->reverseStreamByte($this->currentByte);
}
protected function reverseStreamByte($byte) {
/** .... * */
}
}
此外,我想完全跳过此流中的所有换行符(反转):
class SkipNewLine extends ReverseByte {
/** .... * */
public function next() {
do {
parent::next();
} while ($this->currentByte === "\n");
}
}
如果我们得到两个连续的字节(在所有这些操作之后 - 它们可能被换行符等分隔)等于“否”,那么我们必须再次反转一个后续字节(不要想它:只是一些东西使用所有先前的逻辑和在先前类之一中定义的受保护方法):
class HandleDoubleReverseKeyword extends SkipNewLine {
const DOUBLE_REVERSE_KEYWORD = 'NO';
/** .... * */
public function next() {
parent::next();
if ($this->getTwoCharsCache() === self::DOUBLE_REVERSE_KEYWORD) {
$this->currentByte = $this->reverseStreamByte($this->currentByte);
$this->clearTwoCharsCache();
} else {
$this->saveMaxTwoCharsCache($this->currentByte);
}
}
private function saveMaxTwoCharsCache($newChar) {
/** .... * */
}
private function getTwoCharsCache() {
/** .... * */
}
private function clearTwoCharsCache() {
/** .... * */
}
}
现在,虽然逻辑在类之间被很好地划分为我的口味(每个连续的类做一些完全不同和孤立的事情,很容易看出每一层做了什么),但处理起来很乱。如果我们在中间添加新的“过滤器”,我们必须更改后面的类扩展的内容......命名开始变得疯狂,因为“HandleDoubleReverseKeyword”甚至远程无法解释这个类的真正作用(即使我们在“NetworkIterator “命名空间)。我真的不明白“最终”课程应该是什么样子。
我正在考虑使用特征,因为在那里命名更容易,但它们会导致更多问题然后解决(执行顺序、代码完成等)。
我也在考虑使用类似 Yii 的“行为/事件”模式(类似于:base next() 方法连续调用一个类/方法数组,并且一些外部源可以向该数组添加更多类/方法,而不是扩展基类)但是属性/方法的可见性存在很大问题(这是一个问题,基本上我必须公开所有属性和方法),更重要的是不清楚如何正确访问其他附加类的方法。
好的,这可能还不是很清楚,因此感谢任何反馈。我知道这个“问题”中没有问号,但我希望我的意图是明确的,唯一想到的是:如何正确地进行这种设计?
【问题讨论】:
标签: php oop design-patterns inheritance overriding