Как создавать объект с большим количеством свойств? Привет.
Для иллюстрации вопроса я приведу сферический пример в вакууме.
Есть класс, задача которого - записывать данные о продукте в файл. Метод 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
228 +1
0
Ответы
1

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

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

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

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

20 Апр в 13:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 718 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир