Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интерфейсы базовых классов. Давайте обсудим? IStrings, IDataset, IField 
:(
    Опции темы
Bose
  Дата 14.4.2009, 02:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Давайте обсудим идею.

Я вот тут подумал, что здорово было бы, если бы в Дельфи были определены интерфейсы для базовых классов. Например, был бы интерфейс IList, реализуемый классом TList. IStringList, реализуемый TStringsList и т.п. А особенно классно, было бы если бы были определены интерфейсы реализующие взаимодействие с компонентами.

Например интерфейс:
Код
ICaptionedControl = interface
  property Caption:string;
end;


Если бы все контролы, имеющие свойство Caption(например TLabel; TButton; TCheckBox; TRadioButton; TGroupBox; TBitBtn; TSpeedButton), реализовывали его, было бы намного проще изменять и считывать у них Caption. Хотя, подобное на практике нужно только, когда начинаешь реализовывать собственный механизм перевода программы.

Пример с Db-control-ами

Более полезным было бы применение интерфейсов в Db-контролах. Например, имея интерфейсы:
Код
IDataSourceProperty = interface
  property Datasource: Idatasource;
end;
IDataFieldProperty = interface
  property DataFieldName:string;
  function GetDataField: IField;
end;

IReadOnly = interface
  property ReadOnly: Boolean;
end;


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

А то сейчас, чтобы реализовать что-то подобное, приходится либо использовать TypInfo, либо проверять классы вручную:
Код

procedure ValidateControlsField(Sender: TObject);
var
  tmpField: Tfield;
begin
If aControl is TDbEdit then
  tmpField := TDbEdit(aControl).DataField
else If aControl is TDbMemo then
  tmpField := TDbMemo(aControl).DataField
else If aControl is TDbComboBox then
  tmpField := TDbComboBox(aControl).DataField;
end;


А всё потому, что TDbEdit наследуется от TCustomMaskEdit, TDbComboBox от TCustomComboBox, а TDbMemo от TCustomMemo.

В случае с интерфейсами, код выглядел бы примерно так:
Код

procedure ValidateControlsField(Sender: TObject);
var
  tmpDataFieldPropertyI: IDataFieldProperty;
begin
  if Supports(Sender, IDataFieldProperty, tmpDataFieldPropertyI) then
  begin
    // работаем с Tfield, точнее IField
  end; 
end;


Где ещё это было бы полезно?
Если в приложении вместо приведения типов, использовать интерфейсы, это увеличит возможность повторного использования кода.

При создании расширений(плагинов).

Можно было бы вводить поддержку плагинов, использующих функционал классов, без возни с COM или BPL(которые требуют, чтобы и exe и bpl были скомпилированы одной версией компилятора).

Автоматическое уничтожение объектов. Вводить меньше кода.

Вместо того, чтобы писать так:
Код

procedure SomeProcedure; 
var tmpSL: TStringList; 
begin 
  tmpSL:= TStringList.Create; 
  try 
    // работаем с tmpSL
  finally 
    tmpSL.Free; 
  end; 
end;


Можно было бы писать так:

Код

procedure SomeProcedure;
var tmpSL: IStringList; 
begin 
  tmpSL:= TStringList.Create; 
  // работаем с tmpSL
end; // tmpSL будет автоматически освобождена.


Самое главное

Станет намного легче менять реализацию. Если работа будет идти через интерфейсы, то станет намного проще заменить один класс другим. Особенно в случае замены одного набора компонентов, другим. 

Например:

Сейчас у меня в проектах используются стандартные Db-контролы(TDbEdit, TDbComboBox). Чтобы заменить из на другие аналогичные Db-контролы(например Ehlib-овские), придётся заменить компоненты на форме, а также пройтись по коду в поисках явной проверки типов(if Sender is TDbEdit then …). Если бы были интерфейсы, и в коде использовались они, то, многое бы работало без изменений.


Давайте обсудим

Что вы думаете об этой идее?

p.s. У Delphi появился форум на UserVoice. И я добавил туда эту идею. Пожалуйста проголосуйте за неё(можно голосовать без регистрации):
Add interface support for basic VCL classes

p.p.s. Если не сложно, то проголосуйте ещё за поддержку Firebird в Delphi.(навряд ли это, что-то изменит, но ведь попытка - не пытка.=))

p.p.p.s. Cross-post из моего блога.


Это сообщение отредактировал(а) Bose - 14.4.2009, 03:00
PM MAIL WWW Skype   Вверх
pseud
Дата 14.4.2009, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Bose @  14.4.2009,  02:54 Найти цитируемый пост)
Давайте обсудим идею.

Цитата(Bose @  14.4.2009,  02:54 Найти цитируемый пост)
Я вот тут подумал, что здорово было бы, если бы в Дельфи были определены интерфейсы для базовых классов.

Поддерживаю.
Ибо SetOrdProp, SetFloatProp, GetVariantProp (TypInfo) - хоть и делают свое дело, но с интерфейсами было бы куда легче, гибче и красивее.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
THandle
Дата 14.4.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Все это прекрасно, я полностью поддерживаю... Но мне кажется что никогда этого не сделают =)
PM   Вверх
jsa
Дата 14.4.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: 1
Всего: 20



Поддерживаю, проголосовал  smile 


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
cemick
Дата 14.4.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 416
Регистрация: 6.7.2006
Где: Санкт-Петербург

Репутация: 2
Всего: 6



Это было бы удобно, в каждом крупном проекте приходится что то подобное каждый раз реализовывать
PM MAIL WWW   Вверх
Keeper89
Дата 14.4.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Согласен, идея отличная.


--------------------
PM MAIL WWW   Вверх
Bainer
Дата 17.4.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi МаньяК



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 14.6.2008

Репутация: нет
Всего: нет



Согласен, проголосовал и за Интерфейсы и за FB
PM MAIL   Вверх
Лапоть
Дата 17.4.2009, 21:33 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: нет
Всего: 2



Цитата(Bose @  14.4.2009,  02:54 Найти цитируемый пост)
если у пользователя нет прав на работу с определённым полем в базе
То кто/что мешает просто либо сделать колонку в гриде невидимой, либо отселектить данные соответствующим образом?
Дискуссия напомнила старую байку о том, кем бы была бабушка, если бы у неё ... 

PM MAIL   Вверх
Alexeis
Дата 17.4.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Плохо голосуем товарищи. Я уже 2 раза успел по +3 поставить smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Bose
Дата 18.4.2009, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Спасибо всем, кто проголосовал! 
Тема, наконец вышла на первую страницу форума. Теперь её будет проще заметить. =)

Хорошая новость номер 2. Codegear наконец-то просмотрели указанные там идеи, и присвоили некоторым статусы Accepted и Under Review, что говорит о том, что тот форум всё-таки просматривается.

Может у кого-нибудь есть, ещё какие-нибудь примеры того, какими могли бы быть интерфейсы. Будет здорово, если Вы их напишите(на UserVoice или здесь).


Цитата(Лапоть @  17.4.2009,  20:33 Найти цитируемый пост)
То кто/что мешает просто либо сделать колонку в гриде невидимой, либо отселектить данные соответствующим образом?
Дискуссия напомнила старую байку о том, кем бы была бабушка, если бы у неё ... 

Лапоть, не в тему. Ничто не мешает. 
Проблемы нет. Есть идея, о том как сделать работу удобнее, и кое-какие примеры. 
PM MAIL WWW Skype   Вверх
bems
Дата 18.4.2009, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



ну чтобы использовать автоматическое уничтожение объектов мало поддержки интерфейсов ,нужно еще наследоваться от TInterfacedObject, а это хоть и не значительное, но все-же изменение в иерархии.

Кроме того это
Цитата(Bose @  14.4.2009,  02:54 Найти цитируемый пост)
procedure SomeProcedure;
var tmpSL: IStringList; 
begin 
  tmpSL:= TStringList.Create; 
  // работаем с tmpSL
end; // tmpSL будет автоматически освобождена.

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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Лапоть
Дата 18.4.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: нет
Всего: 2



Цитата(Bose @  18.4.2009,  03:26 Найти цитируемый пост)
Лапоть, не в тему. Ничто не мешает. 
Проблемы нет. Есть идея, о том как сделать работу удобнее, и кое-какие примеры.

Так я и высказал своё мнение по этому вопросу. Ежели оно вам не понравилось - извиняйте!
PM MAIL   Вверх
CodeMonkey
Дата 18.4.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(bems @  18.4.2009,  02:58 Найти цитируемый пост)
ну чтобы использовать автоматическое уничтожение объектов мало поддержки интерфейсов ,нужно еще наследоваться от TInterfacedObject

Не обязательно - как альтернатива: можно реализовать эту функциональность в первом классе с интерфейсом по ветке наследования.

2 Bose: а чего ж на QC не добавил как suggestion?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Bose
Дата 18.4.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(CodeMonkey @  18.4.2009,  12:41 Найти цитируемый пост)
2 Bose: а чего ж на QC не добавил как suggestion? 

Мне очень не нравится интерфейс QC. =(

Но я кое-как разобрался, и с помощью встроенной в Delphi штуки с мегаужасным интерфейсом запостил репорт: QC#73087. Имеющие аккаунт и голоса там, да будут услышаны.  smile 

PM MAIL WWW Skype   Вверх
kemiisto
  Дата 18.4.2009, 15:46 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 16
Всего: 160



Bose, читал-читал и так ничего и не понял. smile Проголосовал за вещи, которые считаю более важными. smile 



--------------------
PM MAIL WWW GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1275 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.