@phpclubru

Страница 242 из 956
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

Алексей
15.06.2017
12:44:45
ну понятно. единственный кеейс. как я сказал. ктото написал плохой код и надо с этим жить :)
И много ли в повседневной работе встерчается первоклассного кода?)

Adel
15.06.2017
12:45:07
зависит от того, кто повседневно работает )

чащ евсего прходится работать со своим кодом )

SOLID не запрещает наследование
да. но есть некий принцип Лисков. Который вообще легко нарушается чуть что. если наследовано от неабстрактного класса.

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
нарушенный принцип OpenClosed
Вы его неправильно понимаете

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
Паш, а у тебя проблема в индексах или внешних ключах?

и почему ты не можешь их просто переименовать под доктрину?

Pavel
15.06.2017
13:42:06
и почему ты не можешь их просто переименовать под доктрину?
Я уже не помню если честно, пробовал месяца 3-4 назад. Но кажется в индексах. Переименовать индекс на что-то вроде IDX_AB4FFD8X9 мне кажется не очень хорошей идеей.

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




Страница 242 из 956