Использование генераторов для частных охвата


Там что-то про этот код, что довольно аккуратные-o для меня, но это плохая идея? Есть ли название для программирования такой?

Во-первых, сам генератор:

function makeEntity(?int $id = null, string $type, ?array $props = null) {
    $id = $id ?? random_int(1, 500000);
    $log = function($signal, $message = null, ?string $tmpl = null) use($id) {
        $tmpl = sprintf('Receiver(%d, Signal: %s)', $id, $tmpl ?? '[%s](%s)');
        echo sprintf($tmpl, $signal, \json_encode($message)).PHP_EOL;
    };
    $apply = function($changes, $for) use($log) {
        foreach($changes as $set) {
            $action = array_shift($set); // First one is the method, PropertySet
            list($prop, $value) = $set;
            if (substr($prop, 0, 7) !== 'Stream:') $for[$prop] = $value;
            $log(sprintf('Apply(%s=%s)', $action, \json_encode($set)), null, '%s');
        }
        return $for;
    };
    $changeSet = [
        ['SIGINI', 'Stream:Init', microtime(),],
        ['SIGBND', 'Stream:BindProps', $props,],
    ];

    while (true) {
        list($signal, $message) = yield;
        $signal = preg_replace('/[^a-z\d]/i', '', (string) $signal);
        $log($signal, $message);

        if (substr($signal, 0, 4) === 'prop') {
            $propName = strtolower(substr($signal, 4));
            $changeSet[] = ['PropertySet', $propName, $message];
        }

        if ($signal === 'iterator') {
            $changeSet[] = ['SIGEND', 'Stream:End', microtime(),];
            $_props = $apply($changeSet, $props);
            yield $type => $_props;
        }
    }
}

Вот где, может быть, он получает странные (это удивительно безобидно выглядящий). Как я использую это, чтобы создать маленькое локальное мутатор:

$entity = makeEntity(null, 
    'SuperWidget', [
        'foo' => 'bar',
        'baz' => 'bla',
    ]
);

$entity->send(_m('propBoo', 'hoo'));
$entity->send(_m('propOop', 'Php'));
$entity->send(_m('propBaz', 'Apt'));
$entity->send(_m('propGen', ['Era','Tor',]));

$props = $entity->send(_i());

foreach($props as $prop => $props) {
    echo sprintf('%s(%s=%s)%s', 
        $entity->key(), 
        $prop, 
        \json_encode($props), 
        PHP_EOL
    );
}

https://3v4l.org/4l9OR

Это когда вы видите выход, что вы (возможно?) сделать это. Одна вещь, у меня память на изменения, так что, глядя на изменения, как они применяются в конце, мы получим полный отчет в каждом:

Receiver(99797, Signal: [propBoo]("hoo"))
Receiver(99797, Signal: [propOop]("Php"))
Receiver(99797, Signal: [propBaz]("Apt"))
Receiver(99797, Signal: [propGen](["Era","Tor"]))
Receiver(99797, Signal: [iterator](null))
Receiver(99797, Signal: Apply(SIGINI=["Stream:Init","0.00772100 1520751351"]))
Receiver(99797, Signal: Apply(SIGBND=["Stream:BindProps",{"foo":"bar","baz":"bla"}]))
Receiver(99797, Signal: Apply(PropertySet=["boo","hoo"]))
Receiver(99797, Signal: Apply(PropertySet=["oop","Php"]))
Receiver(99797, Signal: Apply(PropertySet=["baz","Apt"]))
Receiver(99797, Signal: Apply(PropertySet=["gen",["Era","Tor"]]))
Receiver(99797, Signal: Apply(SIGEND=["Stream:End","0.00810400 1520751351"]))
SuperWidget(foo="bar")
SuperWidget(baz="Apt")
SuperWidget(boo="hoo")
SuperWidget(oop="Php")
SuperWidget(gen=["Era","Tor"])

Также обратите внимание, как Stream изменить поток в

Так она заканчивается чувство, как маленький изначально-поддерживается сообщение какой-то, с собственным (эксплуатационные, управляема) внутреннее состояние.

У меня есть пара других, наверное, извращенец идеи о злоупотреблении yield:



99
0
задан 11 марта 2018 в 06:03 Источник Поделиться
Комментарии