@OnlyMyQuestion

Как реализовать интерфейс структуры после синтаксического анализа строки?

Добрый день. Хочу реализовать слабую связанность между компонентами: Parser, Service.
Parser - парсит входную строку и преобразовывает ее в структуру, с которой по интерфейсу могут работать разные Service, некоторые - будут на основе входных данных будут выводить информацию в разных форматах, некоторые - производить какие-либо расчеты и.т.д.
Структура, полученная парсером состоит из элементов трех типов:
- Collection (Может содержать другие Collection, Element1, Element2)
- Element1
- Element2

Каждый тип - имеет разные свойства и методы:
Collection
- getChilds()
- getOprion()

Element1
- getOprion2()
- isOption3()

Element3
- getOprion4()

Сначала думал использовать Composite, но в данном случае этот вариант не подходит, для реализации разной логики - нужно реализовывать разные классы сущностей наследующие интерфейс, но данный вариант не гибок, и все-таки хочется разграничить, чтобы структура отдаваемая Parser не имела логики, а все действия происходили в отдельных Service.

На ум приходит лишь вариант такого типа:

<?php

interface Parser
{
    public function parse(string $input): Collection;
}

interface Collection
{
    /**
     * @return (Collection|Element1|Element2)[]
     */
    public function getChildren(): array;
    public function getOption(): bool;
}

interface Element1
{
    public function getOption1(): bool;
}

interface Element2
{
    public function getOption2(): string;
    public function getOption3(): string;
}

class Service
{
    public function do(Collection $collection)
    {
        foreach ($collection->getChildren() as $child){
            if($child instanceof Collection){
                //...
            }

            if($child instanceof Element1){
                //...
            }

            if($child instanceof Element2){
                //...
            }
        }
    }
}


На сколько данный вариант имеет место? В какую сторону еще можно посмотреть?
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы