Названия файлов и классов

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #1 korshunov » 13.06.2021, 05:23

В папке Okay/Entities названия файлов имеют вид
Okay/Entities/AdvantagesEntity.php,
Okay/Entities/AuthorsEntity.php
и т.д. В названиях к наименованию сущности добавлен суффикс 'Entity'. Для чего это сделано, если нахождение в папке и так означает, что файл описывает класс именно сущности, а не чего-то другого? Логичнее было бы использовать названия
Okay/Entities/Advantages.php,
Okay/Entities/Authors.php
и т.д.

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

Попробовал изменить BrandsEntity.php - переименовал файл в Brands.php, класс внутри в Brands. В зависимых файлах внес соответствующие изменения. Работает.

Аналогичное замечание и по многим другим папкам, например Okay/Controllers, Okay/Helpers, backend/Controllers.

А в папке backend/Helpers еще сложнее - там названия типа
backend/Helpers/BackendAuthorsHelper.php
backend/Helpers/BackendBlogCategoriesHelper.php
то есть, кроме суффикса, еще и префикс добавлен.
А в папке backend/Controllers суффикс свой собственный, отличный от других, используемых в backend.

Могу предположить, что сам факт наличия суффиксов-префиксов есть наследие Simpla, то есть когда-то для облегчения разработчики скопировали структуру из Simpla, да так и оставили. Но не учли, что в Simpla пространства имен отсутствовали, там такое было просто необходимо.

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

zyxer M
zyxer M
Возраст: 32
Репутация: 77
Сообщения: 419
Зарегистрирован: 03.02.2016
С нами: 8 лет 1 месяц
Откуда: Днепр

Сообщение #2 zyxer » 15.06.2021, 08:22

Не, тогда буде еще хуже. Сейчас в IDE когда вводишь имя класса (например в контроллере), он автоматически добавляется в use. В вашем же варианте эта приведет к

Код: Выделить всё

use Okay\Helpers\Products;
use Okay\Entities\Products;

что будет ошибкой, в таком случае нужно будет писать

Код: Выделить всё

use Okay\Helpers\Products as ProductsHelper;
use Okay\Entities\Products as ProductsEntity;

что уже точно усложнит разработку. Поэтому мы и добавили эти типовые суффиксы чтобы было проще, а не наследие симплы
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #3 korshunov » 15.06.2021, 09:16

Получается шиворот-навыворот. Вместо того, чтобы создавать логичный продукт, Вы подгоняете результат под удобство работы в IDE. И удобство сомнительное, скорее даже подгоняете под свои привычки в ущерб результату.

Фактически у Вас сделано так, чтобы названия классов были уникальны. А если так, то зачем тогда пространства имен? Они в системе сейчас практически не работают, лишь присутствуют формально без всякой пользы...

zyxer M
zyxer M
Возраст: 32
Репутация: 77
Сообщения: 419
Зарегистрирован: 03.02.2016
С нами: 8 лет 1 месяц
Откуда: Днепр

Сообщение #4 zyxer » 15.06.2021, 10:25

Даже комментировать не буду )

Добавлено спустя 31 минуту 14 секунд:
и еще, чтобы не говорить ерунды, почитайте PSR-4 (это касаемо вашего возражения) и заодно вообще все PSR-ы, там много интересного
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #5 korshunov » 15.06.2021, 11:58

zyxer писал(а):чтобы не говорить ерунды, почитайте PSR-4

Чтобы не говорить ерунды, сообщайте по вопросу конкретные сведения или конкретные ссылки, если знаете. А абстрактно читать можно месяцами и всего интернете не перечитать.

По моему основному тезису написано тут http://code.mu/ru/php/book/oop/namespaces/intro/

И не разу еще не встречал такого, чтобы какой-либо разработчик заявлял, что использует те или иные приемы потому, что с ними в IDE удобно. Обычно бывает все наоборот - IDE разрабатывается и настраивается для удобства разработчиков...

zyxer M
zyxer M
Возраст: 32
Репутация: 77
Сообщения: 419
Зарегистрирован: 03.02.2016
С нами: 8 лет 1 месяц
Откуда: Днепр

Сообщение #6 zyxer » 15.06.2021, 12:14

