
Adel
03.10.2017
13:14:09

Sergey
03.10.2017
13:14:09

Adel
03.10.2017
13:14:58

Google

Sergei
03.10.2017
13:15:23

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

Maksim
03.10.2017
13:15:48

Sergey
03.10.2017
13:15:59
так что в этом есть определенный смысл.
но ценности нет)

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

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
и уточни говорим мы о языках где поддерживается/не поддерживается множественное наследование и есть/не есть явный механизм определения интерфейсов


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 методов всегда имеют одну и ту же реализацию

Maksim
03.10.2017
13:23:35

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

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

Google

Sergei
03.10.2017
13:23:49

Sergey
03.10.2017
13:23:53

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

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

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

Aleh
03.10.2017
13:27:22

Google

Sergey
03.10.2017
13:27:35

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

Sergey
03.10.2017
13:27:50
тут надо 2 интерфейса и трейт в случае php

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

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

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

Sergey
03.10.2017
13:28:54

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

Aleh
03.10.2017
13:30:38

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

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

Aleh
03.10.2017
13:34:46

Sergey
03.10.2017
13:35:07

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
почему абстрактный класс не подходит?

Aleh
03.10.2017
15:15:06

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

Sergey
03.10.2017
15:16:49

Adel
03.10.2017
15:16:51

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
а не то, что множественного наследования нет :))

Sergey
03.10.2017
15:18:08
ну то есть ограничения у тебя остаются