@oop_ru

Страница 78 из 785
0x9d8e
26.01.2017
19:45:31
Ща пример накатаю (тот же самый).

Alan
26.01.2017
19:45:34
мне кажется это сущность Витрина и сущность Товар на складе, вторые крепятся к витрине и имееют специфичные свойства типа артикул, цена, размер, цвет. У сущности витрина общие свойства типа описание, картинка, тп

0x9d8e
26.01.2017
19:45:54
Ну типа того

Alan
26.01.2017
19:46:08
а вопрос в ооп

Google
F01134H
26.01.2017
19:46:40
Т.е. ты клонируешь объект, в котором заложены начальные свойства\методы\etc?

0x9d8e
26.01.2017
19:49:51
а вопрос в ооп
Так вот придумал и описал реализацию этой хрени с учётом всего говна. Интересуюсь нормально ли придумал. А ещё точнее описывал, чтобы самому понять, но раз уж описал, то вдруг кто чего дельного на этот счёт скажет.

Т.е. ты клонируешь объект, в котором заложены начальные свойства\методы\etc?
Клонирование тут термин скорее бизнес-логики. Php-объекты там разные совершенно, хоть и одного класса и 90% свойств у них идентичны.

F01134H
26.01.2017
19:51:17
Ну это вроде прототип и есть)

dypa
26.01.2017
19:53:00
Полную ли я хрень нагородил, или с кетчупом сойдёт?
1) магазин продает только носки? 2) почему было принято решение писать свой магазин вместо использования готового? 3) почему товар сам себя сохраняет?! используй data mapper уже!

F01134H
26.01.2017
19:53:05
Но не понимаю, зачем оно именно так сделано, а не иначе. Ну, прототип вроде используется для экономии ресурсов, что бы каждый раз не создавать объект (вызывая кучу конструкторов родителей), он просто копируется

0x9d8e
26.01.2017
20:07:40
1) магазин продает только носки? 2) почему было принято решение писать свой магазин вместо использования готового? 3) почему товар сам себя сохраняет?! используй data mapper уже!
1) Магазин продаёт вообще не носки. Просто это сути дела не меняет. Там почти у всех товаров есть аттрибут, очень важный для покупателя (как размер в случае носков). И покупателю совершенно до фонаря товар, если он ему по "размеру" не подходит. А ещё ему мешают товары, у который 100500 "размеров". Условно говоря в каталоге нужны "Красные носки 44 размера", тогда как в админке "Красные носки" и длиииный список "размеров". 2) Он весьма специфичен для цмсок. И, кстати, в том то и проблема, что его написали на говноцмс, а все её ограничения хакнули и обкостыляли так, что лучше бы вообще на голом пхп навелосипедили, хотябы небыло бы такого разрыва между бизнес-логикой и логикой цмс. 3) Я бы с радостью, да это уж "в следующей жизни". Текущий код таких вольностей не позволит. Рефакторить это дороже чем заново написать. При этом проблемы с конверсией решать нужно сейчас. Не будь тут этого невыпиливаемого чудо-AD, неочем и разговаривать было бы, ибо большинство проблем в неё упираются и решаются только костылями. Но, к счастью, из костылей скоро гробик сколотим.

dypa
26.01.2017
20:37:16
1) Магазин продаёт вообще не носки. Просто это сути дела не меняет. Там почти у всех товаров есть аттрибут, очень важный для покупателя (как размер в случае носков). И покупателю совершенно до фонаря товар, если он ему по "размеру" не подходит. А ещё ему мешают товары, у который 100500 "размеров". Условно говоря в каталоге нужны "Красные носки 44 размера", тогда как в админке "Красные носки" и длиииный список "размеров". 2) Он весьма специфичен для цмсок. И, кстати, в том то и проблема, что его написали на говноцмс, а все её ограничения хакнули и обкостыляли так, что лучше бы вообще на голом пхп навелосипедили, хотябы небыло бы такого разрыва между бизнес-логикой и логикой цмс. 3) Я бы с радостью, да это уж "в следующей жизни". Текущий код таких вольностей не позволит. Рефакторить это дороже чем заново написать. При этом проблемы с конверсией решать нужно сейчас. Не будь тут этого невыпиливаемого чудо-AD, неочем и разговаривать было бы, ибо большинство проблем в неё упираются и решаются только костылями. Но, к счастью, из костылей скоро гробик сколотим.
ок, я думал изначальный вопрос про то как переписать. тогда ограничимся двумя носками и тремя размерами для них. какая сейчас структура субд для такого случая?

