Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];

Вниз

Качество кода   Найти похожие ветки 

 
Student ©   (2009-06-05 17:54) [0]

Здравствуйте. Я тока, тока учусь основам языка. Пишу "хорошую и очень полезную программу". Пытаюсь уделить особое внимание качеству кода. У меня возникло несколько организационных вопросов.
1) Программа написана в хорошем стиле ООП?
2) Правильно пытался использовать соглашения о наименовании?

На что следует обратить мне внимание, чтобы по максимуму повысить качество кода?

Вот ссылка на исходный проект программы: http://rghost.ru/279521
(архив chas.rar, 76Кб)
Спасибо


 
Student ©   (2009-06-05 17:58) [1]

И, по возможности дополнительный вопрос. Все объекты в программы можно перемещать "правой мышью". Если перемещать мышку быстро(при нажатой правой кнопки), то объект "сбивается" и не перемещается до тех пор, пока не будет "фокуса" на объекте.
Если же вместо "правой мышки" переделать на "левую" - проблеммы как ни бывало. В чём может быть загвоздка?
Спасибо


 
DVM ©   (2009-06-05 18:00) [2]


> Student ©

На первый беглый взгляд сносно, я думал хуже будет. Что вот сразу бросилось в глаза, так это:

lbl_XXXXX

Не по дельфийски это как то. Лучше без подчеркивания.
Не очень аккуратно отформатировано местами, пробелов не хватает вокруг :=, < , >  И Т.Д.
WITH использовать бы не помешало.


 
DVM ©   (2009-06-05 18:02) [3]


> Student ©

NEW()
Бла-бла-бла
DISPOSE()

лучше обернуть в Try...Finally тем более, что там у тебя между ними вероятны исключения.


 
Игорь Шевченко ©   (2009-06-05 18:05) [4]

Я конечно извиняюсь, но программа написана безобразно.


> На что следует обратить мне внимание, чтобы по максимуму
> повысить качество кода?


на исходные тексты VCL, тексты примеров в Demos


 
DVM ©   (2009-06-05 18:09) [5]


> Student ©

Вот еще:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=802


 
Student ©   (2009-06-05 18:12) [6]

Пасибо огромное. :-) Буду исправляться :-)


 
Rouse_ ©   (2009-06-05 18:16) [7]

На первый взгляд ужасно - про форматирование я просто опущу... но мемлики...

Конструкции следующаего плана выглядат достаточно забавно и оригинально:

 New (PIni);
 PIni^ :=TIniFile.Create(ExtractFilePath(Paramstr(0))+"Chas.ini");
 Dispose (PIni);


Ну и количесво конструкторов (много штук) явно превышает количество деструкторов (одна штука) найден над уникальнейшем по глубине смысла обработчике исключения:

   finally
     StreamF.Free;
   end;
 except
   Exit;
 end;


Вывод - надо работать...


 
DVM ©   (2009-06-05 18:23) [8]


>  New (PIni);
>  PIni^ :=TIniFile.Create(ExtractFilePath(Paramstr(0))+"Chas.
> ini");
>  Dispose (PIni);
>

Действительно необычная запись.


 
Student ©   (2009-06-05 18:26) [9]

Student ©   (05.06.09 17:58) [1]


> И, по возможности дополнительный вопрос. Все объекты в программы
> можно перемещать "правой мышью". Если перемещать мышку быстро(при
> нажатой правой кнопки), то объект "сбивается" и не перемещается
> до тех пор, пока не будет "фокуса" на объекте.
> Если же вместо "правой мышки" переделать на "левую" - проблемы
> как ни бывало. В чём может быть загвоздка?
> Спасибо


procedure TSSO.Что то MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 if  Button <> mbLeft then
   Move:=false
 else
 begin
   Move:=true;
   X0:=x;
   Y0:=y;
 end;
end;

Если так пишу - всё ок. Какие в этом случае будут рекомендации?
Спасибо


 
Юрий Зотов ©   (2009-06-05 18:30) [10]

> Программа написана в хорошем стиле ООП

В плохом. Совершенно неверное создание динамических объектов, приводящее к утечкам памяти:

var
 PIni : ^TIniFile;
...
// Выделили 4 байта:
New (PIni);
// Создали объект, но потеряли только что выделенные 4 байта:
PIni^ :=TIniFile.Create(ExtractFilePath(Paramstr(0))+"Chas.ini");
... // Если здесь возникнет исключение, Dispose не сработает
// Освободили 4 байта из области памяти, занятой объектом, но при этом
// потеряли остальную занятую им память размером TIniFile.InstanceSize-4:
Dispose (PIni);


А надо так:

var
 Ini: TIniFile;
...
Ini := TIniFile.Create(ExtractFilePath(Paramstr(0))+"Chas.ini");
try
 ...
finally
 Ini.Free;
end;

Есть и много других недостатков, но о них позже. Сначала разберитесь с этим. То, что Вы умеете работать с указателями - это просто отлично (и очень важно для будущего роста), мало кто из начинающих это умеет - но с объектами работают не так.


 
Пит   (2009-06-05 18:40) [11]

надо просто понимать, что TIniFile - как и любая переменная классового типа является уже указателем. Поэтому объявлять указатель PIni на класс TIniFile (который тоже является указателем) смысла нету.

Получается, объявления указателя на указатель. Прямая дорога запутаться нахрен.


 
Student ©   (2009-06-05 18:45) [12]

Пасибо вам огромное за замечания. Буду исправляться. :-)


 
Игорь Шевченко ©   (2009-06-05 18:54) [13]

Student ©   (05.06.09 18:45) [12]

Глупый вопрос можно ? А зачем наследоваться от картинок ?

 TSSO = class (TImage)
 TAddressIP = class(TImage)
 TServ = class(TImage)
 TAlarmClock = class(TImage)


 
pasha_golub ©   (2009-06-05 19:00) [14]

Блин, люди оказывается даже посмотрели. Я думал вою про вирусы будет... :)


 
DVM ©   (2009-06-05 19:05) [15]


> Игорь Шевченко ©   (05.06.09 18:54) [13]


> Глупый вопрос можно ? А зачем наследоваться от картинок
> ?

Я думаю, у него там че-то типа Visio. TServ  - это изображение сервера, который можно таскать по форме.


 
Student ©   (2009-06-05 19:06) [16]


> Игорь Шевченко ©   (05.06.09 18:54) [13]
>
> Student ©   (05.06.09 18:45) [12]
>
> Глупый вопрос можно ? А зачем наследоваться от картинок
> ?
>
>  TSSO = class (TImage)
>  TAddressIP = class(TImage)
>  TServ = class(TImage)
>  TAlarmClock = class(TImage)


Это нарушение LSP(Liskov Substition Principe). Я уже прочитал эту тему только что. Наследоваться нужно не для того чтобы повторно использовать код, а для того чтобы быть повторно используемым.
Пасибо за замечание вам.


 
Юрий Зотов ©   (2009-06-05 19:13) [17]

> pasha_golub ©   (05.06.09 19:00) [14]

Там сырцы. Правда, еще ~ и dcu, но это уже по неопытности...
:o)


 
Student ©   (2009-06-05 19:14) [18]


> DVM ©   (05.06.09 19:05) [15]
> Я думаю, у него там че-то типа Visio. TServ  - это изображение
> сервера, который можно таскать по форме.


Нет. Это зделано для того, чтобы в будущем пользователи при начале использования программы, расставили красиво(поэстетичнее, так как надо) изображения. А потом я удалю эту функцию. Я так планировал изначально. А то подгонять эти картинки по форме постноянно(скажут эта не здесь, завтра скажут - а эта здесь должна быть) ;-)))


 
Игорь Шевченко ©   (2009-06-05 19:26) [19]

Student ©   (05.06.09 19:14) [18]


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


Я бы посоветовал фреймы сделать, которые можно "таскать" по главному окну, а уже во фреймах располагать нужный контент.

Они лучше Image, как минимум тем, что на них можно положить другие контролы.


 
oldman ©   (2009-06-05 20:45) [20]

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


 
Виктор85   (2009-06-06 17:27) [21]


> А надо так:
>
> var
>  Ini: TIniFile;
> ...
> Ini := TIniFile.Create(ExtractFilePath(Paramstr(0))+"Chas.
> ini");
> try
>  ...
> finally
>  Ini.Free;
> end;

Я бы написал так)

var
 Ini: TIniFile;
...
 Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + "Chas.ini");
 try
   ...
 finally
   FreeAndNil(Ini);
 end;


 
@!!ex_   (2009-06-06 17:41) [22]


> Я бы написал так)
>
> var
>   Ini: TIniFile;
>  ...
>   Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) +
> "Chas.ini");
>   try
>     ...
>   finally
>     FreeAndNil(Ini);
>   end;

У меня необычный вопрос... а нафиг?


 
Виктор85   (2009-06-06 18:06) [23]

выработав привычку всегда использовать FreeAndNil, можно смело предполагать, что проверить - создан ли объект, достаточно выполнить проверку if Assigned()... я считаю хорошей привычкой после уничтожения объекта указатель устанавливать в nil, не оставляя там мусор


 
Юрий Зотов ©   (2009-06-06 18:31) [24]

> Виктор85   (06.06.09 18:06) [23]

Причем особенно это важно для локальных переменных, каковой и должна быть переменная Ini.

Вот такой код встречать не приходилось?

i := 1;
if i = 1 then... // А вдруг не присвоилось?


 
Виктор85   (2009-06-06 20:40) [25]

> Юрий Зотов ©   (06.06.09 18:31) [24]

Ну не до такой степени)

Примера дать не могу, выработал до автоматизма такое применение.  Загляните в исходники Indy, там только так и освобождаются все объекты... в общем дело привычки, доказывать не буду)


 
Юрий Зотов ©   (2009-06-06 20:59) [26]

> Виктор85   (06.06.09 20:40) [25]

Все правильно, это дело привычки. Но ведь привычки бывают и вредными?

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

В общем, всяк овощ хорош в свое время. Но самая лучшая панацея - это аккуратный кодинг, тогда и FreeAndNil не понадобится. В данном же случае в коде автора вопроса (надеюсь, Вы его смотрели) СТОЛЬКО погрешностей и они НАСТОЛЬКО вопиющи, что говорить о замене Free на FreeAndNil пока что просто смешно.


 
oldman ©   (2009-06-06 21:13) [27]


> Юрий Зотов ©   (06.06.09 18:31) [24]
> Вот такой код встречать не приходилось?
> i := 1;
> if i = 1 then... // А вдруг не присвоилось?


Мама родная!
Где ты это видел?

И почему перед присваиванием нет проверки на наличие объявления i?
И на наличие в природе 1?
И на совпадение типов?


 
AndreyV ©   (2009-06-06 22:27) [28]

> [24] Юрий Зотов ©   (06.06.09 18:31)
> i := 1;
> if i = 1 then... // А вдруг не присвоилось?

i := 1; // Вдруг не проверилось?

Что с доступом к ДелфиМастер? Уже неделю только пару раз за день удаётся зайти, а на dmgate.k210.org вижу нормально.


 
Игорь Шевченко ©   (2009-06-06 23:47) [29]


> я считаю хорошей привычкой после уничтожения объекта указатель
> устанавливать в nil, не оставляя там мусор


Это плохая привычка. Забудь ее. При грамотном дизайне проверять объект на Assigned не приходится, лучше совершенствовать дизайн, чем совершенствовать привычку использовать костыли.


 
Германн ©   (2009-06-07 01:05) [30]


> AndreyV ©   (06.06.09 22:27) [28]
>
> > [24] Юрий Зотов ©   (06.06.09 18:31)
> > i := 1;
> > if i = 1 then... // А вдруг не присвоилось?
>
> i := 1; // Вдруг не проверилось?
>
> Что с доступом к ДелфиМастер? Уже неделю только пару раз
> за день удаётся зайти

Да всё в порядке с доступом. Ищи проблемы у себя.


 
Германн ©   (2009-06-07 01:07) [31]


> я считаю хорошей привычкой после уничтожения объекта указатель
> устанавливать в nil, не оставляя там мусор

Ничего полезного в этой привычке нет.


 
AndreyV ©   (2009-06-07 01:14) [32]

> [30] Германн ©   (07.06.09 01:05)
> Да всё в порядке с доступом. Ищи проблемы у себя.

Да я понимаю, что всё в порядке, о чём и написал о dmgate, но проблема скорее не у меня локально, а где-то дальше - потому и спросил - может известна.


 
имя   (2009-06-07 14:06) [33]

Удалено модератором
Примечание: Совсем совесть потерял?


 
TIniFile   (2009-06-07 14:23) [34]


