
Artem
15.06.2017
12:42:26
ну например, когда тебе надо расширить уже существующую либу)
я так понял у Романа как раз таки такая задача и стоит

Алексей
15.06.2017
12:42:50
приведи пример когда нужно
Когда уже есть готовый класс и разраб не посчитал нужным его сделать абстрактым.
Калькулятор доставки такой встречался . Разраб думал, что изменения ни к чему, но на деле они нам потребовались для частного случая доставки в непредусмотренное заранее местечко. Вместо дублирвоания класса просто переопределили один метод

Artem
15.06.2017
12:43:19
ну хотя это наверное и плохой подход

Google

Artem
15.06.2017
12:43:23
но иначе никак)

Adel
15.06.2017
12:43:43
ну понятно. единственный кеейс. как я сказал. ктото написал плохой код и надо с этим жить :)
нарушенный принцип OpenClosed

dypa
15.06.2017
12:44:43

Алексей
15.06.2017
12:44:45

Adel
15.06.2017
12:45:07
зависит от того, кто повседневно работает )
чащ евсего прходится работать со своим кодом )

dypa
15.06.2017
12:45:58
чтобы долго не писать - вот вам https://ocramius.github.io/blog/when-to-declare-classes-final/

Adel
15.06.2017
12:46:33
Вооот
чувак правильно пишет
класс должен быть abstract или final
лови 5 Марко )

Google

dypa
15.06.2017
12:47:41

Adel
15.06.2017
12:49:27
)))
Просто народ думает, что надо давать как можно больше свобооды. Меньше ограничений. Но ограничения это хорошо!

dypa
15.06.2017
12:50:24
правда у @chebotarevp подгорает от того что в doctrine всё final... но статья хорошая

Pavel
15.06.2017
12:57:45
Это не у меня, а у чела на одном из докладов на symfoniacs я видел

Roman
15.06.2017
12:58:01

Pavel
15.06.2017
12:58:29
У них там огроменная кодовая база, и нужно было как-то им отслеживать запросы или что-то в этом роде. Из-за того что в доктрине Query был объявлен как final им пришлось лепить огроменные костылищи на тысячи строк кода.
А у меня подгорает что доктрина не может в кастомные названия индексов и fk, и в индексах не приемлет символ -

Adel
15.06.2017
12:59:06
Роман, расскажи как правильно понимать

Roman
15.06.2017
12:59:35
То, что класс должен быть закрыт для модификации, не означает, что вы не можете его расширить
Точно также разработчики библиотеки могут не реализовать всего необходимого мне функционала. В случае с монгой, тот же typeMap я могу захотеть задавать в рантайме. Они же предлагают создать wrapper (не предлагая интерфейсов) или пересоздавать экземпляр Collection каждый раз, что неприемлемо

Adel
15.06.2017
13:01:35
вот только расширение - это не наследование совсем.

Pavel
15.06.2017
13:02:10
Да иногда из-за того что некоторые свойства в библиотеке объявлены как private, получается что отрезается приличный кусок возможностей, и я иду искать более толерантную библиотеку :)

Roman
15.06.2017
13:03:55
Всегда можно форкнуть

dypa
15.06.2017
13:12:37

Adel
15.06.2017
13:18:00
смотря что это за сущность. Ибо все кто эту сущность юзали о твоем новом метооде знать не будут.

Dmitry
15.06.2017
13:18:13
Open-Close вообще не сколько про классы, сколько про модули
и в двух словах - он про неизменность интерфейса модуля
более того... open-close не то, что запрещает наследование, он его в чем-то поощряет

Google

Adel
15.06.2017
13:22:02
одни абстракции. привди примр

Dmitry
15.06.2017
13:22:23
о чем? о том, что интерфейс модуля должен быть закрыт? ;)
это ты и так знаешь.... или ты про трактование ocp?

Adel
15.06.2017
13:22:54
ну когда правильное наследование по ocp
реального класса
буквально на пальцах

Dmitry
15.06.2017
13:23:09
оно не то, что бы правильное... оно просто не про это

Adel
15.06.2017
13:23:12
по мне так это самый сложный для понимания принцип из солида

Dmitry
15.06.2017
13:23:25
оно про закрытость интерфейса и открытость поведения
а наследование - один из способов изменения поведения без изменения интерфейса
он сложный во многом потому, что он очень абстрактен и нихрена не понятно, что Мейер имел ввиду ;)
учитывая, что потом влез дядя боб в 96-м.... а потом, в 13-м сказал, что на самом деле это все херня, что я писал ;) https://8thlight.com/blog/uncle-bob/2013/03/08/AnOpenAndClosedCase.html


Dmitry
15.06.2017
13:27:40
но если суммировать - то этот принцип про проектирование системы, которое позволяет менять ее поведение малыми силами, не переписывая все нафиг
It should be easy to change the behavior of a module without changing the source code of that module. What it means is that you should strive to get your code into a position such that, when behavior changes in expected ways, you don't have to make sweeping changes to all the modules of the system. Ideally, you will be able to add the new behavior by adding new code, and changing little or no old code.
вот он OCP принцип... наследование тут не при чем и вполне подходит про "изменение поведения не меняя исходного кода"...
у наследования там другие проблемы, хотя я не готов сформулировать... что-то вроде усложнения системы за счет взаимодействия наследника и родителя, особо при рефакторинге родителя... гм
короче, проблема наследования в том, что в неумелых руках, кои большинство, код превращается в свалку, по-этому проще запретить всем нафиг, чем обучать эмперическим знаниям ;)
имхо
Офигенно я чат засрал ;)