Aleh
26.01.2017
20:50:42
Люди. Подскажите. Есть ИМ (на php) на с легаси, говном и костылями (переписывание согласовано и запланировано, ибо тупик). В нём, допустим, носки. У каждого носка, допустим, массив размеров. Нужно, допустим только в админке, оставить всё как есть, а вот для каталога носок с тремя размерами становится тремя разными носками. С разными айдишниками, страницами и так далее, но основной набор данных у них общий. И класс один и тот же (иначе костылять, неперекостылять). [Примечание: в базе просто запилил табличку {origin_id, clone_id, size_id}] И вот не знаю даже как это адекватно реализовать в плане ООП. Порассуждаю прямо тут (может и отправлять не придётся): Как минимум нам при работе с клонированием нужно не путать где клон, а где оригинал, дабы не настругать в базу говна. Значит это будет два разных класса-обёртки: клон и оригинал. Оригиналу хорошо бы вообще самому позаботиться о том, чтобы его набор клонов (записи в таблице клонов и записи товаров, являющиеся этими клонами) был бы всегда корректным и актуальным. Тут охота запилить публичный маха-метод updateClones(), который бы удалил лишние, да создал недостающие, чтобы можно было дёргать его после сохранения в админке и всяких импортах (правда подозреваю что это не совсем гуд). Это подразумевает наличие, возможно приватных, методов в роде getClones(), сloneExists(int size_id), makeClone(int size_id), getSizes(), getCloneIdBySizeId(int size_id), removeClone(int clone_id), clearClones(), может ещё каких-то. Класс клона позволил бы... ну айдишник оригинала получить. А ещё айдишник размера. Ещё нужен класс, который всё это объединит. Нет, не верно, нужно всё это объединить. Например товар должен уметь определять не клон ли он. Нет. При сохранении товара нужно определить клон ли он. Для клона будет одна реализация сохранения, для оригинала другая (в т.ч. вызывающая обновление/сохранение всех клонов). Наверное логичнее всего это сделать не здоровенным if'ом в товаре, а поручить какому-то классу. Уверен что на это и паттерн есть (стратегия или что там). Но тут имеется ньюанс: вызывать сие должен товар (иначе тонну легаси переписывать). То есть во множестве мест вызывается GoodPage->save() (при том тот код может даже не знать что это GoodPage, ибо для него это просто всякие Page, та и фабрику которая это строит будет адски сложно заставить построить GoodClonePage и GoodOriginPage), так что в любом случае мы правим именно его реализацию. Пожалуй сделаю как проще и запилю там пару приватных методов cloneSave() и originalSave(), а в save() будет что-то такое: if($this->isClone()) { return $this->cloneSave(); } else { return $this->originalSave(); } И если уж понадобится это как-то изменить, то в любом случае править товар. Уровень его "божественности" это не изменит. Так ведь? В итоге будем иметь что-то типа: class GoodClone { public $good_id; public $origin_id; public $size_id; public function remove() { (new GoodPage($clone->good_id))->remove(); $this->data->delete($good_id); } } class GoodCloneOrigin { public $good_id; public function updateClones() { foreach ($this->data->sizes as $size_id) { if (!$this->cloneExists($size_id)) { $this->makeClone($size_id); } } //А при удалении размеров клон по внешнему ключу удалится. //Хотя… «Клон» то да, а товар то не-а. //Убрал внешний ключ. Вернее ON DELETE SET NULL $deletedClones = $this->data->getClonesWhereSizeIsNull(); foreach ($deletedClones as $clone) { $clone->remove(); } } } class GoodPage extends Page { /* … */ //Здесь всё почти без изменений, кроме: private function isClone(); private function saveClone(); private function saveOriginal();//отсюда будет вызов GoodCloneOrigin::updateClones() public function save() { if ($this->isClone()) { return $this->cloneSave(); } else { return $this->originalSave(); } } }
https://gist.github.com/mkusher/66667736a20cb19cfa4d6476dda64d21 не? В админке Good, для каталога GoodItem

имена очень лень думать

идею с клонами чет совсем не уловил

Sergey
27.01.2017
06:11:05
А почему не добавить доп поле в бд, типа мастер-товар?

0x9d8e
27.01.2017
10:06:59
А почему не добавить доп поле в бд, типа мастер-товар?
Можно и добавить, да это только для оптимизаций может потребоваться. Преждевременно не буду.

Google
da horsie
27.01.2017
20:04:54
хехе, у меня теперь есть доступ ко всем видосам Clean code ;)

Nik
27.01.2017
20:07:22
поделись?

da horsie
27.01.2017
20:08:53
увы, могу только хвастаться

либо можно устроить совместный просмотр через гугл хенгаутс

f4rt~
27.01.2017
20:09:39
стартуй

Nik
27.01.2017
20:09:40
а выкачать их нельзя?

da horsie
27.01.2017
20:13:29
выкачать не знаю как. да и незаконно это

я и про хенгаутс не уверен, честно сказать

Nik
27.01.2017
20:13:58
кстати, у меня скоро будут платные видосы с knp university

Pavel
27.01.2017
20:14:08
выкачать не знаю как. да и незаконно это
ты это на складчине скажи чтобы посмеялись

dypa
27.01.2017
20:14:37
67639
27.01.2017
21:19:12
Привет

Andrey
27.01.2017
21:25:57
Так что норм

В целях ознакомления

Olha
27.01.2017
21:40:07
выкачать не знаю как. да и незаконно это
а если не выкачать, а записать во время просмотра программкой для записи с экрана?

da horsie
28.01.2017
08:07:47
https://www.youtube.com/watch?v=qkblc5WRn-U

@fes0r тебе должно понравиться

Google
Sergey
28.01.2017
08:52:56
@f3ath ну как бы ничего нового

?
28.01.2017
15:50:32
https://www.youtube.com/watch?v=qkblc5WRn-U
Кстати да, норм видосик

Sergey
30.01.2017
11:34:26
https://www.youtube.com/watch?v=v-2yFMzxqwU

Alexander
30.01.2017
11:39:00
пролистал увидел много кода на руби с середины

пыхерам, не знакомым с руби смотреть имеет смысл?

там все интуитивно понятно?

Sergey
30.01.2017
12:42:33
имеет

finkel
30.01.2017
12:48:16
руби в целом интуитивно понятый)

Aleh
30.01.2017
12:48:44
ага, как баш )

?
30.01.2017
13:03:42
ах блядь

простите

канал перепутал

F01134H
30.01.2017
18:54:22
Пардон ?

Sergey
30.01.2017
18:54:24
не надо так делать)

F01134H
30.01.2017
18:54:35
Не не, я случайно, себе отправить хотел

Sergey
30.01.2017
18:54:36
ну то есть серьезно

если ты хочешь нормально жить - не заворачивай стэйт что бы его потом доставать

и тебе не нужны будут эти кастыли

Admin
ERROR: S client not available

Sergey
30.01.2017
18:55:06
рефлексии и прочее

Google
F01134H
30.01.2017
18:55:16
да пофиг

Просто на гит закину

Портфольку собираю

Alexandr
31.01.2017
08:06:47
ребята, а есть какой-нибудь java канал ?

Sergey
31.01.2017
08:07:00
pro.jvm

Alexandr
31.01.2017
08:07:58
спасибо

Hell
31.01.2017
12:44:16
господа, а фабрику в по ха пе нужно создавать на каждый класс?

v
31.01.2017
12:45:35
а new Class() это фабрика или нет?

Hell
31.01.2017
12:46:50
в общем да, но специальная

v
31.01.2017
12:47:23
в таком случае нет, не надо

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

Hell
31.01.2017
12:49:19
https://github.com/magnus-eriksson/oauth2-simple-client/blob/develop/src/Factory.php

это класс - фабрика?

барбанная дробь... да

для класса Client

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

это был бы SRP violation

Aleh
31.01.2017
12:52:48
паттерны вообще не надо вставлять просто так, они будут сами выводиться при разбиении

Google
Aleh
31.01.2017
12:54:18
solid/grasp и инструменты которые помогают вам проектировать

Aleh
31.01.2017
12:56:12
да, ничего хорошего там не увидел

Hell
31.01.2017
12:56:31
то была фабрика или разраб его от балды обозвал словом Factory

да, ничего хорошего там не увидел
а как бы эты хорошо написал бы?

Страница 78 из 785