> Юрий Зотов ©   (05.06.09 18:30) [10]
> var
>  PIni : ^TIniFile;
> ...
> // Выделили 4 байта:
> New (PIni);
> // Создали объект, но потеряли только что выделенные 4 байта:
>
> PIni^ :=TIniFile.Create(ExtractFilePath(Paramstr(0))+"Chas.
> ini");
> ... // Если здесь возникнет исключение, Dispose не сработает
>
> // Освободили 4 байта из области памяти, занятой объектом,
>  но при этом
> // потеряли остальную занятую им память размером TIniFile.
> InstanceSize-4:
> Dispose (PIni);

Фига-се новости...Освободили 4 байта из области памяти, занятой объектом, но при этом потеряли остальную занятую им память размером TIniFile.InstanceSize-4 -  это из какого смысла?


 
Palladin ©   (2009-06-07 14:27) [35]


> TIniFile   (07.06.09 14:23) [34]

на самом деле потеряли больше чем TIniFile.InstanceSize-4, в нем еще и FileName хранится... ) так он и останется нефинализированный


 
TIniFile   (2009-06-07 14:33) [36]


> на самом деле потеряли больше чем

Это я понимать могу. Мне InstanceSize-4 чуть башню не снесло :) Затерли указатнль, потеряли весь объект без всяких там -4.


 
Palladin ©   (2009-06-07 14:37) [37]


> TIniFile   (07.06.09 14:33) [36]

Юра имел ввиду InstanceSize - SizeOf(Integer), тот самый Integer Dispose,которого , был сделан.


 
Palladin ©   (2009-06-07 14:38) [38]

тьфу... ) не Integer, а ^IniFile :)


 
TIniFile   (2009-06-07 14:45) [39]


> Юра имел ввиду InstanceSize - SizeOf(Integer), тот самый
> Integer Dispose,которого , был сделан

Что он имел в виду  я понял, только оно не соответствуе действительности.
Откуда взялся InstanceSize - SizeOf(Integer)?

New (PIni) - выделили SizeOf(Pointer) под указатель на объект.
PIni^ :=TIniFile.Create - Записали в эту выделенную память указатель на созданный объект. Сам объект со всем его InstanceSize лежит са-а-всем в другом месте.
Dispose (PIni) - освободили память, занятую указателем. Сам объект как был в другом участке памяти, так там и остался. Со всеми своими ссылками и со всем своим InstanceSize, целиком и без изъятия.


 
Юрий Зотов ©   (2009-06-07 14:48) [40]

> TIniFile   (07.06.09 14:33) [36]

New выделила 4 байта. Dispose их же и освободит, но только уже по другому адресу (т.к. значение указателя изменилось). Поэтому при Dispose теряем InstanceSize-4.

Общие же потери памяти составят InstanceSize (т.к. выделенные New 4 байта тоже были потеряны при создании объекта). А с учетом [35] - больше.

PS
Спокойнее, дружище, зачем так много эмоций?


 
Юрий Зотов ©   (2009-06-07 15:01) [41]

> TIniFile   (07.06.09 14:45) [39]

> New (PIni) - выделили SizeOf(Pointer) под указатель на объект.

Да. То есть, выделили 4 байта.

> PIni^ := TIniFile.Create - Записали в эту выделенную память указатель на
> созданный объект.

Нет. В статическую переменную PIni (а не в только что  выделенные 4 байта) записали адрес созданного объекта. Теперь значение PIni изменилось и предыдущие 4 байта (которые выделила New) потеряны.

> Dispose (PIni) - освободили память, занятую указателем.

Нет. Dispose (PIni) освободит первые 4 байта по адресу, который содержится в переменной PIni. А в ней теперь лежит уже не адрес, который выделила New, а адрес объекта. То есть, будут освобождены первые 4 байта из области памяти, занятой объектом, а остаток этой области будет потерян.


 
Юрий Зотов ©   (2009-06-07 15:07) [42]

Блин. Или я не прав? Щас проверим, только Delphi запущу.
:o)


 
TIniFile   (2009-06-07 15:12) [43]


> Спокойнее, дружище, зачем так много эмоций?

Извиняюсь, уж больно сильное впечатление произвело :)


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

То есть как "по другому адресу"? Dispose освободит именно те 4 байта, которые были выделены предыдущим вызовом New. То есть мы объявили PIni : ^TIniFile. Для простоы рассуждений будем считать, что изначально PIni = nil, ну допустим сами его проинициализировали, имеем ведь право. Так-же для простоты будем считать, что в нашем классе нет никаких ссылочных полей, а его InstanceSize = $30.
В результате вызова New(PIni) были выделены 4 байта по адресу, например, $5000.
Далее вызвали конструктор, допустим он создал объект по адресу $10000. Это значит, что по адресу $10000 было выделено $30 байт и эта область была проинициализирована так, чтобы стать объектом. После этого адрес этой области был записан в четыре ячейки, адрес которых хранится в PIni. То есть в ячейках $5000..$5003 теперь лежит число $10000.
В результате Dispose(PIni) освобождены 4 байта по адресу $5000 - то бишь те, где хранился адрес объекта. Но сам объект, все его $30 байт, как лежали по адресу $10000, так там и истались. Ни о каком InstanceSize-4 речи идти не может. Потяряно именно InstanceSize байт, не считая разумеется ссылок на внешние данные, если таковые имеются.


 
Юрий Зотов ©   (2009-06-07 15:19) [44]

> TIniFile   (07.06.09 15:12) [43]

Вы правы.
:o)


 
Palladin ©   (2009-06-07 15:31) [45]

как все сложно )


 
Юрий Зотов ©   (2009-06-07 15:34) [46]

> Palladin ©   (07.06.09 15:31) [45]

Особенно, когда невнимателен...
:o)


 
Palladin ©   (2009-06-07 16:47) [47]

Та... так кореть не бутет ) (С) ВК2, Гоблин...

и все таки она есть... достойная смена... :)


 
Юрий Зотов ©   (2009-06-07 17:14) [48]

> Palladin ©   (07.06.09 16:47) [47]

Есть, безусловно. Вот бы еще в ответах такую же активность...
:о)


 
TIniFile   (2009-06-07 17:28) [49]


> Palladin ©   (07.06.09 16:47) [47]
>
> и все таки она есть... достойная смена... :)

Боюсь, Вы куда лучше подходите на роль смены для меня, чем я для Вас:))


 
Palladin ©   (2009-06-07 17:57) [50]

Мда. ) а я так надеялся...


 
jack128_   (2009-06-07 20:46) [51]

Мдя.. Сказывается джависткое настоящее :-D


 
Кто б сомневался ©   (2009-06-07 20:50) [52]


> pasha_golub ©   (05.06.09 19:00) [14]
>
> Блин, люди оказывается даже посмотрели. Я думал вою про
> вирусы будет... :)


А вы все вирусофобией страдаете. :) Бедный-бедный.


 
Юрий Зотов ©   (2009-06-07 21:10) [53]

> jack128_   (07.06.09 20:46) [51]

Обидеть художника может каждый... ну да Бог с ним. Евгений, лучше скажите - как обстоят Ваши дела с ликвидацией Ваших проблем с пониманием основ объектно-ориентрованного программирования?

Может, консультация какая, или помощь нужна? Обращайтесь, если что.
:о)


 
capkoh ©   (2009-06-08 13:14) [54]

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


 
Student ©   (2009-06-22 10:41) [55]

Здравствуйте. Снова я. Вопрос прежний:
1) Программа написана в хорошем стиле ООП?
2) Правильно пытался использовать соглашения о наименовании(форматирование там, отступы и пр....)
Нашёл книжицу Delphi Code Standart, старался по советам в книге действовать.
И ещё вопрос: Как научиться думать "по объектно-ориентированному"? -). Надо паттерны читать? Это я к тому спросил. У меня в программе получается работают 22 таймера, это же не есть гуд? На работе подсказали документацию по многопоточным приложениям читать(потоки, класс TThread), его использовать для работы программы. Ps. Программа не совсем функционирует, буду дорабатывать.
Ссылка на сырцы - http://www.sharemania.ru/0263651
Имя файла: WinChas.rar
Размер файла: 522,09 Kb.
И еще: Щас функционал допишу и начну обвешивать конструкциями try except Верный подход?


 
brother ©   (2009-06-22 10:47) [56]

> Ссылка на сырцы - http://www.sharemania.ru/0263651

