Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

помогите определиться с форматом функции


Страницы:   1 2 3

dev888 ©   (2011-10-26 15:15:00) 

нужно написать функции (API), которые были бы максимально удобными для перемещения по товарам магазина (GoToFirstProduct, GoToNextProduct, GoToPreviousProduct, GoToLastProduct). Нужно предусмотреть возврат идентификатора товара, а также возможность перемещения к товару. Как это лучше сделать, чтобы не писать еще и функции EOF, BOF? Пока что думаю так:


function GoToFirstProduct(out ProductId: Integer): Boolean;
function GoToLastProduct(out ProductId: Integer): Boolean;


- Если товары в магазине отсутствую, функция будет возвращать False


function GoToNextProduct(out ProductId: Integer): Boolean;
function GoToPreviousProduct(out ProductId: Integer): Boolean;


- если товары в магазине отсутствую, либо текущий товар был последним (GoToNextProduct) / первым (GoToPreviousProduct) функция будет возвращать False.

но:

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


AdapterStore.GoToFirstProduct(ProductId);
// действие на товаром
while AdapterStore.GoToNextProduct(ProductId) do
begin
 // дейсвие над товаров
end;


Медвежонок Пятачок   (2011-10-27 13:01:00) [1]

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


sniknik   (2011-10-27 11:07:00) [2]

> единственный раз кстати
нет вру, еще впомнил, с небольшим отличием, с кодом клиента выполняемым на сервере (трехвенка). идея та-же, но вместо скачивания и обратного залива данный, на сервер "делегировался" код клиента который и обрабатывал там данные. т.е. как у тебя по сути.
это два, в общем.


sniknik   (2011-10-27 10:59:00) [3]

> зато у тебя есть идея о ненужности моего механизма везде
с чего решил?
там выше вспоминал про "не оригинальность" твоего метода, с существованием в виндовых функциях подобной схемы. думаешь воспоминание "с потолка"? ан, нет, использовал. т.к. там было необходимо... единственный раз кстати, но это не важно, главное "о везде" речи нет.


Медвежонок Пятачок   (2011-10-27 10:26:00) [4]

не убедил все равно.
причины две.
у меня нет навязчивой идеи заменять все циклы (в том числе и из твоего примера) на мой механизм.
зато у тебя есть идея о ненужности моего механизма везде.


sniknik   (2011-10-27 08:10:00) [5]

p.s. вообще, есть такая фраза, не помню кто сказал - не плодите сущностей...
вот. по моему это вам.


sniknik   (2011-10-27 08:04:00) [6]

> а ты представь, ... а в другом месте.
и в страшном сне... вот с чего это мне интерфейсную деталь, на конкретной форме, сделанную так только потому, что рекордсет временный (иначе бы просто кинул лукапкомбобокс) вдруг заполнять в другом месте? другой форме?
но даже если случится в чем проблема выделить код в процедуру, весь связанный логически код. не разрывая логику. и только тогда когда будет нужно, а не заранее.

> там где одна строка датасета
никаких изменений, цикл по одной строке работает также как по списку...

> или вообще нет датасета
вот вот, я уже предлагал в пример массив... там будет абсолютно другойкод. без дизейбла контролов, именованных полей...
плохой пример, для тебя это минус, не плюс. но "красота" видать глаза застилает. не видишь очевидного.

> правильно, это будет копипаст.
ага, копипаст организации цикла - while not Eof do begin Next; end; всегда копипаст. все остальное "по месту" другое.
кстати не задумывался что ВЕСЬ дельфи сплошной копипаст, все слова повторяются... вот например begin end; их же пишем постоянно... ужасть. не думал заменить на свое? избежать "копипаста"? хотя... по большому счету ведь и твоя функция в использовании в другом месте будет с тем же именем... непорядок. копипаст. :)


Медвежонок Пятачок   (2011-10-26 23:08:00) [7]

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

представил?
правильно, это будет копипаст.

а уменя колбэк и я его могу вызвать откуда мне вздумается и сколько раз мне вздумается.


sniknik   (2011-10-26 23:01:00) [8]

> в понятности как раз теряешь ты.
вот моя часть кода, из приведенного, что может быть "оптимизирована"
    First;
    while not Eof do begin
      if fCode.AsInteger = Code then begin
        Template:= TTemplate.Create;
        Template.ID   := fID.AsInteger;
        Template.Code := fCode.AsInteger;
        Template.Name := fName.AsString;
        Template.Value:= fValue.AsString;

        comBoxTemplate.Items.AddObject(fName.AsString, Template);
      end;
      Next;
    end;


обработка там же где подготовительные/связанные действия

вот что будет у тебя
подготовка, связанное тоже самое а вместо этого "рабочего цикла" -

enum_dataset(DMod.DSTemplate,Template,nil);

сам цикл в отдельном модуле, а обработчик в 3м месте, гда там будет описана процедура Template... ну, если тебе так понятно. ну что тут сказать... а кому нибудь другому ты свой код читать давал? чтобы совсем со стороны.


Медвежонок Пятачок   (2011-10-26 22:42:00) [9]

в понятности как раз теряешь ты.
к тебя в одной процедуре и перебор-итерация чего-то там и одновременно обработка/формирование чего то здесь.

у меня итерация в одном месте, в другом месте только обработка.


sniknik   (2011-10-26 22:38:00) [10]

> и он на меня работает.
со стороны мне кажется, что это ТЫ на него работаешь...  копеечная экономия -
вместо 3х строчек цикла
while ... do begin
 Next;
end;
писать 1 строчку вызова процедуры. но с "довеском" в виде написания обработчика в виде другой процедуры, тратя гораздо больше строк.
теряешь в понятности (код не по месту, а куда то вынесен), но тешишь гордость используя везде (ну как же. такое оригинальное, "красивое", решение. бессмысленное но ведь сам придумал! (хотя на самом деле это не оригинальная идея, а такое же в каких то виндовых сетевых функциях видел, использовал... не помню где. главное в винде это есть, и было давным давно (а это было в Симпсонах! ха-ха ;)...)).


Медвежонок Пятачок   (2011-10-26 21:53:00) [11]

все отличие в том, что я не создаю много тупых циклов перебора узлов.
я написал один цикл много лет назад и он на меня работает.


Медвежонок Пятачок   (2011-10-26 21:51:00) [12]

у меня он справляется и с рекурсией если надо и без.

например с рекурсией:

emun_nodes(xdoc,xpath_str_1,firstcallback);

firstcallback(anode : ixmldomnode,......) : boolean;
begin
...
enum_nodes(anode,'./somechild_nodes/....',secondcallback,....)
...
end;

и так далее ...


sniknik   (2011-10-26 21:34:00) [13]

> И все! И никаких ограничений, никаких рутинных циклов.
да ну? я вот например xml использую (когда сам, а не навязан. когда внутри программы, а не извне пришло) только при сложной структуре, с "плоским" видом проще и понятнее рекордсет. это к чему, у меня "рутинного цикла" для xml-я не бывает, т.к. вложенности/"деревья" пишу обработку рекурсией в общем.

а как у тебя метод справляется, без рекурсий, ограничений, и только "рутинным циклом"?


Медвежонок Пятачок   (2011-10-26 20:53:00) [14]

да нет никаких жестких рамок.

есть банальное желание повторного использования кода и оно реализовано.

я стопицот раз писал вот так, до того как решил покончить с этим:

iList := xdoc.selectNodes('//..........');
for i := 0 to Pred(iLst.length) do
begin
 <что-то_там_в_носу>;
end;

теперь я больше так не делаю. ну жалко мне времени.

nCount := enum_xml_nodes(xdoc,'//.....', MyCallback, ACustomData);

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


sniknik   (2011-10-26 20:17:00) [15]

> может и не нужно
в том то и дело, и так чаще всего. стандартного хватает, оно удобно, "гибко", без возможных искусственных ограничений, с документацией, не зависит от местного "гуру", знания о нем пригодятся не только "вот тут", а вообще и с понимание "процесса", принесут больше пользы, и т.д.
а тут, попытка сделать скрыто (прятать работу), типа удобно для программиста, но только где оно удобно если "жестко в рамках"... это быдлокод. причем под быдлом явно понимается программист которому это "впарят"...

не, было бы для себя, да бога ради. сам пишешь, сам понимаешь как/для чего написал/как можно использовать... а вот как "для программиста", т.е. "на вынос", не стоит того "удобство" (да удобство это только в глазах писавшего).

у нас был товарищ хотел систему для создания олап кубов сделать... только в итоге получилось пользоваться может только тот кто и без нее прекрасно справится... а "система" как с костыль, здоровому мешает, а безногому не поможет. ну типа того. поэтому так наверно воспринимаю. время зря только потрачено. а знал (предполагал) что будет изначально. с момента ТЗ. и тут вижу что то похожее.
(придирка не к твоему коду, "изяществу метода", а вообще к идее топика, подмене стандартных функций/методов своими поделками... какими бы они не были изящными в реализации, но бессмысленность от этого никуда не девается)


Медвежонок Пятачок   (2011-10-26 18:04:00) [16]

если по принципу "можно ли вообще", то можно.
заменить два цикла.

enum_list(comBoxTemplate.Items,DeleteCallback,nil);
enum_dataset(DMod.DSTemplate,Template,nil);

может и не нужно, но зато можно


sniknik   (2011-10-26 17:49:00) [17]

> что делает каждый
ну давай посмотрим на реальном коде. сам скажи, что тут "оптимизируемо" твоим методом.

procedure TPaymForm.FillTemplate;
var
 i: integer;
 fID, fCode, fName, fValue: TField;
 Template: TTemplate;
begin
 sPhone:= '';
 
 for i:= 0 to comBoxTemplate.Items.Count - 1 do
   if comBoxTemplate.Items.Objects[i] <> nil then begin
     comBoxTemplate.Items.Objects[i].Free;
     comBoxTemplate.Items.Objects[i]:= nil;
   end;
 comBoxTemplate.Items.Clear;

 if DMod.DSTemplate.Active then
   with DMod.DSTemplate do begin
     fID   := FieldByName('Usr');
     fCode := FieldByName('Code');
     fName := FieldByName('Name');
     fValue:= FieldByName('Value');

     Sort    := 'Name';
     Filter  := 'Code=' + IntToStr(Code);
     Filtered:= true;

     First;
     while not Eof do begin
       if fCode.AsInteger = Code then begin
         Template:= TTemplate.Create;
         Template.ID   := fID.AsInteger;
         Template.Code := fCode.AsInteger;
         Template.Name := fName.AsString;
         Template.Value:= fValue.AsString;

         comBoxTemplate.Items.AddObject(fName.AsString, Template);
       end;
       Next;
     end;
   end;

 if comBoxTemplate.Items.Count > 0 then begin
   comBoxTemplate.Enabled:= true;
   comBoxTemplate.Color  := clWindow;
 end else begin
   comBoxTemplate.Enabled    := false;
   comBoxTemplate.ParentColor:= true;
 end;
end;


Медвежонок Пятачок   (2011-10-26 17:26:00) [18]

Вот стандартный мультиселект. Все отключено, но все работает.

DBGrid1.DataSource.DataSet.DisableControls;
for i := 0 to Pred(DBGrid1.SelectedRows.Count) do
 begin
  if DBGrid1.DataSource.DataSet.BookmarkValid(Pointer(DBGrid1.SelectedRows.Items[i]))  then
   begin
    DBGrid1.DataSource.DataSet.GotoBookmark(Pointer(DBGrid1.SelectedRows.Items[i]));
    ShowMessage(Table1.Fields[0].Value);
   end;
 end;

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

Сначала я дал "наружу" расширенный EhDBGrid.
Команда им пользуется.
Затем я дал им новый метод этого грида.
Это же метод грида. Просто частный случай применения.
Только потому, что у конечного пользователя приложения есть механизм отбора записей, а у программиста нет удобного механизма обработки.
Никакая универсальность не пострадала.
Так как метод делает ровно то, что делает каждый, когда ему надо перебрать записи.


sniknik   (2011-10-26 17:21:00) [19]

> частная реализация
ничего плохого, сам для себя и не такое пишу... но тут то "для программиста", т.е. не для автора топика. :)


sniknik   (2011-10-26 17:19:00) [20]

> Просто и мультиселект у меня не такой как у всех.
> Я таким механизмом обрабатываю все что имеет регулярную структуру.
значит не универсально, частная реализация. а вот дал ты свой метод "наружу"из своей среды обитания, и кто-то не пользующийся Eh-ом, и пользующийся датасетами в большем чем ты объеме попытается им воспользоваться. и?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо