[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Геттеры и сеттеры
Страницы: 1, 2, 3, 4, 5
twin
Цитата (AllesKlar @ 26.10.2015 - 05:04)
Должна же быть "Золотая середина"

Так об этом Сергей и говорит. И я полностью с этим согласен. Просто дело в том, что бытует мнение, что обращение к свойствам напрямую не есть best practics. Вот chee и засомневался, а действительно ли это так.


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
Цитата (Michael @ 26.10.2015 - 07:59)
Вы для каждого столбца объявляете public св-во?
А как то следите например что не было изменений чтобы при save() не делать update?

Ну вообще надо объявлять паблик свойства, мы либо объявляем, либо нет. Отслеживание изменений происходит при сохранении в БД, но это для функции аудирования(журналирование полей).

Цитата (AllesKlar @ 26.10.2015 - 09:04)
вот тут мы пишем геттеры / сеттеры, для облегчения себе жизни, жизни тех, кто будет проект поддерживать в будущем, уменьшении временных затрат на разработку, экономия средств заказчика.

Это много раз сказано, но где примеры, что это улучшает жизнь. Проблема в том что в большинстве случаев, объекты не сами что-то решают, а мы им указываем. Еще в программах для установки значений в атрибуты сущностей обычно используют гидраторы, а это вообще слабо ложится на технологию сеттеров и геттеров. Геттеры и сеттеры, по моему, для того что бы писать код руками, а не бегать по белым спискам перебрасывая значения из объекта в объект

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
bestxp
немного с другой стороны зайду я ( со стороны проектирования по модели или Domain Driven Desing ) DDD

Какие типы объектов есть вообще?

Mutable Immutable State то есть изменяемые, неизменяемые и объекты с состоянием ( конкретно эти типы тут и рассмотрим )

Первый тип изменяемый ( тот который на протяжении работы программы может меняться как угодно ) то есть

$obj = new AnyClass();
$obj->prop = 123;
-----


$obj->prop = $_POST['prop']

и тд сколько угодно раз

Неизменяемые объекты или Value объекты
$obj = new Currency('RUR');
echo $obj;


или

$sex = new Sex('Male');
echo $sex;


и наконец объекты состояние

$var = new Car('Nissan', 100 /* kilos */, 0 /* km/h */ );
echo $var->getState(); //stayed
$var->addPassenger(new Human('ed', new Sex('male'));
$var->run();
echo $var->getState(); //runned
echo $var->getSpeed(); //250 km/h
echo $var->addPassenger(new Human('Alice', new Sex('Female')); //throws exception you can't add passenger when car is runned


теперь это рассмотрим что к чему на 3ем примере где я собрал все воедино

Итак
Human это изменяемый объект в нашем случае потому что со стороны бюрократии и хирургии Ed может стать Alice и наоборот были бы деньги и желание

Но вот сам пол в нашем случае уже неизменяемый объект, как в случае и пример 2 с валютой потому что нам не нужно менять значение валюты да и смысла нет в этом, если нам нужно будет поменять валюту у товара то мы делаем setCurrency(new Currency('EUR'));

и наконец сама машина по сути некоторые свойства изменяемые, а некоторые нет, причем некоторые меняются сами в зависимости от состояние и некоторые изменяются только на определенных состояниях ( например пассажира добавить только когда стоит, в процессе пути ни убрать не добавить не сможем )

для чего это надо тут геттер и сеттер
для меня тру языком ООП является ObjectiveC поэтому накладывать буду на него и брать примеры

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

class Entry{

protected $id;
protected $createdAt;

function __construnct(){
$this->createdAt = new \DateTime();
}

public function setCreatedAt($createdAt){
if(!($createdAt instanceOf \DateTime)){
$createdAt = new \DateTime($createdAt);
}
$this->createdAt = $createdAt;
return $this;
}
}


Иногда одна модель используется с разным типом хранилища в некоторых случаях для даты вернется объект в некоторых строка, если несколько источников данных то следить за типом лучше внутри и тогда добавляя данные мы можем их попытаться преобразовать к DateTime либо уже получим исключение что строка не является датой

Тут скорее подействует принцип Kiss и Dry чем плодить проверки в каждом хранилище мы это перенесем в этот объект
Бывает бизнес процессы требуют хранить и получать данные как в Api сторонних сервисов, так и в СУРБД или еще NoSQL, например если у вас какой-то сервис по обработке и аггрегации данных с возможностью уведомления ( количество сервисов для сбора данных будет расти, а модель одна )

Dry в действии, а так же замена на публичное грозит тем что либо куча проверок при вставке либо куча преобразований при получении

-------------

Теперь рассмотрим вариант Immutable данных в ObjC это readonly свойства , средствами PHP указать конкретному свойству что оно только для чтения нельзя, для этого приходят геттеры и сеттеры и еще магия

у нас есть массив с readOnly полями которые задаются при создании объекта и потом только для чтения и при попытке изменить получаем Исключение, в случае с публичными мы не можем контролировать изменения что в некоторых случаях может привести к ошибке ( например транзакция на оплату товара в сторонний сервис ) и что бы горе программист который будет работать с вами не изменил данные случайно и потом магазин не продал товар стоимостью 100 USD за 100 RUR

-------------

Прошу прощения если описал слишком не связно и сумбурно, если будут вопросы задавайте ( утро понедельника оно такое для меня )

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.