
Sergey
18.03.2018
17:11:18
@fes0r за сеттером может скрываться более сложная логика. Допустим есть у меня объект расписания (типа с понедельника по четверг с 10:00 до 20:00, пятница с 10 до 17:00, суббота, воскресение - выходной). И по этой "маске", нужно сгенерировать расписание на год. Естественно, это удобнее всего спрятать за сеттером расписания. Ну вот он вроде бы просто сеттер, а логика в нем есть. Почему именно сеттер? Ну потому, что гидратор через них работает. Зачем вообще гидратор? Потому, что я получаю с бэка модели, как-то их изменяю, и в том же виде отправляю назад.
как только у тебя "за сеттером" может скрываться более сложная логика - он перестает быть сеттером и становится просто херово названным методом, нет?
> Естественно, это удобнее всего спрятать за сеттером расписания.
а я просто возвращаю итератор)
$slots = $schedule->availableSlots()
foreach ($slots as $slot) {
// делаем дела
}

Konstantin
18.03.2018
17:13:20
без гет как то нипанятна

Google

Greabock
18.03.2018
17:13:22
Ага, удачи тебе форычем по битовой маске гулять )

Sergey
18.03.2018
17:13:52

Alan
18.03.2018
17:14:07
@fes0r за сеттером может скрываться более сложная логика. Допустим есть у меня объект расписания (типа с понедельника по четверг с 10:00 до 20:00, пятница с 10 до 17:00, суббота, воскресение - выходной). И по этой "маске", нужно сгенерировать расписание на год. Естественно, это удобнее всего спрятать за сеттером расписания. Ну вот он вроде бы просто сеттер, а логика в нем есть. Почему именно сеттер? Ну потому, что гидратор через них работает. Зачем вообще гидратор? Потому, что я получаю с бэка модели, как-то их изменяю, и в том же виде отправляю назад.
чет не пойму причем тут гидратор
это же сериализация/десериализация не?

Sergey
18.03.2018
17:14:10
может быть вся проблема в том как именно ты организовал рассписание?)
если что - у меня под рукой (в моем проекте) есть некие "штуки" у которых есть рассписание работы, и я в них "скеджелю" какие-то вещи

Vladislav
18.03.2018
17:15:17
ну я бы засунул штуку с битовой маской куда-то в сервис какой-то
но не в сущность
в сеттер

Sergey
18.03.2018
17:15:21
и у меня нет "бинарных масок"

Vladislav
18.03.2018
17:15:36
ну вот для расписания они хороши) все осхраняешь в одном поле.

Sergey
18.03.2018
17:15:49
@fes0r за сеттером может скрываться более сложная логика. Допустим есть у меня объект расписания (типа с понедельника по четверг с 10:00 до 20:00, пятница с 10 до 17:00, суббота, воскресение - выходной). И по этой "маске", нужно сгенерировать расписание на год. Естественно, это удобнее всего спрятать за сеттером расписания. Ну вот он вроде бы просто сеттер, а логика в нем есть. Почему именно сеттер? Ну потому, что гидратор через них работает. Зачем вообще гидратор? Потому, что я получаю с бэка модели, как-то их изменяю, и в том же виде отправляю назад.
короч - формализуй задачу с точки зрения пользователей опуская технические детали
и я могу попробовать ее решить)

Google

Sergey
18.03.2018
17:17:07
и у меня нет никаких сеттеров и прочей чуши для этого. Поменялось рассписание - новый инстанс Schedule
p.s. пока ты подтверждаешь смешание понятия "сеттер" и "просто метод" + подтверждаешь цитатами про graphql влияние UI на то как ты производишь декомпозицию))

Konstantin
18.03.2018
17:19:09
блин почему я тут вижу лишь бунт против конвенции
что со мной не так

Sergey
18.03.2018
17:19:24

Konstantin
18.03.2018
17:19:39
конвенция гет получает данные объекта, сет устанавливает
дальше знать не обязательно че и как там внутри - берется из поля или вычисляется

f4rt~
18.03.2018
17:19:53

Konstantin
18.03.2018
17:20:16
хм )

Sergey
18.03.2018
17:20:26
не могу сказать что это что-то "меньшее"

Alan
18.03.2018
17:20:35
можт лучше не сеттерыгеттеры обсуждать тогда а анемичные и рич модели ?)
а то все на нейминг сводится

Sergey
18.03.2018
17:20:42

Konstantin
18.03.2018
17:20:55
нэйминг это вторая сложная проблема программирования
почему бы не уделить ей достаточно времени )

Sergey
18.03.2018
17:21:04
а еще можно только с позиции связанности кода обсуждать какахи

f4rt~
18.03.2018
17:21:11

Sergey
18.03.2018
17:21:27

Google

Alan
18.03.2018
17:21:41
ну если говорить за анемию и рич модели то теперь можно дать ссылку на доку доктрины где рекомендуют))
про связанность надо гуглить идти

Sergey
18.03.2018
17:22:00
есть объект, у него внутри какие-то данные, и этот объект предоставляет тебе какие-то методы что бы объект мог с этими данными что-то сделать. Важный момент - ты данные напрямую не трогаешь.
если у тебя внутри объекта данные, и методы трогают не все эти данные а каждый метод трогает только какую-то часть данных, причем ты явно можешь разделить на группы - имеет смысл разделить сам объект на отдельный объекты что бы данные которые нужны месте были вместе
дальше идут более сложные кейсы когда у тебя например есть 3 поля, и 2 метода, и каждому из этих методов нужны 2 поля, то есть есть неполное пересечение
и тут уже надо разбираться почему так вышло, можно ли от этого уйти....
если нельзя то что делать...
это все про инкапсуляцию (проведение границ по сути, границы "капсул"), декомпозицию, абстракцию и т.д.


