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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация кода 
:(
    Опции темы
Pavelbej
Дата 30.10.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Привет, всем!

В программе приходится очень часто использовать данный код в различных функциях и процедурах и даже формах:
Код

         if assigned(data) then
              with data^ do
              begin
                  Category:='имя';
                  Description:='другое имя';
                  Link:='ссылка';
                  Comment:='...';
                  Editable:=false;
                  Location:='...';
                  isDir:=true;
                  ImageIndex:=6;
                  State:=-1;
                  TextColor:=clRed;
                  ...
              end;

Также, развивая программу, приходится добавить новые данные, что создает определенные проблемы по слежению за всем этим. Решил наконец весь этот код вывести в отдельную процедуру и в дальнейшем обходится только ее вызовом. 
Теперь хочу узнать, оправдан ли такой выход из ситуации? Правильный ли это подход? Дело в том что когда-то давно, где-то читал что нехорошо использовать в вызове процедуры больше десяти параметров. Может я ошибаюсь, может там где читал - ошибались, но поиск, моей мысли не понял.
Что посоветуете?
PM MAIL   Вверх
morpheyushka
Дата 30.10.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Цитата(Pavelbej @  30.10.2008,  16:35 Найти цитируемый пост)
Что посоветуете? 

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


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
Alexeis
Дата 30.10.2008, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



  Ну если есть столько связанных параметров, то это уже тянет на объект или как минимум Record. Его следует хранить таким образом и   передать в функцию как var или const параметр (т.е. по ссылке). 


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

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

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


Опытный
**


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

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



Цитата(morpheyushka @  30.10.2008,  16:41 Найти цитируемый пост)
Про количество передаваемых параметров в первый раз слышу, 

А я вроде что-то припоминаю, но давно было, может путаю. 

Цитата(morpheyushka @  30.10.2008,  16:41 Найти цитируемый пост)

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

Вот только смущяет ее будущий вид:
Код

procedure BlaBla(Category, Description, Link, Comment, Location, Editable, isDir, ImageIndex, ...);


PM MAIL   Вверх
Poseidon
Дата 30.10.2008, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



Цитата(Pavelbej @  30.10.2008,  16:35 Найти цитируемый пост)
Дело в том что когда-то давно, где-то читал что нехорошо использовать в вызове процедуры больше десяти параметров.
Я бы даже сказал что не хорошо более пяти использовать. И не потому что компилятору как-то плохо, а потому что сам код тогда трудн читается. Тем более что у тебя, как я вижу, используется data, очему бы не передавать это в параметрах и работать через data^.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Pavelbej
Дата 30.10.2008, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alexeis @  30.10.2008,  17:16 Найти цитируемый пост)
Ну если есть столько связанных параметров, то это уже тянет на объект или как минимум Record. Его следует хранить таким образом и   передать в функцию как var или const параметр (т.е. по ссылке).  

Это уже есть:
Код

type
  PBookmark = ^TBookmark;

  TBookmark = record
      Category,                   //Имя папки (только папки)
      Description,                //Имя ссылки (только ссылки)
      Link,                           //ссылка (только ссылки)
      TextComt,                  //Комментарий к папке и/или ссылке
      Location: WideString;//Другие данные о ссылке (Opera) (только ссылки)
      //....................
      Editable,                     //Можно ли редактировать папку и/или ссылку
      isDir,                           //Если папка, тогда - true
      TextBold: Boolean;     //Жырный текст
      //....................
      ImageIndex,               //Иконка ссылки и/или папки
      State,                          //Состояние ссылки (живая, мертвая или непроверенная) (только ссылки)
      FavIcon: Integer;        //Иконка сайта (только ссылки)
      //....................
      LastVisit,                      //Последнее посещение ссылки (только ссылки)
      LastVerific: TDateTime;//Последняя проверка ссылки
      //....................
      TextColor: TColor;       //Приоритет (цвет ссылки и/или папки)
  end;


А вот использовать как Вы предлагаете еще не приходилось. Можно пример функции?
PM MAIL   Вверх
Alexeis
Дата 30.10.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Pavelbej @  30.10.2008,  16:34 Найти цитируемый пост)
А вот использовать как Вы предлагаете еще не приходилось. Можно пример функции? 


Заменяем 
Код

procedure BlaBla(Category, Description, Link, Comment, Location, Editable, isDir, ImageIndex, ...);


на

Код

procedure BlaBla(const aBookmark TBookmark);
Begin
 data^ := aBookmark;
 
....



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

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

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


Бывалый
*


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

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



Цитата(Pavelbej @  30.10.2008,  15:34 Найти цитируемый пост)
А вот использовать как Вы предлагаете еще не приходилось. Можно пример функции? 

я так понимаю у человека просто ввод с формы всяких данных в один рекорд (как я думаю).... или что то в этом роде
вызов процедуры примерно такой...
Код

procedure myButtonClick(Sender: TObject);
begin
  BlaBla(Category.text, Description.text, Link.text, Comment.text, Location.text, Editable.text, isDir.checked, ...);
end;


--------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ.
PM MAIL   Вверх
Pavelbej
Дата 30.10.2008, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vladimir74 @  30.10.2008,  17:57 Найти цитируемый пост)
я так понимаю у человека просто ввод с формы всяких данных в один рекорд (как я думаю).... или что то в этом роде
вызов процедуры примерно такой...

Не совсем. Данные получаю из различных источников(XML, HTML, Opera bookmarks, .url файлы и базы данных), но есть и возможность вводить их вручную.
Собираю все необходимые данные и "присваиваю" их определенному узлу (используется компонент VirtualStringTree).
Код

              node:=VTBook.AddChild(VTBook.FocusedNode);
              data:=VTBook.GetNodeData(node);
              if assigned(data) then
              with data^ do
              begin
                  //Присваиваем разные данные в разных процедурах
                  Category:='...'; 
                  Description:='...';
                  Link:='...';
                  TextComt:='...';
                  Editable:=false;
                  Location:='';
                  isDir:=true;
                  ImageIndex:=6;
                  State:=-1;
                  TextColor:=LowC;
              end;


Вот и непонятно Alexeis, ведь из разных процедур, форм и юнитов я должен послать в данную Вами процедуру, разные данные. 
Код

procedure BlaBla(const aBookmark TBookmark);
Begin
 data^ := aBookmark;
 
....

И пока не улавливаю. Что такое aBookmark, и который это data^?
PM MAIL   Вверх
vladimir74
Дата 30.10.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Pavelbej @  30.10.2008,  16:32 Найти цитируемый пост)
Не совсем. Данные получаю из различных источников(XML, HTML, Opera bookmarks, .url файлы и базы данных), но есть и возможность вводить их вручную.

тогда, если еще не поздно, я бы огласился бы с первым постом Alexeis, 
Цитата(Alexeis @  30.10.2008,  15:16 Найти цитируемый пост)
Ну если есть столько связанных параметров, то это уже тянет на объект

в таком случае у вас есть проперти в которые вы заносите нужные вам данные. все легко, прозрачно, легко расширяема  и не нужно мучаться с процедурой и думать скальо и какие значения передавать....
В противном случае (эьл уже ИМХО выход из положения когда очень сложно что то поменять) можно передавать StringList в котором и бдут все значения твоего будующего рекорда.....
--------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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