Интерфейсы и модульность
Запись от CoderHuligan размещена 30.01.2024 в 17:15
Показов 5039
Комментарии 62
|
Слово "интерфейс" происходит от двух слов - inter (между) и face (лицо), т. е. то что находится между лицами. Как взаимодействуют между собой к примеру люди? Посредством языка, т.е. того, что является интерфейсом между двумя и более, лицами. Без интерфейса взаимодействие невозможно. Даже язык жестов является таким же интерфейсом, как и любой другой язык. Сразу отмечу, что любой язык как интерфейс, является чисто внешней сущностью, которая вполне независима от лиц её использующих. Причем одно лицо может пользоваться разными интерфейсами (языками). Итак, любой интерфейс это язык (если он интерфейс). Причем не может быть так, что одно лицо имеет свой уникальный интерфейс, а другое свой. Тогда взаимообщение лиц попросту невозможно или было бы затруднено. Гораздо выгоднее иметь универсальный в рамках какой-то общности интерфейс. Во всяком случае к этому стоит стремиться. Если речь идет о программировании, тот тут мы часто имеем ввиду взаимодействие модулей/классов. Модули в языке Паскаль, по моему, есть чисто искусственное явление. Язык Дельфи это унаследовал. Язык Оберон, потомок Модулы, имеет загружаемые по требованию модули, и это уже большой шаг вперед. Но мы о другом. Классы в ООП, как и модули Паскаля, предоставляют свой интерфейс во внешний мир, делая доступными для него свои паблик поля, или через геттеры и сеттеры, что в общем одно и тоже: мы приоткрываем внутренности модуля/класса внешнему миру. Казалось бы: а как иначе? Как иначе строить взаимодействие между модулями/классами? Проблема тут одна: каждый отдельный модуль/класс предоставляет во внешний мир свой собственный интерфейс, а значит и язык, который обязаны знать все остальные. А я уже писал, что лучше иметь универсальный язык. Проблема возникает, когда мы хотим изменить модуль/класс. Допустим хотим добавить в паблик функцию еще один параметр. Если это сделать, то мы должны будем изменить все модули/классы, которые пользуются интерфейсом этого модуля/класса. Предоставляя внешнему миру даже свои паблик поля, мы связываем этот внешний мир с конкретным классом. Это всегда проблемы. Выходом из положения может быть создание особого языка (именно языка!), который бы разделяли все модули системы. Когда мы вызываем публичную функцию какого-то класса или пользуемся переменной, мы по сути становимся заложниками имен этих сущностей, их типов и их сигнатур. Если бы каждый модуль ничего не знал о других модулях, но просто посылал сообщение и параметры через некий общий для всех интерфейсный модуль, посредством особого универсального языка, то отпала бы необходимость в глобальных данных, что всегда проблемы, а также изменение одного модуля не влияло бы на другие, так как ни один модуль ничего не знает о других, кроме универсального языка, который все модули должны поддерживать. Тогда не потребуются и области имен. Повторяю: один язык лучше, чем много уникальных языков. Ну а реализацию данного механизма лучше поручить особому языку программирования, который бы скрывал детали реализации межмодульного взаимодействия, предоставляя универсальные механизмы по передаче/получении сообщений. Вот это и будет подлинное ООП.. |
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 62
Комментарии
-
Правда это уже нельзя будет назвать полноценным интерфейсом, так как нет второго лица.. Короче каждый модуль думает, что живет один.. Правда он может предполагать, что есть еще кто-то помимо его самого, и общаться с этим "некто", как с воображаемым объектом.. Это состояние - чистейшее сокрытие информации. Мы и сами далеко не знаем, что происходит в голове, у наших ближних, не говоря уж о дальних.. Да и не наше это дело.. Короче говоря, каждый заботится о самом себе, но иногда все же просит помощи от окружающих. И должен её получить.Запись от CoderHuligan размещена 31.01.2024 в 17:54
-
А как же "не должен знать имя модуля"? Т.е. остается жесткая привязка?
Сообщение от CoderHuligan
Так эту роль сейчас выполняют интерфейсы - они интуитивно понятны, читаемы. Нет необходимости лезть в базу. При чем как раз таки минус подхода с применением сообщений, что нет ясного понимания при отладке. Т.е. поймает ваш меседж из за какого то бага другая ловушка и вы замучаетесь ее искать. (утрировано конечно, но тем не менее) это уже из существующего
Сообщение от CoderHuligan
опыта. Плюсы конечно то же есть. Но это и один из пунктов, который учитывается применяем сообщения или просто вызываем с указанием интерфейса, а не класса.
Таким образом вы ставите крест на начальной вашей мысли. Т.е. все же интерфейс вы оставляете, просто теперь этот интерфейс должен подчиняться дополнительным правилам.
Сообщение от CoderHuligan
Ну а вы все равно будете регистрировать. Экземпляры то в любом случае вы должны создавать.
Сообщение от CoderHuligan
Т.е. один фиг нужен интерфейс.PHP 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
//Вася создал class MegaLogger implements Psr\Log\LoggerInterface { } // Петя создал class SomeService{ function __constructor( private readonly Psr\Log\LoggerInterface $logger ) { } public function execute():void { $this->logger->debug('test'); } } // Илья использует это в своем приложении $logger= new MegaLogger(); //.... $service = new SomeService($logger); //... $service->execute(); // Но можно и с переделать на сообщения class EventBus { public function register(string $message, \Closure $handler):void{ } public function emit(string $message, mixed $data):void{ } } // Вася создал class MegaLogger implements Psr\Log\LoggerInterface { function __constructor( private readonly EventBus $eventBus ) { } } // Петя создал class SomeService{ function __constructor( private readonly EventBus $eventBus ) { } public function execute():void { $this->eventBus->emit('log.debug', 'test'); } } // Илья использует это в своем приложении $logger = new MegaLogger(); $service = new SomeService(); $eventBus = new EventBus(); $eventBus->register('log.debug',$logger->debug(...)); $eventBus->register('executeProcess',$service->execute(...)); //...... $eventBus->emit('executeProcess',null);
Вообще не понятно чем хуже?
Сообщение от CoderHuligan
в маленьких задачках просто не используйте. На больших.... это будет жесть вы сами же повеситесь. У меня есть сайт в работе где есть несколько модулей от нескольких разработчиков имеющих одноименные классы. И как тут быть?
Да и сообщения тоже не все так просто... Я назвал сообщение "dev.test" и вы так же.... И что будет делать ваша шина .ообщений? Потому еще в примере выше надо добавлять и от кого сообщение. Потом одно сообщение надо дождаться результата, у другого вообще все пофиг... т.е. на пустом месте вы можете огрести кучу неоднозначностей. все решаемо безусловно, просто я к тому, что то что вы предлагаете, оно уже есть по сути, только оно решает другие задачи, не решает то, что вы озвучили, и не стоит тащить в любой проект без разбора. Потому что легко появится рядом с вашим блогом такой же где будет звучать что то типа

Запись от voral размещена 31.01.2024 в 18:31
-
Дескриптор сообщения привязывается к конкретному модулю, который и породил данный дескриптор. То есть, в модуле мы описываем сообщение, которое потом когда-нибудь будет получено этим модулем и обработано. То есть так он предлагает свой интерфейс внешнему миру. Это не имя модуля, не имя метода и т.п., это просто лексема плюс инфо о параметрах.
Плюс еще и в том, что каждый отдельный модуль может быть реализован на любом языке программирования. То есть мы не завязаны на одну реализацию.
Конечно. И эти правила жестко прописываются в протоколе и в документации на модуль. Так легче тестировать систему. Повторяю: не может быть такого, что сообщение поймает кто-то другой. Кто создал протокол,тот и поймает. Система должна гарантировать уникальность сообщения. А для чего тогда создали COM технологию? Для легкости межмодульного взаимодействия. Именно там уникальные идентификаторы гарантируются системой.
Резонный вопрос, но только при традиционном мышлении. Создать объект, это не значит обязательно лезть в его внутренности. СоздатьЮзера($user); не одно и то же, что и: $user = new Users(); В первом случае мы не знаем имя класса. И нам не нужен доступ через точку. Мы просто посылаем сообщение: $SetNameClient("вася", user);
Загромождают код. Такой код трудно читать.
Не может такого быть.Запись от CoderHuligan размещена 31.01.2024 в 19:03
-
Ну так и сообщения вы должны знать этот дескриптор. Ни чего не меняет - мой код выше легко меняется под это.
Сообщение от CoderHuligan
Это вообще просто хотелка. А так пожалуйста в том же php есть FFI . Можете использовать библиотки (dll) написанные на любом ЯП.
Сообщение от CoderHuligan
Нет ни чем не легче. В доку лезть? а сейчас мне этого не нужно делать. ИДЕ контролирует это "автоматом". В компилируемых еще и компиляция обломается. Тестировать так сложнее. Потому что связи становятся не очевидными.
Сообщение от CoderHuligan
Ну и что вы новго предлагаете, кроме того, что нашли замену "интерефейсу" (правда не отменяя интерфейсы)
Сообщение от CoderHuligan
Вы сравниваете совершенно разные сущности. Непосредственное создание объекта и фабрику объектов. Я могу сделать (и это тоже применяется, что бы было createUser($user) и точно так же по схеме как я приводил выше сделать это с использованием шины сообщений.
Сообщение от CoderHuligan
Сообщение от CoderHuligan
Ну бред же. В коде нет ни какого загромождения от слова совсем. Неймсейсы непосредственно в коде появляются только тогда, когда есть пересечения по именам.
Значит должен быть некий протокол/интерфейс... т.е. пришли к тому, от чего пытались уйти
Сообщение от CoderHuligan
Запись от voral размещена 31.01.2024 в 19:13
-
Проблема в том, что когда мы вызываем код из другого модуля, он тянет за собой зависимости. К примеру в другом модуле функция, которую мы вызываем, оперирует с глобальной переменной в модуле. Если у нас есть переменная с тем же именем, она будет конфликтовать с той. Обходят эти проблемы с помощью неймспейсов, подключаемых файлов и модулей. Но тут возникает вопрос: а зачем? Зачем подключать внутренности других модулей в тело данного? Это же бред чистой воды! Как можно взять иной файл и буквально вписать его внутрь данного? А ведь это и происходит, когда мы подключаем хедеры. Положение спасает, что мы подключаем только интерфейсы. Но всё равно они могут тянуть зависимости. Придумали костыль в виде неймспейсов. Придумали то придумали, но только усложнили жизнь тем, кто разбирает такой код.
А всё потому, что путем простого взгляда на код мы уже не можем четко понять: что от чего зависит без необходимости лезть в другие файлы. И вот это ползание по другим файлам отнимает кучу времени.
В идеале у нас вообще нет никаких подключаемых файлов. А значит нет и зависимостей, неймспейсов, конфликта имен. Более того: у нас теперь нет и компоновщиков(линкеров).. Потому что нечего компоновать. Модуль компилиться отдельно от всех остальных. Каждый модуль грузится по требованию автоматически когда в нем есть необходимость. Вот в чем новизна: в упрощении инструментов. А значит в упрощении поддержки такого кода. Некоторые люди хотят все усложнить, другие упростить. Упрощение не выгодно бизнесу, но выгодно любителям.
После компиляции, допустим, мы создали текстовый файл с asm кодом, который затем можно отдать ассемблеру. Но так как он текстовый, а не бинарный, как сейчас обьектные модули, то его можно поправить в части асм кода, а потом уж отдать ассемблеру. Но это лишь один частный момент из многих возможных моментов которые упрощают жизнь и делают её приятной.
Запись от CoderHuligan размещена 04.02.2024 в 12:47
-
На самом деле, даже накладных расходов можно избежать, если компилятор просто подставит на место операции посылки сообщения реальный вызов необходимой функции из другой области трансляции. Причем эта функция будет"видеть" лишь свою область видимости, в которой определена, а не ту, в которую она подставляется. Но в этом случае придется распрощаться с идеей отложенной загрузки модуля по первому требованию. Короче говоря, надо сделать тестовый ЯП. Сперва игрушечный, но с поддержкой данной концепции. И посмотреть что из этого выйдет..Запись от CoderHuligan размещена 04.02.2024 в 19:05
-
Такие проблемы решают грамотными подходами разработки - глобальные переменные зло.
Сообщение от CoderHuligan
Неймспейсы не для этого.
Конечно. По этому так ни кто и не делает. Что за подключение внутренностей? Зачем?
Сообщение от CoderHuligan
Ну бред же. Тянется только то, что необходимо. Заголовочные файлы по сути это и есть как раз тот метаязык. Просто он вам чем то не угодил, и вы хотите его переизобрести.
Сообщение от CoderHuligan
Не согласен более чем полностью. Попробjвал представить все текущие мои проект без неймспесов... Да ну нахрен.. Такой взрыв мозга будет. Ну просто поясните мне вот Вася в своем модуле сделал класс User, я сделал класс User.... А теперь пишем new User. И?
Сообщение от CoderHuligan
Ну это только если бардак в коде и неграмотное отношение. Я даже не представляю чего тут сложного. Зачем лезть?
Сообщение от CoderHuligan
т.е. если вы видите подключенный заголовок в коде то у вас возникает вопрос что от чего зависит? брррр.....
Из серии создания кнопки "сделать звездато"
Сообщение от CoderHuligan
В чем проблема? Модули хоть обкомпилируйтесь по отдельности. Загрузка.. Ленивая инициализация..... обыденная практика.
Сообщение от CoderHuligan
Не понятно в чем упрощение? В какой то внтуреней магии, которая будет угадывать какой класс User мне нужен?
Сообщение от CoderHuligan
Полный бред. Бизнесу выгодно минимизирвоать вложения в процесс разработки. Это снижение себестоимости. Усложнять разработку и повышать ее стоимость - в чем логика то? Т.е. сидит такой дебил бизнесмен, продает ПО за 100 руб, и думает как бы разработчику (сотруднику) заплатить за это не 50 руб а все 100?
Сообщение от CoderHuligan
Точно так же сейчас вы можете собрать либу, сопроводить ее заголовочным файлом, а я ее смогу использовать в PHP проекте, имея публичный контракт этой библиотеки.
Сообщение от CoderHuligan
Запись от voral размещена 05.02.2024 в 01:43
-
Запись от Usaga размещена 05.02.2024 в 10:36
-
Хм.
Сообщение от CoderHuligan
index.php
создал простенький автолоадер классов для демонстрации, далее создается шина сообщений, регистрируется сообщение и обработчик. Обратите внимание передал именно функцию , вообще безымянную. При этом перед ней есть static. Как раз с этим или без этого - я управляю областью видимости, внутри этой функции - т.е. управляю чего она видеть, как вы и хотели.
EventBus.phpPHP 1 2 3 4 5 6 7 8 9 10 11 12
<?php spl_autoload_register(function (string $className) { include $className . '.php'; }); $eventBus = new EventBus(); $eventBus->register('exec',static function():void { $service= new Service(); $service->process(); }); $eventBus->emit('exec');
создал простенькую шину сообщений. В начале файла вывод строки о том что данный файл подключен.
Service.phpPHP 1 2 3 4 5 6 7 8 9 10 11 12 13
<?php echo "Included: ",__FILE__,"<br>"; class EventBus{ private array $registry =[]; public function register(string $event, Closure $handler):void{ $this->registry[$event] = $handler; } public function emit(string $event):void{ if (array_key_exists($event,$this->registry)) { $this->registry[$event](); } } }
Так же строка, которая просимофорит когда этот файл был подключен. Ну и просто некий класс выполняющий некую бизнес- логику приложения
Итак в файл index.php убираем строку $eventBus->emit('exec');PHP 1 2 3 4 5 6 7 8
<?php echo "Included: ",__FILE__,"<br>"; class Service { public function process():void{ echo "Executed<br>"; } }
Приложение нам выведет. Как виден при вызове index.php подключен только один дополнительный файл
Возвращаем строку $eventBus->emit('exec');Bash 1
Included: /var/www/EventBus.php
Как видим, подключился еще один файл, создался объект и выполнился его метод только когда было отправлено сообщение 'exec'Bash 1 2 3
Included: /var/www/EventBus.php Included: /var/www/Service.php Executed
Вот вам онлайн песочница - можете поиграть этим примером. Я вам дал "игрушечный ЯП"
Запись от voral размещена 05.02.2024 в 12:23
-
Это называется шаблонным мышлением. За создание юзера отвечает единственный модуль. Вася послал сообщение создать нового юзера. Модуль создает его. Надо изменить свойства? Посылаем сообщение $setUserName($id=1, "Petya")
И это не одно и тоже. Мы тут общаемся через интерфейс, который описывает только то, что нам нужно сделать. У нас нет искусственных неймспейсов и имен модулей, имен полей свойств и имен методов.
Если я вижу подключенный заголовок с обьявлениями, то по крайней мере захочу посмотреть а что там ообъявлено.
Не во внутренней магии. А в понятном и прозрачном механизме, который изолирует один модуль от другого. По сути контрактное программирование где спецификации упрятаны внутри компилятора. На верху мы имеем только шину сообщений и реестр сообщений. Так как каждое сообщение по существу является уникальной сущностью, которая описывает часть логики работы программы, то оно совершенно оправданно. Между тем как все эти std и пр. по сути есть неоправданные сущности. То есть чисто искусственные образования только захламляющие листинги ненужными лексемами, и заставляющие программистов лишний раз пробегать глазами по ним, утомляя зрение и теряя время.
Чем сложнее инструменты, тем меньше конкуренции, тем больше зарплаты, в том числе и выше прибыль из-за завышенных цен на ПО.
Только под конкретный язык. В моей схеме, можно пользоваться библами из любого языка, который поддерживал бы систему.
Я и на Си мог бы нечто подобное сделать. Эмулировать можно, кто бы сомневался. Только смотрите сколько ненужных телодвижений вы тут нагородили.
Но вы молодец. Я бы так не смог. На php писал только с процедурном стиле. Сейчас изучаю javascript. Круто, ничего не скажешь..Запись от CoderHuligan размещена 05.02.2024 в 16:09
-
Уточню. Каждый модуль может зарегистрировать некий алиас - имя сообщения, количество и тип параметров. Это для экспорта. Модуль,который что-то импортирует, просто передает сообщение в виде этого алиаса(псевдонима) реальной функции некоему серверу, который и вызывает реальную функцию в другом модуле. То есть, с точки зрения организации кода мало что поменялось. Просто нам теперь ненужно подключать другие модули явно. А так как при регистрации сообщений происходит проверка на уникальность, то мы избавляемся от конфликтов имен. То есть в каждом модуле код можно писать не думая об этом. Это спасает от трудноуловимых ошибок при файловой организации о чем упоминал Страуструп в своей книге. Глобален у нас только метаязык сообщений. Данные передаются традиционно, либо по значению либо по ссылке.Запись от CoderHuligan размещена 05.02.2024 в 17:55
-
Это называется реальным проектом:
Сообщение от CoderHuligan
1. Могут быть использованы готовые модули сторонних разработчиков. С вашим подходом это становится не возможным, да и в большой распределенной команде становится затруднительным
2. Единственный модуль отвечающий за пользователя, в большом проекте эта архитектурная ошибка, которая может привести к неоправданной не стабильности. Предположим вы ради чатика внутри приложения решили добавить цвет аватарки пользователя. Изменяете тот класс который отвечает и за авторизацию.... задача простая - можно поручить джуну..... и он благополучно делает дыру в системе авторизации..... Нет... Для мелких проектиов единый класс возможно оправдан, но вот разделение по зонам ответственности весьма оправдано. Это только в представлении неопытного "шаблонное мышление". В реальности же это опыт проблем проектов.
Так что вопрос в силе. У нас подключен сторонний модуль- он отлично работает. И имеет свой класс User. И у нас в проекте есть такой класс. Как вы будете разруливать?
Очевидно у вас уйма свободного времени
Сообщение от CoderHuligan

1 Современные ИДЕ подсветят если подключено нечто. что не используется.
2 Хороший нейминг дает представление о том, что подключено
Вам уже несколько раз в этой теме сказали, что это уже давно изобретено и применяется
Сообщение от CoderHuligan
Это возможно только в очень мелких проектах.
Сообщение от CoderHuligan
Бред более чем. Сомневаюсь, что вы найдете тех кто много работает над реальными проектами и согласится с вами.
Сообщение от CoderHuligan
Вы не избавитесь от неймспейсов по сути - вы просто будете выдумывать более длинные имена классам, чтобы обеспечить их "уникальность"..
К пример, по объективным причинам в проекте нам понадобился такой класс:
External\Accounting\User - т.е. неймспейсы дают важную информацию о том что это за класс.
Вам же придется писать ExternalAccountingUser Пока примерно одинаково, привычный вариант более читаем на мой взгляд (но да ладно - это вкусовщина)... Только вот я могу в коде писать (при использвоании этого класса) такие варианты в зависимости от ситуации
External\Accounting\User
Accounting\User
User
+ еще возможность алиасов
у вас же всегда будет длинное ExternalAccountingUser
И это еще простенький с тремя уровнями.. АВ большом проекте у вас появятся классы и по 70 символов, ради "уникальности"
Полная глупость. Если бы вы были правы сейчас бы был только ассемблер, или вообще в машинных кода писались программы. Между тем та же Java - по сути рождена (утрировано) для ускорения разработки в ущерб производительности .
Сообщение от CoderHuligan
Кто вам это сказал? Хорошо, что я не знал, а то б у меня не получилось: написал на сях либу самую простейшую, и подключил ее в PHP проекте... Подскажите как надо указывать целевой ЯП?
Сообщение от CoderHuligan
Какие тут телодвижения лишние?
Сообщение от CoderHuligan
Запись от voral размещена 05.02.2024 в 20:05
-
По сути я это и продемонстрировал.
Сообщение от CoderHuligan
1 Проверка это лишь проверка. Но, что будет если уникальность нарушена
Сообщение от CoderHuligan
2. Вы регистрируете уже модули просто иначе - меняется только синтаксис
Это и сейчас так.
Сообщение от CoderHuligan
Это все только на словах. Пока вы не поясните как вы разрулите конфликты имен - нет смысла даже обсуждать... Это лишь ваша хотелка, без минимальной попытки предложить как это реализовать хотя бы на пальцах. Т.е. либо магия, либо все разработчики во всем мире должны будут все согласовывать друг с другом порождая имена либо вообще представляющие их себя безумный хеш, либо "слово" в 150 символов.... и то и то ведет к убийству понимания кода на практике.
Сообщение от CoderHuligan
Только надо иметь ввиду ради мелких проектов вообще нет смысла парится. А в сложных вы замучаетесь с вашим подходом. Не очевидно будет практически все.. А код будет представлять из себя трудночитаемые простыни.
Вообще вам стоит углубиться в понимание пространства имен и постраться понять какие проблемы они решают, а так же познакомится с паттернами шина сообщений, и еще еще немного и вы будете изобретать сервислокаторыЗапись от voral размещена 06.02.2024 в 01:43
-
Вася создал модуль с классом "user". Федя создал модуль (библиотеку) с названием "user". Нам требуется подключить два этих модуля к своему проекту, в котором у нас также есть "user". Мы просто создаем свой алиас для каждого подключаемого модуля. Системная функция каждому подключаемому модулю дает идентификатор-число. Оно привязывается к алиасу. Поэтому разрешение имен идет на внутреннем уровне без участия программиста. Его дело создать алиас, а система подскажет уникален ли он на уровне проекта или нет. Так что никаких проблем тут нет.
Однако, согласен, что придется применять этот алиас к сообщению, иначе трудно понять каким образом подключать библиотеки.Запись от CoderHuligan размещена 10.02.2024 в 10:11
-
Ну т.е. не будет ни какого ухода от неймспейсов. будет тоже самое только по другому. Многословно и будет разброс. Смотрите: теперь углубляемся. Все три модуля используют четвертый (один и тот же модуль, например шифрующий модуль, назовем его hash. И во всех трех случаях ему дадут свои алиасы, система это все три раза зарегистрирует.
Ну допустим вы научите где то под капотом это все "разруливать". Но это будет дополнительная логика. Являющаяся по сути костылем. Да и,по большому счету, все придет к тому, что будет все тоже самое как и с неймспейсами только сложнее.
В итоге будет все гораздо запутаннее и не надежнее.
Профита вообще ни какого. При этом,если код всех модулей открыт, надо будет еще и разбираться в этих алиасах, чтоб не запутаться. т.е. в конечном итоге сообщество (кто рискнет такой подход применять в реальных проектах) придет к тому,что договориться стандартизировать алиасы и они будут выглядеть как сейчас неймспейсы.
Опять же то что я выше уже приводил
я могу сейчас с неймспейсами в коде писать
External\Accounting\User
Accounting\User
User
+ еще возможность алиасов
у вас же всегда будет длинный алиас ExternalAccountingUserЗапись от voral размещена 10.02.2024 в 13:17
-
неймспейс сродни почтовому адресу. Вы в зависимости от контекста можете говорить по разному: и начиная с города, а иногда достаточно номер квартиры сказать. Вы же предлагаете адрес заменить "алисасом". Т.е. я даже стоя рядом с нужной квартирой должен буду обратиться на госуслуги , чтоб мне расшифровали.Запись от voral размещена 10.02.2024 в 13:19
-
Да. На уровне модуля создается свой алиас. Но я бы хотел и от этого уйти, так как каждое действие уникально на уровне системы. Бессмысленно полагать, что в системе должны быть две функции с одинаковым поведением.
На самом деле это просто ужас для тех кто будет рефакторить. Сейчас программисты больше читают, чем занимаются реальным кодингом. Потому что надо понимать системы. Ну давайте писать для каждой функции предваряя её имя информацией в каком файле она находится с полным путем. Понравится такое читать? Да никому. А неймспейсы это тоже самое на уровне всех имен..
Да. Расшифровкой что где лежит должен компилятор заниматься.
Имена данных не уникальны на уровне модулей. Но модули обмениваются ими на уровне ссылок. Опять же: нет никаких проблем с этим.Запись от CoderHuligan размещена 14.02.2024 в 13:34
-
Ну вот есть у меня функция printf(). Нет никакого смысла заключать её в неймспейс типа std или нечто подобного, потому что её поведение уникально. Имя уже зарегистрировано системой. И если кто-нибудь напишет свою реализацию с тем же именем в своем модуле, то система увидит два одинаковых имени при регистрации модуля и выдаст ошибку. При этом либо автоматически изменит ее имя, либо программист подберет необходимый алиас самостоятельно. Но у нас не будет этого ужаса.Запись от CoderHuligan размещена 14.02.2024 в 13:49
-
Кто вам это сказал?
Сообщение от CoderHuligan
ВЫ проводили масштабный опрос на эту тему или так думаете?
1 Это не одно и тоже
Сообщение от CoderHuligan
2 Что со мной не так? Что что, а вот нейспейсы не доставляют вообще ни каких сложностей (если, конечно, они не пишутся для каждого класса в каждой строчке (т.е. без использования use)
Ну не совсем "компилятор". Просто вы в другой точке будете регистрировать. А я в начале файла добавлю use. При этом сделаю так, чтоб было максимально удобно в контексте данного класса/файла.
Сообщение от CoderHuligan
Только я в другой проект более спокойно перенесу этот файл, а вы будете методом "научного тыка" искать чего еще незарегистрировали. Разве нет?
Я вообще не понимаю какие проблемы вы нашли в неймспейсах...
Запись от voral размещена 15.02.2024 в 02:20
-
Ну прям пипец какое усложнение
Сообщение от CoderHuligan
1 Не нравится поведение возьмите другой ЯП. В PHP echo,print,spritf и тп. в глобальном пространстве
2 И опять же не понял про ошибку при создании подобной. Все ровно точно так же и с неймспейсами. Если создать функцию в области видимости в которой такая уже есть - вызовет ошибку (если, конечно, том контексте не может быть перегрузки)
Т.е. будет магия ухудшающая отладку. Скажем "переименовла" ваша система создав алиас. автоматически. Но разработчик об этом ни чего не знает. И, особенно если в проекте нужны обе реализации, хрен он угадает какая функция будет вызвана.
Сообщение от CoderHuligan
Кроме того, код станет на много сложнее выглядеть. т.к. вместо
будетCode 1 2
a=sqrt(10); print(a);
т.е. даже на таком простеньком примере мы уже видимCode 1 2
emit('sqrt',a,10); emit('print',a);
1 серьезная потеря читабельности
2 дополнительные расходы процессорного времени
3 Это еще не учитываем то, что есть только один глобальный неймспейс. и при этом вы вынуждены будете придумывать длинные имена функциям. ибо может быть такая ситуация в рамках одного кода
Что в этом коде не так? Заметили? Удобно читать?Code 1 2 3
emit('sqrt',a,10); emit('print',a); emit('print',a);
Так вот по моей задумке первый print это стандартный, а второй самодельный. Но ведь алиасы создаются автоматом и на момент программирования я их не знаю, неймспейсов у меня нет, называть функцию VoralAlternativesPrint не правильно т.к. это не будет ни чем отличаться от неймспецсов......
При этомвсе ради непонятно чего т.к. по сути ни чего не изменилось: в обоих случаях мы вызываем некие функции просто разный синтаксис. Плюс, в вашем случае, под капотом это прогоняется через дополнительную сущность. Хотя вообще ни чего не мешает, оставив "мой" синтаксисис, под капотом компилятора/интерпретатора использовать хоть событийную модель хоть какую.Запись от voral размещена 15.02.2024 в 08:14