Konstantin
18.03.2018
17:25:03
слушай у меня есть дурацкий вопрос. смотри какое дело.
есть User; private $firstName; private $lastName;
метод setFullName($fullName){
$e = explode(" ", $fullName, 2);
$this->firstName = $e[0]; $this->lastName=$e[1];
}
будет считаться сеттером?
или есть более удачное название для установки имени к юзеру

f4rt~
18.03.2018
17:25:33
какая-то глупость

Konstantin
18.03.2018
17:26:01

Sergey
18.03.2018
17:26:21
я бы сделал так:
class Name {
private $first;
private $last;
private function __construct(string $firstName, string $lastName) {
$this->first = $firstName;
$this->last = $lastName;
}
public static function fromString(strign $fullName) {
$parts = explode(" ", $fullName, 2);
return new self($parts[0], $parts[1]);
}
}
и делай себе
$user->setName(Name::fromString('Alan Kay'));

Konstantin
18.03.2018
17:27:24
и че потом опять его делать persist ?

Sergey
18.03.2018
17:27:35

Konstantin
18.03.2018
17:28:25
т.е. мне прям необходимо завести отдельный объект для этого
и все усложнить на пустом месте? )

Google

Alan
18.03.2018
17:28:50
сервис заведи и менеджер )))

Greabock
18.03.2018
17:28:57
ui никак не влияет. Это просто подход. Я не ввожу "какие-то-там-данные". Я получаю с бэка модели, модифицирую их на фронте, отправляю их назад в том же виде, в каком получил. Это очень ускоряет разработку. Вот и всё. Если что-то добавилось, какие-то события возникли или, что-то еще случилось, всё это обрабатывается в сеттерах.
Вся логика сводится к
$hydrator->hydrate(Model::class, $data);
$em->flush();В гидраторе уже есть резолверы, которые могут вытащить модели из базы или создать новые модели, в зависимости от того, представлен ли идентификатор(ы).
Валидация примитивов происходит на уровне graphql.
Сложные проверки - в сеттерах.
Может не очень хорошее для них название. Но они такие, да.

Sergey
18.03.2018
17:29:22
и все усложнить на пустом месте? )
а где усложнение? маленький простой изолированный объект, его можно потестить отдельно (потому что в реальности у тебя не так все просто может быть))

Konstantin
18.03.2018
17:29:42
для одного метода нужен один дополнительный объект

f4rt~
18.03.2018
17:29:54

Konstantin
18.03.2018
17:29:59
и для 10 разных энтити с 5 методами надо хм 50 промежуточных объектов

Sergey
18.03.2018
17:30:01
ui никак не влияет. Это просто подход. Я не ввожу "какие-то-там-данные". Я получаю с бэка модели, модифицирую их на фронте, отправляю их назад в том же виде, в каком получил. Это очень ускоряет разработку. Вот и всё. Если что-то добавилось, какие-то события возникли или, что-то еще случилось, всё это обрабатывается в сеттерах.
Вся логика сводится к
$hydrator->hydrate(Model::class, $data);
$em->flush();В гидраторе уже есть резолверы, которые могут вытащить модели из базы или создать новые модели, в зависимости от того, представлен ли идентификатор(ы).
Валидация примитивов происходит на уровне graphql.
Сложные проверки - в сеттерах.
Может не очень хорошее для них название. Но они такие, да.
то есть ты юзаешь "гидраторы" для "замены стэйта объектов"?

Konstantin
18.03.2018
17:30:08

Alan
18.03.2018
17:30:34
зачем классы, 10 разных процедур!)

Sergey
18.03.2018
17:30:45

Admin
ERROR: S client not available

Konstantin
18.03.2018
17:30:57
это уже ооп ради ооп приправленое сверху иммутабельным соусом

Sergey
18.03.2018
17:31:03
ты пробовал?
вот честно, ты просто отвергаешь, это не критический взгляд на вещи
ты пытаешься доказать свою точку зрения
не пытаясь даже ее проверить
это не "силвер булет"

Konstantin
18.03.2018
17:31:48
пытаюсь выяснить зачем делать больше работы если можно делать меньше работы
я ленивый

Google

f4rt~
18.03.2018
17:32:04

Sergey
18.03.2018
17:32:05
(но думать придется больше конечно, а думать больно да)))

Konstantin
18.03.2018
17:32:40
работы печатания или работы какой? придумать, назвать, найти место куда это все положить.

Alan
18.03.2018
17:32:47
меньше работы это когда меньше букв?) или реже ломается, или легче тестируется?

Konstantin
18.03.2018
17:32:51
приходит другой человек на проект и начинает изучать все 100500 промежуточных классов )

f4rt~
18.03.2018
17:32:53
и ты можешь делать вещи просто, в том случае если их нужно сделать на раз и забыть, но по итогу если тебя попросят поддерживать твое решение дальше, ты будешь делать больше работы по итогу

Sergey
18.03.2018
17:33:13
только не CRUD

Alan
18.03.2018
17:33:20

Konstantin
18.03.2018
17:33:37
не, прям зашел в папку а там 50 мелких классов по 2 параметра

Sergey
18.03.2018
17:33:44

f4rt~
18.03.2018
17:33:50
сложно понять, да

Sergey
18.03.2018
17:34:06

Konstantin
18.03.2018
17:34:27
ну, я понял вашу позицию

Sergey
18.03.2018
17:34:30
и попробуй спроецировать прочитанное на свой опыт

Konstantin
18.03.2018
17:34:32
к сведению принял )

Sergey
18.03.2018
17:34:40

Alan
18.03.2018
17:34:46

Konstantin
18.03.2018
17:34:49
не сомневайся. нельзя сомневаться )

Sergey
18.03.2018
17:35:03