Как создавать объект с большим количеством свойств? Привет.
Для иллюстрации вопроса я приведу сферический пример в вакууме.
Есть класс, задача которого - записывать данные о продукте в файл. Метод write() принимает в качестве параметра объект класса Product и уверен, что в объекте есть нужные свойства.Class ProductWriter
{
public function write(Product $product)
{
// write to file
}
}
Product имеет много свойств (порядка 20): название, описание, цена, размер, цвет, форма и т.д. и т.п. Причем часть свойств - обязательна, часть - опциональна.
Как оптимально написать класс Product?
Мои варианты:
1) Конструктор класса Product принимает ассоциативный массив параметров. В конструкторе проверяется наличие обязательных полей. Мне кажется этот способ не самым лучшим: клиентский код не знает, какие ключи должны присутствовать во входном массиве.
2) Создать кучу свойств и геттеров/сеттеров для них:Class Product
{
private $name;
private $price;
// ...
public function setName() {}
public function setPrice() {}
// ...
public function getName() {}
public function getPrice() {}
// ...
}
Но опять же - откуда клиентскому коду знать, что после создания объекта нужно обязательно вызвать некоторые сеттеры?$product = new Product();
$product->setName('name');
$product->setPrice('0.0');
3) Ну и самый треш - конструктор с 20 параметрами:Class Product
{
function __construct($name, $price, $color, $size, ....)
{
}
}
Так, конечно, клиенсткий код точно укажет все обязательные поля. Но так делать не стоит, в книжках написано))
Если говорить о вариантах №1 и №2: на самом деле этим классом никто кроме меня самого пользоваться не будет. А я то точно знаю, что нужно заполнить о продукта. Но хотелось бы решить задачу "красиво".PS. Предвижу комментарии в духе: почему один общий класс продукт? Создай подклассы только с нужными свойствами и будет тебе счастье.
На это отвечу, что мой пример с продуктом - условный. В моем случае действительно сущность с кучей свойств, от которой нельзя ничего унаследовать и разбить на более простые сущности.

21 Авг 2019 в 06:20
263 +1
0
Ответы
1

В данной ситуации, я бы предложил использовать комбинацию вариантов №1 и №2.

Вы можете создать класс Product с приватными свойствами для каждого параметра продукта и публичными сеттерами и геттерами для работы с этими свойствами. Таким образом, у вас будет возможность контролировать значения каждого свойства и предоставить клиентскому коду удобный интерфейс для работы с объектом Product.

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

Таким образом, у вас будет возможность создавать объекты класса Product с различными наборами свойств, контролировать их значения и обеспечить удобство использования для клиентского кода.

20 Апр 2024 в 13:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир