Задать вопрос
@Pupochkin123

Хороша ли архитектура моего кода? Информация цепляется по API?

подскажите пожалуйста, насколько данный код хорошо организован по принципам инкапсуляции и SOLID? Как его можно улучшить?

<?php

Class Product
{
    public int $product_id;

	public function __construct($product_id)
	{
		$this->product_id = $product_id;
	}

	public function getDetail()
	{
		// Здесь запрос к API который возвращает JSON с информацией о товаре.
	}

	public function getTitle()
	{
		$detail = $this->getDetail();

		return $detail['data']['title'];
	}

	public function getPrice()
	{
		$detail = $this->getDetail();

		return $detail['data']['price'];
	}
}
  • Вопрос задан
  • 135 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
Первое, вы при каждом получении свойства будете лезть в апи, нужно делать подобие кэша
private function getDetail()
 {
    if (!$this->detailCache) { 
        // Здесь запрос к API который возвращает JSON с информацией о товаре.
       $this->detailCache = $data;
    }
 
    return $this->detailCache;
 }

Второе, все свойства должны быть приватными или защищенными
Третье, метод который лезет в апи не должен быть публичным
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Vitsliputsli
Все public, все доступно извне, нет сокрытия.
Прям сам объект куда-то лезет по api, забирает данные, которые сам и предоставляет, обрабатывает ответ, явное нарушение SRP.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Я бы сделал как-то так. Но не претендую на истину в последней инстанции.
spoiler
class API
{
    public function getProduct(int $productId): Product
    {
        $product = $this->request(...); // Получение данных из API
        return Product::from($product)
    {
}

class Product
{
    private int $id;
    private string $title;
    // прочие свойства

    public function getId(): int
    {
        return $this->id;
    }
    
    public function getTitle(): int
    {
        return $this->title;
    }

    // прочие геттеры

    // сеттеры, если нужны
 
    public static function from(object $source): self
    {
        $product = new static();
        $product->id = $source->id;
        $product->title = $source->title;
        // заполнение свойств
        return $product;
    }
}

...
$api = new API($login, $password);
$product = $api->getProduct(325);

Хотя, для современных версий PHP можно описать преобразование из json с помощью атрибутов и сделать трейт с функцией from, которая будет парсить полученный из API объект согласно этим атрибутам. Плюс аналогичный трейт, реализующий JsonSerializable::jsonSerialize по атрибутам.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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