@oop_ru

Страница 349 из 785
Adel
03.10.2017
13:14:09
а чем глупость с " Interface, Contract, Initialize" отличается от неглупости с "Controller" ?)
а расскажи как ты именуешь классы у себя на преокте? контроллеры те же. репозитории и т.д.

Sergey
03.10.2017
13:14:09
а чем глупость с " Interface, Contract, Initialize" отличается от неглупости с "Controller" ?)
вопрос семантики. Добавление Interface не влияет на семантику и наоборот ухудшает ее. А MerchantController например имеет вполне конкретную семантику

Все эти служебные Interface, Contract, Initializer - это да. глупость. А вот с Controller - почему нет? С эксепшенами... ну спорненько.
он там приводит кейсы где добавление суффиксов Error или Exception это норм, ибо без этого теряется смысл

Google
Sergei
03.10.2017
13:15:23
Все эти служебные Interface, Contract, Initializer - это да. глупость. А вот с Controller - почему нет? С эксепшенами... ну спорненько.
https://youtu.be/ZsHMHukIlJY?t=29m19s Вот например, можно убрать слово Exception из наименования, допустим есть OverflowException которое становится Overflow, а добавление слова Exception это что то вроде вариации польской нотации, но с другой стороны когда мы бросаем и ловим исключение то это читается естественное допустим throw new IndexOutOfRangeException(); но это уже дело привычки что ли. Если применить подход который в докладе повсевместно через некоторое время все привыкнут к новому варианту.

Adel
03.10.2017
13:15:28
но самое главное - да. семантика. по имени класса должно быть понятно что это

Maksim
03.10.2017
13:15:48
а расскажи как ты именуешь классы у себя на преокте? контроллеры те же. репозитории и т.д.
всё в едином стиле и со всеми постфиксами. Разделять смысла нет никакого. Либо так, либо никак. ибо это всё звенья 1й цепи, 1 и та же "глупость"

Sergey
03.10.2017
13:15:59
всё в едином стиле и со всеми постфиксами. Разделять смысла нет никакого. Либо так, либо никак. ибо это всё звенья 1й цепи, 1 и та же "глупость"
ну это работает для джунов, согласен. Ну мол сложно если у тебя в команде есть новички не владеющие языком даже что-то с неймингом умное мутить

так что в этом есть определенный смысл.

но ценности нет)

Maksim
03.10.2017
13:17:51
это работает +/- для всех. а ценность - понятие довольно растяжимое. Под такую гребёнку можно много вещей закинуть, мол, ценности нет.

Aleh
03.10.2017
13:18:10
так может их и надо закинуть?)

Sergey
03.10.2017
13:18:32
зачем делать что-то что не несет в себе никакого практического смысла?)

Adel
03.10.2017
13:18:39
UserRepositoryContract

LoggerInterface

Aleh
03.10.2017
13:19:06
UserRepositoryContract
ужас какой

Google
Adel
03.10.2017
13:19:20
дада. я такое вычищал с проекта :)

Sergey
03.10.2017
13:19:47
ну LoggerInterface - например в случае с PHP и стандартами там как раз это считается "хорошей практикой". Увы...

Adel
03.10.2017
13:20:19
о да. сам этот интерфейс тоже весьма веселый. ибо он должен содержать только один метод. а не 9 :)

Maksim
03.10.2017
13:20:30
UserRepositoryContract круто смотрится. Особенно если вспомнить чем является интерфейс

Adel
03.10.2017
13:20:34
или быть абстрактным классом.

Sergey
03.10.2017
13:20:47
или быть абстрактным классом.
нет, вот это точно нет

Adel
03.10.2017
13:20:56
Sergey
03.10.2017
13:21:09
почему
не люблю абстрактные классы)

они в 90% случаев не нужны

Adel
03.10.2017
13:21:53
а у меня такая мысль последнее время. что они как раз таки нужны. вместо некоторых интерфейсов

Aleh
03.10.2017
13:22:03
о.о

Sergey
03.10.2017
13:22:04
UserRepositoryContract круто смотрится. Особенно если вспомнить чем является интерфейс
я тебе страшную тайну открою... если даже мы не юзаем интерфейс и у нас просто final class, у класса всеравно есть "интерфейс" и объект этого класса все еще должен соблюдать "контракт". Так что полезной смысловой нагрузки это все не несет

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

Sergei
03.10.2017
13:23:12
"что это" - это весьма смутное определение)
зависит от контекста решаемой задачи, хотя как я думаю если есть какая то одна сущность например дверь, с той картинки в одном контексте в ней буду методы закрыть, открыть и так далее, в другом коде может быть такая же сущность но уже с другими методами. Например есть два списка https://docs.oracle.com/javase/9/docs/api/java/awt/List.html и другой список, имена одинаковые https://docs.oracle.com/javase/9/docs/api/java/util/List.html

Adel
03.10.2017
13:23:22
interface LoggerInterface { public function emergency($message, array $context = array()); public function alert($message, array $context = array()); public function critical($message, array $context = array()); public function error($message, array $context = array()); public function warning($message, array $context = array()); public function notice($message, array $context = array()); public function info($message, array $context = array()); public function debug($message, array $context = array()); public function log($level, $message, array $context = array()); }

первые 8 методов всегда имеют одну и ту же реализацию

Adel
03.10.2017
13:23:38
которую надо копироват ьвсем

Rodion
03.10.2017
13:23:45
как python обходится без такой языковой конструкции как interface?)

