fizzbuzz問題をなるべく冗長に解いてみた

fizzbuzzの話が何年か前に流行した時には、1linerでかっこよくってのが中心だったような気がする。マイナーな言語で書くっていうのもあった。
ここでは、冗長な言語 PHPで、肥満コードwを書いてみた。

<?php
class fizzbuzz extends ArrayObject
{
    protected $_delimiter = "\n";
    protected $_fizzbuzz = array();
    public static function getInstance($start, $end, $step = 1)
    {
        $array = range((int) $start, (int) $end, (int) $step);
        return new self(array_combine($array, $array), ArrayObject::ARRAY_AS_PROPS);
    }
    public function output($raw = false)
    {
        array_map(array($this, 'printIt'), $raw ? $this->getArrayCopy() : $this->getFizzbuzzArray());
        return $this;
    }
    public function getIterator($raw = false)
    {
        return $raw ? parent::getIterator() : new ArrayIterator($this->getFizzbuzzArray());
    }
    public function printIt($data)
    {
        return print($this->templateIt($data));
    }
    public function templateIt($data)
    {
        return $data . $this->_delimiter;
    }
    public function getFizzbuzzArray()
    {
        return array_combine(array_keys($this->getArrayCopy()), array_map(array($this, 'offsetGet'),  array_keys($this->getArrayCopy())));
    }
    public function apply(array $fizzbuzz, $clear = false)
    {
        $this->_fizzbuzz = $clear ? $fizzbuzz : array_merge($this->_fizzbuzz, $fizzbuzz);
        return $this;
    }
    public function fizzbuzzIt($fizzbuzzKey, $val)
    {
        return $val % $fizzbuzzKey == 0 ? $this->_fizzbuzz[$fizzbuzzKey]: '';
    }
    public function offsetGet($index)
    {
        if (parent::offsetExists($index)) {
            $val = parent::offsetGet($index);
            $target = array_keys($this->_fizzbuzz);
            $string = implode('', array_map(array($this, 'fizzbuzzIt'), $target, array_fill(0, count($target), $val)));
            return empty($string) ? (string) $val : $string;
        } else {
            return null;
        }
    }
    public function __toString()
    {
        return implode($this->_delimiter, $this->getFizzbuzzArray());
    }
}

使い方

<?php
fizzbuzz::getInstance(1, 100) -> apply(array(3=>'Fizz', 5 => 'Buzz'), true)->output();
<?php
$ite = fizzbuzz::getInstance(1, 100) -> apply(array(3=>'Fizz', 5 => 'Buzz'), true)->getIterator();
while ($ite->valid()) {
    echo $ite->current() , "\n";
    $ite->next();
}
<?php
//特定の要素がほしいとき
$fz = fizzbuzz::getInstance(1, 100) -> apply(array(3=>'Fizz', 5 => 'Buzz'), true);
echo $fz[15];
<?php
//配列を取得したいとき
 $fizzbuzzArray = fizzbuzz::getInstance(1,100) -> apply(array(3=>'Fizz', 5 => 'Buzz'), true)->getFizzbuzzArray();
<?php
//オブジェクト指向っぽいアプローチ
$fz =  fizzbuzz::getInstance(1, 100);
$fz->apply(array(3 =>'Fizz'), true);
$fz->apply(array(5 => 'Buzz'), false);
$fz->apply(array(2 => '偶数'), false);
echo $fz[30];