with почему не используешь?
http://www.citforum.ru/programming/delphi/style_delphi/ читал?


 
Медвежонок Пятачок ©   (2009-06-22 10:49) [57]

когда в программе 22 таймера, на with конечно надо в первую очередь обращать внимание
:)))

ps все стереть и переписать заново.
pps не качал и не смотрел


 
Anatoly Podgoretsky ©   (2009-06-22 10:53) [58]


> Щас функционал допишу и начну обвешивать конструкциями try
> except Верный подход?

Неверный.


 
jack128_   (2009-06-22 11:00) [59]

ужос.

   if FblStateAdr then
   begin
     imgComputer.Picture.Bitmap.FreeImage;
     imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
          + "CompLime.bmp");
   end else
   begin
     imgComputer.Picture.Bitmap.FreeImage;
     imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
          + "CompBlue.bmp");
   end;


так:

     imgComputer.Picture.Bitmap.FreeImage;
     imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
          + IIF(FblStateAdr , "CompLime.bmp", "CompBlue.bmp"));


так нельзя было переписать?

 Ini := TIniFile.Create(ExtractFilePath(Paramstr(0))+"Chas.ini");
 try
    // туча коду
 except
   FreeAndNil(Ini);
 end;
 FreeAndNil(Ini);
end;  

на try - finally - end нуно менять. К ООП очевидно это все не имеет никакого отнашения


 
Student ©   (2009-06-22 11:13) [60]


> jack128_   (22.06.09 11:00) [59]
>
> ужос.
и на try - finally - end нуно менять.

эээмммммммм......незнал ещё такого трюка, щас переделаю -(( На try-finally тоже щас чиркану....


> brother ©   (22.06.09 10:47) [56]
> with почему не используешь?

По поводу with - несогласен. Путает он, я ж по памяти не помню какие там методы в картинках всяких, поэтому пишу imgКартинка, сталю точку и Delphi сама выводит список методов. Не буду with использовать! -)


> Медвежонок Пятачок ©   (22.06.09 10:49) [57]
>
> когда в программе 22 таймера,
> :)))
>
> ps все стереть и переписать заново.
> pps не качал и не смотрел
>

Есть у меня задумка по этому поводу, с одним таймером..... Эммммм, я так думаю делать, .....

 DecodeTime(NewTime, Hour, Min, Sec, MSec);
 case Sec of
   0,12,24,36,48: begin
                          Вызвать метод проверки ССО
                        end;
   6,18,30:          begin
                          Вызвать метод проверки компьютеров
                        end;
 end;

