Заполнение 18 параметров в любой функции - это плохо (включая конструктор). Вы никогда не будете помнить правильный порядок, когда будете смотреть свой код через несколько месяцев или даже несколько дней. Еще больше, как вы уже поняли, когда вам нужно расширить класс, это сложно.
Вот почему я обычно предпочитаю проводить занятия с геттерами и сеттерами. Да, это больше печатать, но с помощью getter и setters пользователи могут легко увидеть, какие свойства они могут получить и установить, плюс getter и setters удобны для автозаполнения IDE.
Теперь, следующая проблема: вы не хотите постоянно вызывать сеттеры, когда читаете существующую запись из базы данных? Вы сказали, что у вас класс Loader
, вы не можете просто централизовать все вызовы сеттеров в классе Loder
?
class Loader{
public function getMyObject(){
$dbData = $this->getDataFromDB();
$myObj = $this->createMyObjectFromDbData($dbData);
return $myObj;
}
private createMyObjectFromDbData($dbData){
$myObj = new MyObject();
/* 18 setter calls */
return $myObj;
}
}
Поэтому, когда вы хотите работать с существующим, вы можете просто позвонить Loader.getMyObject();
Если вам не хочется набирать все 18 вызовов сеттера в createMyObjectFromDbData
, тогда, пока ваш сеттер следует некоторому соглашению по именованию, вы можете сделать
for ($dbData as $columnName => $columnValue){
$propertyName = $columnName;
$propertyValue = $columnValue;
$myObj->set{$columnName}($propertyValue); /* you can't do this in java */
}
Возможно, вы также захотите добавить метод validate
для проверки всех свойств объекта, чтобы вы могли вызывать этот метод перед отправкой для вставки в базу данных.