|
|
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Задачи проекта требуют внедрения Интерфейсов, в основном ради “Интерфейсов”, а не ради автоматических объектов. Вопрос к тем, кто активно это использует и может подсказать про сильные и слабые стороны. Пока плохо разбираюсь в теме, ... лишь вижу, что исторически в основе Delphi(VCL, RTL) сильно преобладает программирование на динамических объектах, как и в моем проекте. Но новые задачи требуют много “абстракций”. Скорей всего активное внедрение интерфейсов, потребует изменить подход к программированию. Здесь нужно понять: Какие подводные камни? Какая “выгода”, и какие ”неожиданности”? Какие варианты решений? В help-у только техническая сторона вопроса, вроде, все просто в примерах. Но, во что это выливается на крупном проекте? Многие delphi-блогеры жалуются на несовершенство ARC, якобы требует излишней аккуратности и внимания. Кто-то предлагает поставить базовую заглушку (как это сделано в TComponent)... якобы снимает часть проблем. Заранее спасибо, за любую информацию по теме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 17:56 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, Интерфейсы имеют 2 особенности: - абстракция - подсчёт ссылок Встречал проекты, где нужна абстракция. Какие тогда могут быть альтернативы? В целом интерфейсы очень удобны, когда у одного и того же объекта может быть несколько хранилищ, он может мигрировать из одного в другое, в этом смысле конечно ARC убирает уйму головной боли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 18:12 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Важное уточнение: тема касается именно Delphi-программирования без Com-технологии . ОС: Windows SOFT FOR YOU, спасибо за ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 18:26 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
[del] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 18:27 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU Встречал проекты, где нужна абстракция. Какие тогда могут быть альтернативы? Не знаю, какая альтернатива, м.б. переход к интерфейсам - даже к лучшему. Но, к чему быть готовым? Где-то на блогах было мнение, что работать с динамическими объектами(не забыть поставить .Free) требует меньше внимания, чем следить за комбинациями объектных и интерфейсных ссылок. ARC - это хорошо, но оправдывает ли она себя в Delphi? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 18:47 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, Используй интерфейсы без COM. Можно прикручивать библиотеки, написанные на других языках с++ и c#. В Delphi связка с java под андроид написана на интерфейсах. Есть некоторые особенности работы с ними, но есть отладчик и можно им воспользоваться. Основная проблема с интерфейсами в том, что они живут до тех пор, пока есть ссылки на него и уничтожаются не тогда, когда программист хочет, а когда кол-во ссылок = 0. Можно отключить arc, написав объект заглюшку. Тогда надо будет приводить интерфейс к классу и его уничтожать в ручном режиме. Еще есть safecall и автоматическая обработка ошибок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 18:54 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Интерфейсы только ради интерфейсов использовать не следует. По той простой причине, что у них реализация не связана с контрактом. Т.е. если у вас есть код работы с каким-то интерфейсом, то чисто по коду вы никак не узнаете, что происходит на самом деле. Вам придётся запустить программу, чтобы увидеть какая именно из реализаций интерфейса будет передана/использована. С просто объектами/классами такой проблемы нет, ну или она не стоит так остро: Ctrl + щелчок переместят вас в реализацию. Проблема может быть только с виртуальными методами. Используйте интерфейсы только там, где вам нужны их плюсы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 19:09 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, COM это надстройка над интерфейсами Совсем не обязательно использовать COM Реализация интерфейсов в Delphi - прекрасная. Если не ошибаюсь, Delphi стал первым языком, где интерфейсы стали поддерживать ARC. В плюсах приходится подсчитывать ссылки самостоятельно. Минусы интерфейсов есть. Но я даже не буду о них говорить, дабы не забивать голову лишним мусором ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 19:22 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
ziv-2014 Можно отключить arc, написав объект заглюшку. Тогда надо будет приводить интерфейс к классу и его уничтожать в ручном режиме. А такой вариант: Базовая заглушка + вся модель на динамических объектах(как VCL), а интерфейсы только по требованию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 19:24 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
GunSmoker Используйте интерфейсы только там, где вам нужны их плюсы. В проекте конструируются сложные абстрактные сущности. Даже стоял вопрос о переносе части реализации на С++, но вроде Delphi должна справиться, особенно если заранее знать о “подводных камнях.” Спасибо, что обратили внимание на тему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 19:40 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Artem.1st ziv-2014 Можно отключить arc, написав объект заглюшку. Тогда надо будет приводить интерфейс к классу и его уничтожать в ручном режиме. А такой вариант: Базовая заглушка + вся модель на динамических объектах(как VCL), а интерфейсы только по требованию? Это говнокинг и лучше так без надобности не делать. Так можно делать, если есть необходимость прибить объект в ручном режиме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 20:51 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Artem.1st А такой вариант: Базовая заглушка + вся модель на динамических объектах(как VCL), а интерфейсы только по требованию? Нормальный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 21:26 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Artem.1st Задачи проекта требуют внедрения Интерфейсов, в основном ради “Интерфейсов” Я встречал мало задач, в которых были бы нужны или удобны "интерфейсы ради интерфейсов". В основном такое возникает у людей, обчитавшихся бандитов и иллюстрирующих принцип "когда у тебя в руках молоток, все задачи похожи на гвозди". Как правило, если хорошо подумать над архитектурой, количество интерфейсов стремительно уменьшается, а управляемость и прозрачность приложения значительно увеличивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 22:00 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
softwarer, +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2020, 22:16 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
softwarer Как правило, если хорошо подумать над архитектурой, количество интерфейсов стремительно уменьшается, а управляемость и прозрачность приложения значительно увеличивается. Если с плагинами, интерфейсы все же намного удобнее чем flat API. Ну и как уровень абстракции для сущностей типа ProgressBar, чтобы отвязаться от визуальной реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2020, 00:05 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис Если с плагинами, интерфейсы все же намного удобнее чем flat API. Я не знаю, что такое flat api, но в случае плагинов ни малейшей необходимости в интерфейсах не вижу - до тех пор, пока плагины пишутся на той же дельфе, интерфейсы только мешают. Если речь о сервере а-ля MS Word - тогда да, конечно, интерфейсы - то, что доктор прописал. Соколинский Борис Ну и как уровень абстракции для сущностей типа ProgressBar, чтобы отвязаться от визуальной реализации. А смысл? Интерфейс для сущностей ProgressBar подразумевает, что будет какой-то объект, который будет держать в себе указатель PBar: IProgressBar и время от времени вызывать что-нибудь типа PBar.ShowProgress(50). В общем-то, изрядная порнография. Куда правильнее сделать ProgressNotification, и пусть на него подписывается хоть ProgressBar, хоть LogWriter. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2020, 00:12 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
softwarer, Ну конечно Все вокруг дебилы. Используют интерфейсы Один ты молодец ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2020, 00:26 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
softwarer до тех пор, пока плагины пишутся на той же дельфе... softwarer Куда правильнее сделать ProgressNotification Т.е. вместо простой реализации из двух сущностей добавлять третью - контроллер нотификаций а-ля TDataSource? Может в этом что-то и есть, но я не сталкивался с задачами, где бы это требовалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2020, 00:27 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис Плагины на то и плагины, чтобы их можно было писать на чем угодно. Плагины нужны для решения конкретных задач. Если делать систему, плагины к которой будет писать широкий круг покупателей своими силами - интерфейсы абсолютно уместны. Но сколь я видел таких проектов, в итоге плагины к ним писал только автор универсального подхода, а покупатели в лучшем случае говорили "а напишите нам такое вот, мы заплатим". В то же время плагины - хорошая альтернатива монолитной архитектуре и для внутренней разработки. Но при этом все пишут на дельфе и интерфейсы становятся пятым колесом. Соколинский Борис А чем это правильнее? Система становится более гибкой, модули - менее связанными, не строящими ненужных предположений друг о друге, абстракции - более естественными. В исходном варианте "объект" знает, что существует какой-то "прогрессбар", который ему надо пинать. Если нам нужно убрать прогрессбар из приложения - ну вот стал он не нужен - нам приходится править объект. В случае notification-а - мы просто убираем подписку, объект неизменен. Теперь допустим, что мы хотим пока идёт операция, каждую минуту писать в лог "процесс ещё не умер и не завис". В случае notification-а - мы вешаем подписку, которая это делает, в исходном случае - заставляем logwriter-а притвориться прогрессбаром, хотя он ну совершенно не прогрессбар. Теперь, когда нам потребуется одновременно рисовать прогрессбар и писать в лог - в исходном случае придётся либо добавлять в объект PBar2: IProgressBar, чтобы везде в коде скопировать вызовы ShowProgress, либо рожать прокси-объект, который для объекта притворится прогрессбаром, а внутри себя будет пинать как настоящий прогрессбар, так и лограйтер. В общем, одна сплошная порнография - и всё из-за нежелания воспользоваться notification-ами :) Соколинский Борис Может в этом что-то и есть, но я не сталкивался с задачами, где бы это требовалось. Это, конечно, тоже своего рода молоток - когда начинаешь так делать, обнаруживаешь много задач, которые можно и стоит сделать так, хотя до того обходился иначе. Но в результате и приложение становится лучше по функционалу/интерфейсу, и код - лучше по читаемости/сопровождаемости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2020, 00:51 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
softwarer Но при этом все пишут на дельфе и интерфейсы становятся пятым колесом. Соколинский Борис Теперь допустим, что мы хотим пока идёт операция, каждую минуту писать в лог "процесс ещё не умер и не завис". По самой сути, они должны быть супернадежными и писаться даже когда все что могло упасть уже упало. А если упал контроллер нотификаций... Но это так, теоретизирование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2020, 01:15 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис У меня не раз и не два были случаи, когда нужно интегрировать некое оборудование с SDK в виде C++ объектов На Delphi всё же редко пишут SDK к оборудованию. Соколинский Борис что хочешь с ними, то и делай. Не удивлюсь, если это универсальный вариант, позволяющий работать с этим оборудованием из-под юниксов - в отличие от интерфейсов, привязанных к винде. Так что, возможно, здравое и грамотное решение. Соколинский Борис С логами, ИМХО, не очень удачный пример. Он, конечно, крайне условный. Но сама по себе иллюстрируемая им потребность - вполне реальна. Как бы это сказать... "Прогресс" - это факт. "Прогрессбар" - это интерпретация факта. Жёсткая связь факта с интерпретацией - слабое звено в архитектуре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2020, 01:43 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
softwarer На Delphi всё же редко пишут SDK к оборудованию. softwarer Не удивлюсь, если это универсальный вариант, позволяющий работать с этим оборудованием из-под юниксов - в отличие от интерфейсов, привязанных к винде. Так что, возможно, здравое и грамотное решение. softwarer Но сама по себе иллюстрируемая им потребность - вполне реальна. Как бы это сказать... "Прогресс" - это факт. "Прогрессбар" - это интерпретация факта. Жёсткая связь факта с интерпретацией - слабое звено в архитектуре. Развивая предыдущий пример: предположим, возникла потребность рядом с прогресбар-ом поместить кнопку "Cancel". В случае двух-сущностной архитектуры это модифицируется просто: добавляем к имплементации IProgressIndicator IProgressCanceled, в процессе проверяем его наличие и состояние. Все. А если есть контроллер нотификаций возникает дилемма - в случае асинхронной реализации процесс не узнает, что его остановили, в синхронной - какой-то получатель может заблокировать работу всего сразу. И т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2020, 01:57 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Я так понял, один из собеседников не работал в сколько-нибудь сложных проектах и считает своим долгом рассуждать об инструментах, которые в его сфере не применимы Если нужно множественное наследование - нет других инструментов кроме интерфейсов. Для плагинной системы средней сложности тоже нет альтернатив. Мне довелось работать над крупным проектом, где часть написана на Delphi, а часть на C#, и вызовы мигрируют из одних интерфейсов в другие. Конечно интерфейсы используют для ARC в первую очередь. Здесь так же нет альтернатив. Но зачем с серьёзным видом рассуждать об инструментах, цель которых больше, чем твои задачи - мне, честно говоря, не понятно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2020, 02:05 |
|
||
|
Интерфейсы. Сравнение ARC и Pure. Какие предпочтения ?
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис На Delphi пишут программы, которые используют SDK к оборудованию. Безусловно. Но это перпендикулярно вопросу "как реализовывать api в программе, подключающей плагины". Соколинский Борис То что я видел, было скорее от лени сделать по-человечески. Возможно. Не возьмусь судить. Соколинский Борис Но важно не это, а насколько вообще корректно привязывать плагины к конкретной среде разработки (и тем более ее версии). Мне кажется, я ответил - ровно настолько, насколько можно предсказать круг писателей плагинов. Соколинский Борис Развивая предыдущий пример: предположим, возникла потребность рядом с прогресбар-ом поместить кнопку "Cancel". В случае двух-сущностной архитектуры это модифицируется просто: добавляем к имплементации IProgressIndicator IProgressCanceled, в процессе проверяем его наличие и состояние. Все. Боюсь, это решение ниже всякой критики. Смотрите сами: прерывать процесс - это потребность, которая может возникнуть где угодно. Без всякой связи с прогрессбаром. Запихивать его в прогрессбар - это примерно то же самое, что у TForm-а сделать метод ExecSQL. Теперь если мы захотим, допустим, повесить watchdog timer, который прервёт процесс по таймауту - этому таймеру надо будет притвориться progressbar-ом. И ещё отдельно - то, что не вызывающий сообщает процессу о необходимости прерваться, а сам процесс вынужден тратить время на некие периодические опросы. Соколинский Борис А если есть контроллер нотификаций возникает дилемма Не возникает. В случае нотификаций, если Вы хотите реализовать подобную вывернутую идею с опросом, всё делается очень просто: делается другое оповещение (ProcessCancellationCheck). Процесс когда хочет дёргает его. Ваша кнопка - подписывается на него и сообщает свой статус "да, меня нажимали". И watchdog timer тоже подписывается и сообщает свой статус - "да, время вышло". Но это, конечно, если предположить, что у процесса (или его контроллера) по каким-то причинам нет метода Cancel, который выглядит наиболее логичным решением для этого случая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2020, 02:12 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40007387&tid=2037929]: |
0ms |
get settings: |
5ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
34ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 194ms |
| total: | 287ms |

| 0 / 0 |