Тоже неверный подход? -((((


 
Медвежонок Пятачок ©   (2009-06-22 11:15) [61]

конечно неверный


 
Student ©   (2009-06-22 11:22) [62]


> Медвежонок Пятачок ©   (22.06.09 11:15) [61]
>
> конечно неверный

а подскажи пожалуйста подход по возможности -)


 
Медвежонок Пятачок ©   (2009-06-22 11:28) [63]

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


 
Student ©   (2009-06-22 11:36) [64]


> Медвежонок Пятачок ©   (22.06.09 11:28) [63]
>
> у тебя запуски проверок происходят без учета того, завершилась
> предыдущая проверка или нет.
> а запуски частые


Согласен. Исходя из ваших рассуждений, следует назначит приоритетность проверок. Естественно самая приоритетная проверка - СЕРВЕР. Если он не доступен - по умолчанию ничего не будет работать. Значит я проверяю ДОСТУПНОСТЬ сервера, скажем раз в секунду, и если доступен, то проверяю дальше. Если во время выполнения других проверок оказывается что сервер недоступен, это как раз дело конструкции try-except. Это уже детали.

Как мне можно избавится от 22 таймеров? В каком направлении мне копать?


 
Медвежонок Пятачок ©   (2009-06-22 11:39) [65]

в дизайнере мышкой выдели 21 таймер и нажми del


 
Student ©   (2009-06-22 11:52) [66]


> Медвежонок Пятачок ©   (22.06.09 11:39) [65]
>
> в дизайнере мышкой выдели 21 таймер и нажми del
>

Несмотрели код. -((( ...Проблема серьёзнее.... Вкраце проблема.... Есть, допустим, 50 объектов. Каждый объект что то там делает. Чтоб это что то они делали нужно чтоб код позволял. Выход: 1 - в цикле крутить постоянно 2- таймеры(по истечению интервала времени - повторный вызов) 3 - как я щас думаю: в одном таймере блок

 DecodeTime(NewTime, Hour, Min, Sec, MSec);
 case Sec of
   0,12,24,36,48: begin
                    thrTest := TTest.Create(True);
                    thrTest.FreeOnTerminate := True;
                    thrTest.Priority := tpNormal;
                    thrTest.Resume;
                  end; //кинуть в другой поток и пусть там делается. При этом сами объекты уже будут демонстрировать другим свои состояния (через property)
  6,8,30: begin
               Другая проверка
             end;

Как то так?


 
Медвежонок Пятачок ©   (2009-06-22 11:57) [67]

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


 
Student ©   (2009-06-22 12:07) [68]

Всё верно. Ладно....я тогда щас переделывать начну с одним таймером+поток, добью полностью фунционал и скину на днях. Пасибо


 
brother ©   (2009-06-22 12:07) [69]

> добью полностью фунционал и скину на днях

типа на проверку?


 
Student ©   (2009-06-22 12:11) [70]

Ну.....типо да получается? Я ж не функционал спрашиваю, а в общем представлении.


 
Медвежонок Пятачок ©   (2009-06-22 12:18) [71]

begin
                   thrTest := TTest.Create(True);
                   thrTest.FreeOnTerminate := True;
                   thrTest.Priority := tpNormal;
                   thrTest.Resume;
                 end; //кинуть в другой поток и пусть там делается. При этом сами объекты уже будут демонстрировать другим свои состояния


И что это меняет?
таймер тикнет после этого на 12 секунде минуты и ты снова тупо запустишь еше одну нитку проверки.
А предыдущая возможно еще не завершилась, либо завершилась секунду назад.

У тебя пробелы не то что с ООП, но и процедурным подходом полный алес.


 
Student ©   (2009-06-22 12:24) [72]


> Медвежонок Пятачок ©   (22.06.09 12:18) [71]
> И что это меняет?
> таймер тикнет после этого на 12 секунде минуты и ты снова
> тупо запустишь еше одну нитку проверки.
> А предыдущая возможно еще не завершилась, либо завершилась
> секунду назад.
>
> У тебя пробелы не то что с ООП, но и процедурным подходом
> полный алес.


Я просто не понимаю, так когда по другому сделать можно? Если ни таймер, ни цикл. Программа то не один раз должна отработать, а постоянно, во времени, чтоб выполнялись данные проверки. :((


 
Медвежонок Пятачок ©   (2009-06-22 12:26) [73]

в том числе несколько параллельных и одинаковых?


 
Медвежонок Пятачок ©   (2009-06-22 12:31) [74]

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


 
Student ©   (2009-06-22 12:38) [75]

:-( Медвежонок Пятачок ©. Последний, наверное, самый дурацкий вопрос. Подскажи чё почитать чтоб мыслить так, как ты говоришь? Паттерны выправляют ум?


 
Медвежонок Пятачок ©   (2009-06-22 12:44) [76]

не знаю. я про паттерны никогда ничего не читал.


 
Cobalt ©   (2009-06-22 15:01) [77]

ставь флаг "Проверка сервера".

Вспомни очередь в магазине (кстати, на этой теме Рихтер делал пример для потоков)
Если у кассира смена ленты в кассовом аппарате, покупатели или ждут кассира, или уходят из магазина без покупки ;-)

А кассиру то пофиг, пока в аппарате ленту не поменяет, пробивать не сможет.


 
Student ©   (2009-06-23 12:16) [78]

Cobalt ©   (22.06.09 15:01) [77] - пасибо вам.

Снова я :-(( Изобрёл подход от избавления от 22 таймеров. Делаю один единственный класс опрашивающий системное время компьютера. В нём будет метод Tick - будет брать системное время с интервалом 1 сек.

TSystemClock = class(TObject)
private
 tmrClock : TTimer;
 procedure _Tick;
public
end;

procedure TSystemClock._Tick;
begin
DecodeTime(NewTime, Hour, Min, Sec, MSec);
case Sec of
  0,12,24,36,48: begin
                         Проверка ПСИ
                      end;
 6,8,30: begin
              Проверка компьютеров
            end;
end;

Естественно в каждом объекте будут отражены состояния и задан приоритет проверки Сервер - приоритет = 0 (самый приоритетный) СБОР приоритет = 1 (чуть менее приоритетный) и т.д. Объекты будут "спрашивать приоритет" у высших по иерархии приоритетов.
Такой подход может расчитывать право на жизнь?
Пасибо


 
Медвежонок Пятачок ©   (2009-06-23 14:11) [79]

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


 
Медвежонок Пятачок ©   (2009-06-23 14:13) [80]

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

а если придет в голову идея повторного использования этого чуда (собственно для чего и делают пользовательские классы), то его придется переписывать заново.


 
Student ©   (2009-06-23 15:13) [81]

Медвежонок Пятачок

Подскажи пожалуйста путь по которому двигаться мне.


 
Student ©   (2009-06-23 15:14) [82]

К чему мне прицепиться чтобы выполнять снова и снова код проверки?


 
Игорь Шевченко ©   (2009-06-23 16:47) [83]

// constructor / destructor

Убрать. Это мусор, который мешает жить. Лучше отсутствие комментариев, чем такие.

 Ini := TIniFile.Create(ExtractFilePath(Paramstr(0)) + "Chas.ini");
 try
   TimeServ := FileAge(Ini.ReadString("Dir","Trend", "") + "trend.dat");
 except
   FreeAndNil(Ini);
 end;
 FreeAndNil(Ini);

 переписать на
 
 with TIniFile.Create(ExtractFilePath(Paramstr(0)) + "Chas.ini") do
   try
      TimeServ := FileAge(ReadString("Dir","Trend", "") + "trend.dat");
   finally
      Free;
   end;

по крайней мере, будет понятно, что сломалось, если сломается.

посмотрел дальше. Переписать все.


 
Игорь Шевченко ©   (2009-06-23 16:56) [84]

Удалено модератором
Примечание: Дубль


 
Student ©   (2009-06-23 20:25) [85]

Здравствуйте уважаемый All.
Привёл код к более компактному виду(ссылка на сырцы) http://www.sharemania.ru/0150162
Имя файла: WinChas.rar
Размер файла: 521,70 Kb.

Уважаемый All. Пожалуйста, подскажите мне, каким образом мне избавиться от 22-х таймеров? Принцип? Я думаю отдельный класс строить "по паттерну - посредник", а меня уже накритиковали в [80].

У меня фантазии уже не хватает.


 
AndreyV ©   (2009-06-23 20:49) [86]

> [85] Student ©   (23.06.09 20:25)
> Уважаемый All. Пожалуйста, подскажите мне, каким образом
> мне избавиться от 22-х таймеров? Принцип? Я думаю отдельный
> класс строить "по паттерну - посредник", а меня уже накритиковали
> в [80].
>
> У меня фантазии уже не хватает.

Да ё моё. Я уже начал было отвечать, да удалил. Попробую ещё раз. Не глядя исходников, и не вникая особо:

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


 
Student ©   (2009-06-23 21:06) [87]

Ок. Делаю посредника. Пасибо AndreyV


 
AndreyV ©   (2009-06-23 21:15) [88]

> [87] Student ©   (23.06.09 21:06)
> Ок. Делаю посредника.

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


 
AndreyV ©   (2009-06-23 21:18) [89]

> [88] AndreyV ©   (23.06.09 21:15)
> Ты не торопись с посредником: абстрагируйся, представь задачу
> ещё раз.

Поспи, отвлекись, погуляй, потом вернись.



Страницы: 1 2 3 вся ветка

Форум: "Прочее";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.71 MB
Время: 0.006 c
2-1245838548
Uno-84
2009-06-24 14:15
2009.08.23
Отрисовка ProgressBar в ListView


2-1245733905
Tornado
2009-06-23 09:11
2009.08.23
Копирование файлов


15-1245757422
KiLLiR
2009-06-23 15:43
2009.08.23
Отличие фильтрации от поиска


15-1244032296
Игорь Шевченко
2009-06-03 16:31
2009.08.23
сделать для формы (фрейма, WinControl) аналог Begin/EndUpdatе


1-1212645024
EgorovAlex
2008-06-05 09:50
2009.08.23
Есть TAction и он назначен кнопке в тулбаре и пункту меню,





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский