0
class HueHue {
    private $hue;

    public function show(){
        echo $this->hue;
    }

    public static function parse($string){
        // parse it all
        $HueHue = new HueHue();
        $reflector = new ReflectionClass($HueHue);
        $hue = $reflector->getProperty('hue');
        $hue->setAccessible(true);
        $hue->setValue($HueHue, $parsed_string);
    }
}

这是“坏”吗?我真的更喜欢这个而不是制作一个public function setHue($parsed_string),并且 parse() 必须是静态的,因为我讨厌这样做new然后设置和获取......

最终的游戏是公正的HueHue::parse('something here')->show();,我真的不想private $hue被设置。

任何反馈表示赞赏。

4

2 回答 2

5

这是“坏”吗?

的所作所为还不错。这不是世界上最干净的东西,但同时如果它解决了问题,那就太好了。不过,我会进行@Xeoncross 的修改,因为它更干净并且避免了反射。

但是,我认为你为什么这样做不好的。

如果您制作一个对象只是为了格式化一个字符串以供输出,您可能需要重新考虑为什么首先要使用一个对象。如果您的大多数用途是:

HueHue::parse($hue)->show();

那么为什么不只创建一个跳过对象步骤的函数呢?

function parseHue($hue) {
    // parse it
    return $parsed_hue;
}

然后使用:

echo parseHue($hue);

或者,如果您出于某种原因需要值对象(您的问题中没有说明),则将解析器拆分为一个单独的对象,并使队列成为构造函数参数。

class Hue {
    private $hue;
    public function __construct($hue) {
        $this->hue = $hue;
    }
    public function show() {
        echo $this->hue;
    }
}

class HueParser {
    public function parse($string) {
        // parse it!
        return new Hue($parsed_hue);
    }
}

解耦的原因是您现在可以多态地切换出解析器。因此,您对解析器使用者的单元测试可以将其换成模拟。

更不用说它保持适当的关注点分离,所以如果你想更新解析器逻辑(例如考虑一种新格式),你可以在不改变消费者(调用解析器的人)或最终用户(获得 Hue 对象的人)...

于 2013-04-22T14:03:28.023 回答
1

如果是同一类,则不需要反思。

class HueHue {
    private $hue;

    public function show(){
        echo $this->hue;
    }

    public static function parse($string)
    {
        $HueHue = new Static();
        $HueHue->hue = $string;
        return $HueHue;
    }
}

HueHue::parse($hue)->show();
于 2013-04-22T13:43:24.640 回答