dypa
15.06.2017
13:34:02
проблема наследования в том, что у тебя есть 2 похожих класса в которых есть по два метода в каждом и тебе нужен третий класс в котором должно быть по одному методу из каждого класса...

Google

dypa
15.06.2017
13:35:14
еще очень классно разбирать длинные цепочки наследования, когда метод который у тебя вызывает проблемы находится в 15 колене наследования от твоего класса

Dmitry
15.06.2017
13:35:53
ну о том и речь, что пытаются наследованием решить проблемы композиции

dypa
15.06.2017
13:36:46
у меня сложилось впечатление, что всё гораздо глубже - люди считают ООП === наследование

Pavel
15.06.2017
13:36:48
да любят это делать)

Dmitry
15.06.2017
13:38:06
Паш, а у тебя проблема в индексах или внешних ключах?
и почему ты не можешь их просто переименовать под доктрину?

Adel
15.06.2017
13:40:10

Pavel
15.06.2017
13:42:06

Dmitry
15.06.2017
13:42:26
гм, а не пофиг как индекс называется?

Pavel
15.06.2017
13:43:02
Я как раз хотел пойти от обратного, наложить доктрину как есть на текущие таблицы, потом редактировать сущности и делать diff в консоли, на основе которого генерить миграции.

Admin
ERROR: S client not available

Dmitry
15.06.2017
13:43:06
это ты наверное про индексы, которые для внешних ключей создаются автоматом?

Pavel
15.06.2017
13:43:22
Но получается чтобы сделать рефакторинг, сначала надо сделать рефакторинг. Зачем тогда мне доктрина?

Dmitry
15.06.2017
13:45:47
Ну тогда не юзай doc:mig:diff и все, синкай руками... как бы или юзаешь комбайн или руками. Иначе тебе все-равно все констрейнты придется в сущности прописывать

Pavel
15.06.2017
13:47:13
Да я пока отложил всю эту идею вообще. Наверно будем переезжать на phinx как придет время.
Еще я хейтил доктрину за то что там многие классы захардкожены, нет DI и нельзя нигде пропихнуть свою реализацию чего-нибудь.
А то казалось бы что может быть проще чем всунуть свой вариант IndexNameGenerator.php какой-нибудь

Dmitry
15.06.2017
14:06:05
дык пишешь свой MyPlatform и переопределяешь что нужно
типа https://github.com/doctrine/dbal/blob/2.5/lib/Doctrine/DBAL/Platforms/AbstractPlatform.php#L1705

Google

Pavel
15.06.2017
14:09:59
Но ведь я не это делаю по сути. Платформа та же mysql
Я же не пытаюсь работать с какой-то своей OurSuperDuperSql СУБД :)

Dmitry
15.06.2017
14:10:47
ну наследуешься (о боже!) от MysqlPlatform и переопределяешь

Pavel
15.06.2017
14:11:24
Там кучу всего придется переопределять тогда. Там кроличья нора.
Полдоктрины доопределить копипастом ?

Dmitry
15.06.2017
14:12:12
getCreateConstraintSQL

Pavel
15.06.2017
14:13:11
Да нет жи, там это так не работает. Там больше проблем. Ну или может я чего упустил.

Dmitry
15.06.2017
14:15:09
да хз, я этим не занимался, но по коду все прозрачно... именя индексов и так задаются в аннотациях, а имя внешнего ключа и прочих констейнтов проходят через этот метод... эксперементировать нужно, конечно, неклассическая задача, что бы легко нагуглить
к слову, я щас проверил... просто увидел по коду странное и проверил... doc:mig:diff подхватывает существующие внешние ключи и их имена

Pavel
15.06.2017
14:25:41
Прикольно, может это недавно добавили

Dmitry
15.06.2017
14:28:13
вот, кстати... проблемы наследования ;) class Index extends AbstractAsset implements Constraint

Pavel
15.06.2017
14:28:41
И в чем тут проблема? Вроде все красиво.

Dmitry
15.06.2017
14:29:07
мне не нравится ;)
AbstractAsset ничего не имплементирует
он просто подмешивает код для getName в разные классы, а метод getName уже требует интерфейс Constraint
хз, может тот случай, когда трейт бы выглядел тут более вменяемо

Vlad5ss
15.06.2017
14:42:29
не подскажите в чем дело
https://gyazo.com/07263ea790d48fa612ee44fdd091efd1

Dmitry
15.06.2017
14:44:05
вероятно в неверном sql запросе, который нужно показать

Roman
15.06.2017
14:47:23
Как на github'е привязать issue?

Adel
15.06.2017
14:50:04
#issuenumber?

Roman
15.06.2017
14:50:45