korshunov писал(а):Чтобы не говорить ерунды, сообщайте по вопросу конкретные сведения или конкретные ссылки, если знаете. А абстрактно читать можно месяцами и всего интернете не перечитать.
я же вам дал, это PSR-4. Этот стандарт описывает автозагрузку классов. Короче бессмысленный спор.

Добавлено спустя 29 минут 24 секунды:
я кажется понял, это не спор. Вы видимо изучаете неймспейсы и видите здесь противоречие того, что написанно по ссылке. Попробую пояснить. Да, действительно неймспейсы нужны чтобы можно было создавать два класса с одинаковыми именами и они не создавали конфликтов. Но когда вы сюда еще прикручиваете автозагрузку по стандарту PSR-4 (а там основная суть, что директории и названия файла должно совпадать с неймспейсом и именем класса) то вам чтобы заюзать какой-то класс нужно его импортировать посредством конструкции use. Но когда вы импортируете два класса с разных неймспейсов в один ваш пользовательский класс, вот так:

Код: Выделить всё

use Okay\Helpers\Products;
use Okay\Entities\Products;


вы сразу получите ошибку. Поэтому вам нужно хотябы одному классу создавать алиас:

Код: Выделить всё

use Okay\Helpers\Products;
use Okay\Entities\Products as ProductsEntity;


но тут же сразу получается неудобство в коде ниже, что вам нужно в голове держать что за Products стоит класс хелпера, а за ProductsEntity стоит класс ентити. Тоже не удобно, тем более что нет какого-то одного стандарта и в соседнем классе может быть:

Код: Выделить всё

use Okay\Helpers\Products as ProductsHelper;
use Okay\Entities\Products;


т.е. за Products уже скрывается другой класс.

Поэтому лучше в таком случае писать:

Код: Выделить всё

use Okay\Helpers\Products as ProductsHelper;
use Okay\Entities\Products as ProductsEntity;


Теперь что касается IDE. В большинстве IDE не обязательно прописывать классы в use, достаточно начать писать в коде название класса и выбрать его с выпадающего списка, а IDE сама подставить его в use. Но вот если ситуация будет с одинаковыми названиями классов, тогда нужно будет идти и добавлять алиас для класса, что не очень удобно.
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #7 korshunov » 15.06.2021, 14:37

zyxer писал(а):...Поэтому вам нужно хотябы одному классу создавать алиас:

Код: Выделить всё

use Okay\Helpers\Products;
use Okay\Entities\Products as ProductsEntity;


По-моему в этой ситуации, кроме приведенных примеров, также весьма удобно было бы делать примерно так:

Код: Выделить всё

use Okay\Helpers\Products as HelpersProducts;
use Okay\Entities\Products as EntityProducts;


И код бы лучше читался. Остается маленькое неудобство с IDE. Но тут, как говорится, на вкус и цвет товарища нет.
И, как я уже говорил, это что-то новенькое - подгонять код под удобство работы с IDE. Если знаете примеры, где программисты объясняют нелогичность кода удобством работы с IDE, сообщайте...

zyxer M
zyxer M
Возраст: 32
Репутация: 77
Сообщения: 419
Зарегистрирован: 03.02.2016
С нами: 8 лет 1 месяц
Откуда: Днепр

Сообщение #8 zyxer » 15.06.2021, 14:52

korshunov писал(а):По-моему в этой ситуации, кроме приведенных примеров, также весьма удобно было бы делать примерно так:
просто уточню, чем удобнее писать так чем не писать вовсе (когда ide сама подставит)? Но спор всё же считаю бессмысленным.
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #9 korshunov » 16.06.2021, 05:37

Спора я пока особо не вижу. Есть вопрос к разработчику - зачем в системе применяются пространства имен, если названия классов сознательно сделаны уникальными?

zyxer M
zyxer M
Возраст: 32
Репутация: 77
Сообщения: 419
Зарегистрирован: 03.02.2016
С нами: 8 лет 1 месяц
Откуда: Днепр

Сообщение #10 zyxer » 16.06.2021, 08:27

Пространства имен нужны чтобы названия классов гарантировано не совпали, у нас же классы не только которые мы написали, в зависимостях тоже есть. И второе, я уже написал выше, чтобы реализовать автозагрузку классов.
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #11 korshunov » 16.06.2021, 09:05

zyxer писал(а):И второе, я уже написал выше, чтобы реализовать автозагрузку классов.

Очень странная причина. Автозагрузка классов и пространства имен - вообще говоря, никак не связаны, и друг от друга в общем случае не зависят.

zyxer M
zyxer M
Возраст: 32
Репутация: 77
Сообщения: 419
Зарегистрирован: 03.02.2016
С нами: 8 лет 1 месяц
Откуда: Днепр

Сообщение #12 zyxer » 16.06.2021, 09:13

А можно поподробнее? Как мне загрузить класс, скажем, ProductsEntity, если в нём не будет неймспейса. Т.е. есть файл index.php и Okay/Entities/ProductsEntity.php в котором класс ProductsEntity находящийся в глобальном пространстве имен. Что мне нужно сделать, чтобы я в index.php мог создать экземпляр класса?
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #13 korshunov » 16.06.2021, 09:53

Если Вы привыкли каждый день ездить на работу на своей синей машине, и у Вас изменились обстоятельства - продали ее, или ее украли или крепко сломалась? Методов решения много - можно купить желтую машину и ездить на ней, можно на такси, можно на автобусе, можно на велосипеде, можно пешком. Было бы желание - способов много...

А еще есть масса СMS, которые вообще не используют пространств имен, но ухитряются создавать нужные экземпляры...

А еще есть мануал по PHP, так вот тут
https://www.php.net/manual/ru/language.oop5.autoload.php
рассказывается по автозагрузку БЕЗ упоминания пространств имен, и в примерах там нет никаких пространств имен.

А еще в OkayCMS есть масса мест, где создаются экземпляры таких классов, выглядят они как
$result = new \stdClass();
Это простейший образец...

Будете и дальше утверждать, что без пространств имен нельзя экземпляры классов создавать?

zyxer M
zyxer M
Возраст: 32
Репутация: 77
Сообщения: 419
Зарегистрирован: 03.02.2016
С нами: 8 лет 1 месяц
Откуда: Днепр

Сообщение #14 zyxer » 16.06.2021, 10:22

korshunov писал(а):Будете и дальше утверждать, что без пространств имен нельзя экземпляры классов создавать?
Эмм.. так я не утверждал что без них нельзя, но я какраз подводил разговор к include, который выше вы показали. И теперь посмотрите еще раз на то, что я писал, что класс ProductsEntity лежит в файле Okay/Entities/ProductsEntity.php.

Или мы под каждый тип классов будем придумывать какие-то автолоадеры и прочие велосипеды, лишь бы не использовать автозагрузку по стандарту PSR-4. Зачем???


Вот цитата со статьи https://habr.com/ru/post/458484/
PSR-0 — Autoloading Standard Устарел
После релиза пространства имен в 2009 году, в 2010 году был опубликован первый стандарт, который стал революцией в решении проблем автозагрузки классов и стал первым шагом на пути объединения фреймворков — наличие общей структуры директорий.
Пример реализации
PSR-4 — Autoloading Standard
Прогресс не стоит на месте и в конце 2013 года PHP-FIG публикуют новый стандарт автозагрузки классов. Он может использоваться в дополнение к PSR-0, а также любой другой спецификации автозагрузки. Стандарт также описывает, где размещать файлы, которые будут автоматически загружаться в соответствии со спецификацией. Данный стандарт решает некоторые проблемы/ограничения PSR-0 и используется по умолчанию в Composer.

Говорящая что да, до пространства имен были проблемы. А вы предлагаете к ним вернуться и велосипедить...

korshunov писал(а):А еще есть масса СMS, которые вообще не используют пространств имен, но ухитряются создавать нужные экземпляры...
тут мне кажется ключевое слово "ухитряются". Зачем?

Вообще хорошая практика, если есть желание что-то сделать, задать себе вопрос: "Зачем?". Вот зачем здесь убирать пространства имен и велосипедить свои загрузчики?
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS


Название раздела: Вопросы по работе с OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Вопросы по работе с OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 33 гостя