0 / 0 / 0
Регистрация: 27.04.2019
Сообщений: 22
1

Как хранить такие объекты?

08.04.2020, 13:30. Показов 795. Ответов 3

Author24 — интернет-сервис помощи студентам
С некого источника, получаю список контрагентов.
Для дальнейшей работы с этими контрагентами, хочу завести сущность Контрагент - Couterparty.

Столкнулся с такой, архитектурной проблемой:

Список контрагентов приходят в XML, сами контрагенты имеют сырые данные,
примерно 50 свойств, такого формата:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<counterparties>
 
    <couterparty>
        <name>Василий Вася Васильевич</name>
        <status>2</status> <!-- 1 - Активен, 2 - Отключен -->
        <form>le</form> <!-- le - Юр. лицо, ip - Индивидуальный предприниматель -->
        <price_category>opt</price_category> <!-- opt - Оптовая, rrc - Розничная, prt - Партнерская -->
        ...
    </couterparty>
 
    ...
 
</counterparties>
т.е. значения многих свойств - это ключи.

Жестко зашивать в код соответствия ключей и из значений - не совсем правильно.
В любой момент, может добавить например новый статус контрагента, и должно быть удобно,
быстро назначить соответствие кода статуса и его значения.

Скорее всего нужен какой-то конфигурационный файл, в обычном php массиве.

После парсинга xml файла, все эти свойства, я загружаю в сущность Контрагента - Couterparty,
в котором также, будут сырые данные, т.к. значения не всегда нужны.

Но, хочется сделать так, чтобы при вызове геттера любого свойства, возвращался объект, с кодом и значением свойства (возможно, это ValueObject или DTO ?).

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

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// базовый класс, наследники которого - это свойства, 
// с соответствиями ключей и значений - нужно реализовать метод getCodeValues 
abstract class DataValue {
 
  private $values = [];
  private $code;
 
  public function __construct(string $code) {
    $this->code = $code;
    $this->values = $this->getCodeValues();
  }
 
  public function getValue() {
    return $this->values[$this->code] ?? null;
  }
 
  public function getCode(): string {
    return $this->code;
  }
 
  abstract public function getCodeValues(): array;
 
}
 
// пример для свойства status
class CounterpartyStatus extends DataValue {
  public function getCodeValues(): array {
    return [
      "ip" => "Индивидуальный предприниматель",
      "le" => "Юр. лицо"
    ];
  }
}
 
 
class Counterparty {
 
  private $status;
  // ...
 
  public function __construct(string $statusCode) {
    $this->status = new CounterpartyStatus($statusCode);
  }
 
  public function getStatus(): DataValue {
    return $this->status;
  }
 
}
 
$counterparty = new Counterparty("le");
$counterparty->getStatus()->getValue();
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2020, 13:30
Ответы с готовыми решениями:

Можно ли в куки или в сессиях хранить объекты
Можно ли в куки или в сессиях хранить объекты классов? И если да, то как? Заранее спасибо!

Как хранить объекты разных классов в одном контейнере
Здравствуйте! Хочу реализовать хранение разных классов(базовый и наследник) в одном контейнере....

Как хранить объекты в игре наподобии Doodle Jump
Здравствуйте, пишу курсовую работу: игру Doodle Jump. Использую C# и OpenGL. Появилась проблема:...

Как заставить std::set хранить объекты пользовательского типа?
Здравствуйте. Как заставить set хранить объекты некоторого класса или структуры? #include...

3
2227 / 1274 / 609
Регистрация: 23.08.2015
Сообщений: 3,222
09.04.2020, 19:14 2
SystemException, Это больше похоже на ValueObject
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
 
class Form
{
    const LEGAL = 'le';
    const INDIVIDUAL = 'ip';
 
    private $value;
 
    public function __construct(string $value)
    {
        if (!in_array($value, array_keys(self::getList()))) {
            throw new DomainException('Неверный тип');
        }
        $this->value = $value;
    }
 
    public function getValue()
    {
        return $this->value;
    }
 
    public function getName()
    {
        return self::getList()[$this->value];
    }
 
    public static function getList()
    {
        return [
            self::LEGAL => 'Юр. лицо',
            self::INDIVIDUAL => 'Индивидуальный предприниматель',
        ];
    }
}
 
class Couterparty
{
    private $form;
 
    public function __construct(Form $form)
    {
        $this->form = $form;
    }
}
 
$couterparty = new Couterparty(new Form(Form::LEGAL));
Добавлено через 6 минут
И тут не нужны никакие наследования.
1
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
12.04.2020, 21:07 3
Выглядит жутко

Я бы выделил два класса:
1) Сущность - простейший класс с геттерами. Ничего не знает об источнике данных.
2) Фабрика - умеет создавать сущность. Для каждого источника можно сделать отдельную фабрику. В простых случаях можно обойтись фабричным методом.
1
0 / 0 / 0
Регистрация: 27.04.2019
Сообщений: 22
12.04.2020, 21:30  [ТС] 4
с константами конечно хардкорно выглядит))

будет примерно 150 констант, при этом каждый раз, когда будет появляться новое значение, надо лезь в класс, и добавлять константу + пару строк кода в бизнес логику.

@sad67man, @tarasalk - спасибо.

Решил задачу таким образом:

Сущность контрагента - Couterparty (с простыми геттерами, без логики)
Сущность - CouterpartyDataMapping (
⠀⠀⠀с единственным методом getDataMapping,
⠀⠀⠀который возвращает массив соответствий всех свойств, значений и т.д.
)
Сущность - CouterpartyDataTransformer (сущность в конструктор получает сущность Couterparty и CouterpartyDataMapping, дальше все данные преобразует в соответствии с данными в маппинге)

Не знаю на сколько правильно с точки зрения архитектуры, но задачу решает, и проблем не вижу..
0
12.04.2020, 21:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2020, 21:30
Помогаю со студенческими работами здесь

Как хранить ссылки на объекты на протяжении жизни всего клиента?
Всем привет =) Предположим у меня есть вид / база, к которому пользователь часто обращается, пока...

Можно хранить объекты на диске?
Можно хранить объекты на диске и при необходимости восстановить с диска? Например, есть объект...

POJO может хранить объекты?
Привет всем! Столкнулся с такой проблемой. Разрабатываю учебное вебприложение. Сделал классы POJO и...

Обобщённая реализация позволяющая хранить объекты
Здравствуйте. Реализована множество целых чисел ввиде класс (элементы не повторяются) + сделана...

В каком STL-контейнере лучше хранить объекты?
Есть класс, реализующий адреса class address { ... } Поискал в сети увидел 3 варианта...

Где хранить объекты во время выполнения программы?
Вопрос довольно странный наверное для тех кто в Java давно. Поиск дает только предложения типа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru