Разбор ООП с Delphinum

26.89K
.
╭∩╮ (`-`) ╭∩╮
# Delphinum (20.01.2017 / 19:19)
AlkatraZ, это холиварная тема, но мир веба движется в сторону интерфейсов. То есть сначала интерфейс, который описывает что умеет класс, а затем уже его реализация (или несколько полиморфных реализац
Если нет абстракции и не подразумеваются разные реализации интерфейса, то тогда зачем плодить лишние файлы?
.
Delphinum
AlkatraZ, дело в том, что абстракция есть всегда. Конечно если не предполагается (сейчас) полиморфная реализация некоторой абстракции, то можно и не использовать интерфейсы, но если в будущем такая потребность появится, то инвертировать зависимость будет сложнее, чем сделать это сразу.

Да и не сложно ведь писать эти самые интерфейсы )

P.S. Сам далеко не всегда пишу их, всегда ориентируюсь на конкретный случай
.
╭∩╮ (`-`) ╭∩╮
Сильно зависит от конкретной реализации...

Если используешь контейнер-сервисменеджер, типа нового Зендовского, там таки да, есть смысл ДЛЯ ВСЕХ сервисов, что гонятся через контейнер написать интерфейсы. Фактически они определяют твой внутренний API и конечному пейсателю модулей будет пофиг, а на чем там конкретно написано ядро: Зенд, Симфония, или Ларавель или хз что еще...

Главное - ты запрашиваешь из контейнера интерфейс, а он уже выдаст тебе его реализацию.
.
╭∩╮ (`-`) ╭∩╮
Я вот в Моби так и планирую сделать.
Тем более, что там будет семантическое версионирование и по интерфейсам легко отслеживать (для кордера, писателя модулей), что изменилось и нафига апнулась мажорная версия.
.
Delphinum
AlkatraZ, ну вот примерно такая же логика и при разборе всего проекта. Другими словами - если можно написать интерфейс, если получилось выделить абстракцию для этого, лучше писать чем не писать, меньше потом страдать будешь

Конечно для проектов типа dcms проблематично будет использовать такой подход )
.
(\/)____o_O____(\/)
в 3енде вообще без интерфейсов ни куда, что не переделать, везде надо следовать интерфейсу
.
Koenig, ну можно себе в ногу выстрелить, если не следовать заложенной семантике )
.
╭∩╮ (`-`) ╭∩╮
# Delphinum (20.01.2017 / 19:44)
AlkatraZ, ну вот примерно такая же логика и при разборе всего проекта. Другими словами - если можно написать интерфейс, если получилось выделить абстракцию для этого, лучше писать чем не писать, мень
Да, тут согласен.
Интерфейсы - это твой внутренний API.
---
Просто вот думал, куда их пихать?
Теоретически, надо было бы создать отдельную папку /vendor_name/api/... ну короче в свой неймспейс впихнуть раздел "api" где все и собрать. Ведь если следовать логике, ХЗ какими пакетами и наворотами ты будешь реализовывать эти интерфейсы? ты еще этого не знаешь, или же потом может поменяться.

Посему есть смысл API интерфейсы выделять в отдельный пакет со своим неймспецсом.
И потом писать к нему документацию, не задумываясь о реализации, она вторична.
.
AlkatraZ, варианта два:
1. Ты либо пишешь интерфейсы по аналогии с PSR:
namespace YourPackage;

interface YourInterface{
  ...
}

а другие пакеты их реализуют
2. Либо ты засовываешь интерфейсы в пакет с его же реализацией:
Router/
  RouterInterface.php - интерфейс
  Router.php - реализация
  Rule/
    RouteRuleInterface.php - интерфейс
    RegextRule.php - реализация
    ListeralRule.php - реализация

другие пакеты так же могут реализовать твой интерфейс, но при этом им придется скачивать в зависимостях и твою реализацию. Это печально, но не критично
.
AlkatraZ
╭∩╮ (`-`) ╭∩╮
Я имею в виду отдельный пакет Api, который содержит только интерфейсы, без реализаций.
Далее, уже через конфиг контейнера ты сопоставляешь интерфейс => реализация.
Это системный API.
---
К примеру, если пишем движок - это API движка.
Всего: 713