Google
Aleh
03.10.2017
13:24:24
Sergey
03.10.2017
13:24:25
как и в плюсах

Adel
03.10.2017
13:24:42
Aleh
03.10.2017
13:24:52
с psr все норм

сделай простую реализацию, которая принимает какой-то interface Logger { log(level, message, context) } и реализует все эти 9 методов через вызовы к твоему простому красивому логгеру

Sergey
03.10.2017
13:26:06
с psr все норм
ты в этом уверен?

Aleh
03.10.2017
13:26:22
ты в этом уверен?
кроме имени меня все устраивает)

Sergey
03.10.2017
13:26:23
а что ты скажешь о psr-12?

Adel
03.10.2017
13:26:26
почему я должен это делать? и должен делать КАЖДЫЙ кто реализует этот логгер.

Sergey
03.10.2017
13:26:34
и ты должен страдать

Aleh
03.10.2017
13:26:41
и много кто его юзает

Adel
03.10.2017
13:27:09
так то да. скопипастить 8 методов - ерунда. но это простой пример когда абстрактный класс был бы лучше.

Rodion
03.10.2017
13:27:17
потому что это похапэ
ты же тоже на php пишешь)

Adel
03.10.2017
13:27:19
я вообще не вижу ни одного доводы в пользу интерфейса

Google
Sergey
03.10.2017
13:27:35
Adel
03.10.2017
13:27:40
так там везде вызов 9го метода! с нужным парамтером

Rodion
03.10.2017
13:28:01
и я страдаю(
и не было мысли свопаться куда-то еще?) сорри за оффтоп

Aleh
03.10.2017
13:28:09
может на error я хочу смски посылать

Adel
03.10.2017
13:28:35
потому что это так. и я даже специально глянул несколько реализаций. там так.

Adel
03.10.2017
13:28:54
это решается дальше. уровнями логирования

чем лучше?
а чем плох абстрактный класс то? вот именно здесь? никто не сможет отнаследоваться от какого-то левого класса и заимплементить LoggerInterface? так хорошо ж.

Aleh
03.10.2017
13:30:38
так там везде вызов 9го метода! с нужным парамтером
в любом случае, это вопросы реализации, мне как пользователю интерфейса глубоко пофиг

Sergey
03.10.2017
13:32:13
абстрактный класс должен появляться когда у тебя уже есть 2 класса и у них общие вещи

а не вначале

но это мое мнение

Adel
03.10.2017
13:34:37
это было и моим мнением :) но я тут начинаю подозревать, что ограничения - это хорошо. более жесткие контракты. абстрактный класс с ограничением на наследование от чего-то другого. вынуждая использовать композицию, а не наследование... но красиво обьяснить правильность я пока не могу

Google
Sergey
03.10.2017
13:36:22
то есть в идеале я хочу иметь "интерфейс без реализации" и "реализации". И если есть общие штуки - значит я где-то упустил какую-то абстракцию

Margaret
03.10.2017
14:58:17
Я тут оффтопну немного и возник такой вопрос: насколько сейчас часто используется паттерн нулевого объекта?

Nik
03.10.2017
15:00:28
(настолько, насколько есть его нативная поддержка в конкретном языке)

Anton
03.10.2017
15:03:14
Мои 15 копеек про *Interface, *Contract и прочие ISerializable: без контекста языка это не имеет смысла. В С++ - да, конечно. В Java - скорее нет чем да. C# - наоборот, скорее да чем нет. В PHP... ой да ладно как в команде принято так и будет.

Tex
03.10.2017
15:08:04
> ой да ладно как в команде принято так и будет. ну, при действительно внушительных размерах и возрасте проекта эта фраза сработает для любого языка, в общем-то.

Margaret
03.10.2017
15:11:37
Например взять с#. Просто есть в си ш кратенькая проверка на нулл ( типа custObj?.DoSmth()). Есть ли смысл в этом паттерне

Adel
03.10.2017
15:13:08
какой смысл проверять на нулл.. контракты более жесткими должны быть. если тебе нужен NotNull обьект - проси такой.

Anton
03.10.2017
15:13:42
я вообще не вижу ни одного доводы в пользу интерфейса
Насчет LoggerInterface я что-то не понимаю или "psr/log" дает вариант и с базовым абстрактным классом и с трейтом + общий интерфейс, если тебе ну прям очень нужно. Стандарты для того и нужны чтобы покрывать максимум кейсов. Картинка про 15 стандартов

Adel
03.10.2017
15:14:10
почему абстрактный класс не подходит?

Anton
03.10.2017
15:16:26
Потому что в PHP нет множественного наследования, не? Я конечно слабо себе представляю настолько упертого человека который захочет отнаслеоваться от AbstractLogger и скажем ммм EntityManager, но интерфейс технически закрывает такой кейс.

Sergey
03.10.2017
15:17:08
вот именно это и плохо!
у тебя интерфейсы есть, зачем тебе множественное наследование

добавить дефолтные реализации методов как в java и все любители множественного наследования должны закрыться

Aleh
03.10.2017
15:17:55
Нууууууу хз)

Adel
03.10.2017
15:17:56
плохо, что интерфейс дает такую возможность :)

Sergey
03.10.2017
15:18:00
(дефолтные методы лучше чем возможность объявлять стэйт в базовом классе)

Adel
03.10.2017
15:18:06
а не то, что множественного наследования нет :))

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