Привет.
Для иллюстрации вопроса я приведу сферический пример в вакууме.
Есть класс, задача которого - записывать данные о продукте в файл. Метод 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. Предвижу комментарии в духе: почему один общий класс продукт? Создай подклассы только с нужными свойствами и будет тебе счастье.
На это отвечу, что мой пример с продуктом - условный. В моем случае действительно сущность с кучей свойств, от которой нельзя ничего унаследовать и разбить на более простые сущности.