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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генератор тестов, Тестирования кода 
:(
    Опции темы
Rohoss
Дата 3.7.2008, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



Я написал программку, и хотелось бы услышать критику специалистов. Пишу здесь, а не в разделе «тесты», потому, что программу выложил с исходным кодом. Тут все файлы проекта на Delphi 2006 + файл проекта для инно-сетап. Многие контролы  не стандартные, взяты отсюда. Отличаются от стандартных поддержкой скинов, а во всём остальном тоже. В названии класса присутствует буква «s», например TMemo – TsMemo. Хотелось бы узнать свои недостатки при написании кода, некоторые мелочи я и сам вижу, но может я что-то очень важное делаю не так…. Хотелось бы узнать мнение специалистов по данному коду. 
Исходник
Заранее спасибо!



--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Bose
Дата 3.7.2008, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А нельзя ли поподробнее, какой код тестирует твоя программка, и какие тесты она генерирует? smile 
PM MAIL WWW Skype   Вверх
MadCoder
Дата 3.7.2008, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По-видимому, она тесты генерирует электронные для абитуриентов).
PM WWW ICQ   Вверх
THandle
Дата 3.7.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Глянул на код:
1. Оформлен плохо, читать неудобно.
2. Нет try..finally там, где им быть не плохо было бы.
3. Вот такой код тоже не украшает: 

Код

if sSaveDialog1.Execute then
begin
rht.SaveToFile(sSaveDialog1.FileName);
end;


Лишние begin..end.

Даже если там необходимо сделать было бы несколько действий, я предпочел бы писать так:

Код

if not sSaveDialog1.Execute then
  Exit;


//Some Code

Могу и и более тщательно посмотреть, но я не подхожу под вот эти критерии:

Цитата(Rohoss @  3.7.2008,  02:20 Найти цитируемый пост)
специалистов


 smile 

PM   Вверх
MadCoder
Дата 3.7.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



THandle, я думаю вполне подходишь. Посмотри пожалуйста вот эту тему, там как раз по теме твоего ника smile.
PM WWW ICQ   Вверх
Rohoss
Дата 3.7.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



THandle, под специалистами я имел ввиду  постоянных пользователей форума vingrad, так что вполне подходишь и ты и другие участники  smile 
Цитата(MadCoder @  3.7.2008,  11:04 Найти цитируемый пост)
По-видимому, она тесты генерирует электронные для абитуриентов).

А почему обязательно для абитуриентов?  smile 



Это сообщение отредактировал(а) Rohoss - 3.7.2008, 19:18


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
MadCoder
Дата 3.7.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Rohoss @ 3.7.2008,  19:16)
THandle, под специалистами я имел ввиду  постоянных пользователей форума vingrad, так что вполне подходишь и ты и другие участники  smile 
Цитата(MadCoder @  3.7.2008,  11:04 Найти цитируемый пост)
По-видимому, она тесты генерирует электронные для абитуриентов).

А почему обязательно для абитуриентов?  smile

это так, к слову. А для кого?
PM WWW ICQ   Вверх
THandle
Дата 3.7.2008, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Цитата(MadCoder @  3.7.2008,  13:49 Найти цитируемый пост)
THandle, я думаю вполне подходишь. Посмотри пожалуйста вот эту тему, там как раз по теме твоего ника


Там даже массив не из меня, а из каких то cardinal'ов smile 
На самом деле темы то я все смотрю, но не во все пишу smile  Появится желание - напишу и туда.

Такс. Ну начнем разбор. Сразу говорю - я не специалист даже близко, так что все комменты не професссиональны smile 


Код

procedure TfrmTest.SavePathList(const Path:string);
var
str:TStringList;
begin
str:=TStringList.Create;
if not str.Count=0 then
begin
str.LoadFromFile(ExtractFilePath(ParamStr(0))+'path.list');
if str[0]<>Path then str.Insert(0,Path);
end
else
begin
str.Add(Path);
end;
str.SaveToFile(ExtractFilePath(ParamStr(0))+'path.list');
str.Free;
end;


Нус:

Код

str:=TStringList.Create;


после этого надо начинать try..finally...

Код

if not str.Count=0 then


хм...

а не кажется ли тебе, что это условия не наступит? smile
После создания СтрингЛичта Count = 0.
Так что условие бесполезное...

Код

if str[0]<>Path then str.Insert(0,Path);


а вдруг ничо в файле и нет?

надо бы проверять...

Код

if Str.Count > 0 then
  if str[0]<>Path then 
    str.Insert(0,Path);


А теперь как я бы написал эту процедуру smile :

Код

procedure TfrmTest.SavePathList(const Path : string);
begin
  with TStringList.Create do
    try
      LoadFromFile(ExtractFilePath(ParamStr(0)) + 'path.list');
      if Str.Count <> 0 then
        begin
          if CompareText(Strings[0], Path) = 0 then 
            Insert(0, Path);
        end
      else
        Add(Path);
      SaveToFile(ExtractFilePath(ParamStr(0)) + 'path.list');
    finally
      Free;
    end;
end;


Завтра продолжу разбирать smile

PM   Вверх
Shaggy
Дата 4.7.2008, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 2.5.2007
Где: г.Ижевск

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



Код

procedure TfrmTest.GeneralIniLoad; 
begin
  With TIniFile.Create(programDir+'config.ini'), FontEdit1 Do
    Try
      frmTest.Font.Name:=ReadString('Font','name',Dialog.Font.Name);
      frmTest.Font.Color:=ReadInteger('Font','Color',Dialog.Font.Color);
      frmTest.Font.Charset:=ReadInteger('Font','Charset',Dialog.Font.Charset);
      frmTest.Font.Size:=ReadInteger('Font','Size',Dialog.Font.Size);
      frmTest.Font.Style:=TFontStyles(Byte(StringToSet(GetPropInfo(Font,'Style'),ReadString('Font','Style',EmptyStr))));
    Finally
      Free;
    End;
end;


Код

procedure TfrmTest.FontEdit1Accept(Sender: TObject);
begin
  With TIniFile.Create(programDir+'config.ini'), FontEdit1 Do
    Try
      WriteString('Font','name',Dialog.Font.Name);
      WriteInteger('Font','Color',Dialog.Font.Color);
      WriteInteger('Font','Charset',Dialog.Font.Charset);
      WriteInteger('Font','Size',Dialog.Font.Size);
      WriteString('Font','Style',SetToString(GetPropInfo(Font,'Style'),Byte(Dialog.Font.Style));
    Finally
      Free;
    End;
  GeneralIniLoad; // <-- супер :)
end;


Код

procedure TfrmTest.FormCreate(Sender: TObject);
var
  Index:Integer;
  FileName:string;
begin
  ProgramDir:=ExtractFilePath(ParamStr(0));
  With TStringList.Create Do
    Try
      LoadFromFile(ProgramDir+'path.list');
      For Index:=0 To Min(9,Count-1) Do
        Reopen1.Add(NewItem(Strings[Index], 0, False, True, ExecSubMenu, 0, 'mi'+IntToStr(Index)));
    Finally
      Free;
    End;

  sSkinManager1.SkinDirectory:=ProgramDir;
  sSkinManager1.Active:=True;
  GeneralIniLoad;
  FileName:=ParamStr(1);
  If FileExists(FileName)
  Then
    Begin
      ClientDataSet3.FileName:=FileName;
      ClientDataSet3.Open;
      SavePathList(FileName);
      Zastroy;
    End;

end;


Код

procedure TfrmTest.ExecSubMenu;
begin
  FCloseExecute(Sender);
  ClientDataSet3.Close;
  ClientDataSet3.FileName:=(Sender As TMenuItem).Caption;
  ClientDataSet3.Open;
  Zastroy;
end;


это если по быстрому...

а условие:
Код

if not str.Count=0 then

не выполнится никогда... 
даже если str будет непустой
Цитата

Precedence of operators 
Operators                                   Precedence
@, not                                         first (highest)
*, /, div, mod, and, shl, shr, as    second
+, -, or, xor                                  third
=, <>, <, >, <=, >=, in, is            fourth (lowest)



Это сообщение отредактировал(а) Shaggy - 4.7.2008, 02:46
PM MAIL ICQ   Вверх
Rohoss
Дата 4.7.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



Код

if not str.Count=0 then

Ну это же действительно бред… не пойму как мне такое в голову пришло… 


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Rohoss
Дата 4.7.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



THandle В восьмой строчке у тебя ошибка надо так
Код

if CompareText(Strings[0], Path) <> 0 then



Shaggy, в TfrmTest.ExecSubMenu
Код

ClientDataSet3.FileName:=(Sender As TMenuItem).Caption;

В свойстве Caption появляется вот такой символ «&» он нужен для использования горячих клавишь, но он всю малину портит… Его как-то можно отключить?


Это сообщение отредактировал(а) Rohoss - 4.7.2008, 20:52


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
THandle
Дата 4.7.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Цитата(Rohoss @  4.7.2008,  21:16 Найти цитируемый пост)
Ну это же действительно бред… не пойму как мне такое в голову пришло…  


Со всеми бывает smile 

Вообще отвлекусь от темы на чуть чуть и скажу как я пишу программы. Вдруг кому пригодится. smile

1. Думаем.
2. Находим идею.
3. Набрасываем на листочке примерный план действий.
4. Думаем что для этого требуется.
5. Пишем первый модуль. Я предпочитаю использовать ООП. То есть пишем на классах.
6. По ходу дела используем {$IFDEF} и прочее для всяких функций поднятия ошибок, логирования...
7. Так же, по ходу дела, тестируем все это в программке, офрмленной чисто для тест. Пара кнопок которые вызывают методы класса и тд.
8. Усиленно тестируем готовый модуль и гоняем его под дебаггером.
9. Все ли вместилось в этот модуль? Если да то дальше, иначе пишем таким же образом еще и остальные. Разбивать программу по не большим модулям(30-50 кб) лично для меня удобнее...
10. Оптимизируем код.
11. Создаем GUI.
12. Прикручиваем к нему код.  
13. Усиленно все это дело тестируем на разных машинках.
14. Два варианта: или отдаём юзерам или кладем программу в архив. smile 



Так. Теперь по делу. smile

Код

procedure TfrmTest.GeneralIniLoad;
var
ini:TIniFile;
fs,fs2:TFontStyles;
begin

ini:=TIniFile.Create(programDir+'config.ini');
frmTest.Font.Name:=ini.ReadString('Font','name',FontEdit1.Dialog.Font.Name);
frmTest.Font.Color:= ini.ReadInteger('Font','Color',FontEdit1.Dialog.Font.Color);
frmTest.Font.Charset:= ini.ReadInteger('Font','Charset',FontEdit1.Dialog.Font.Charset);
frmTest.Font.Size:= ini.ReadInteger('Font','Size',FontEdit1.Dialog.Font.Size);


if ini.ReadBool('Font','fsBold',false) then
fs:=[fsBold];

if ini.ReadBool('Font','fsItalic',false) then
fs2:=[fsItalic]; fs:=fs+fs2;

if ini.ReadBool('Font','fsUnderline',false) then
fs2:=[fsUnderline]; fs:=fs+fs2;

if ini.ReadBool('Font','fsStrikeOut',false) then
fs2:=[fsStrikeOut]; fs:=fs+fs2;

frmTest.Font.Style:=fs ;

ini.Free;

end;



Неплохо бы тут try..finally юзать...

Еще, лично я бы вынес всем имена разделов Ini файла и прочие такие вещи в resourcestring.


Код

procedure TfrmTest.FCloseExecute(Sender: TObject);
var
I:Integer;
begin
for I := 0 to sPageControl1.PageCount- 1 do
begin
  sPageControl1.Pages[0].Free;
end;


end;



Лишние begin..end. Не очень красиво смотрится. ИМХО.




Код

procedure TfrmTest.FontEdit1Accept(Sender: TObject);
var
ini:TIniFile;
begin
ini:=TIniFile.Create(programDir+'config.ini');
ini.WriteString('Font','name',FontEdit1.Dialog.Font.Name);
ini.WriteInteger('Font','Color',FontEdit1.Dialog.Font.Color);
ini.WriteInteger('Font','Charset',FontEdit1.Dialog.Font.Charset);
ini.WriteInteger('Font','Size',FontEdit1.Dialog.Font.Size);

if fsBold in FontEdit1.Dialog.Font.Style then
ini.WriteBool('Font','fsBold',true) else
ini.WriteBool('Font','fsBold',false);

if fsItalic in FontEdit1.Dialog.Font.Style then
ini.WriteBool('Font','fsItalic',true) else
ini.WriteBool('Font','fsItalic',false);

if fsUnderline in FontEdit1.Dialog.Font.Style then
ini.WriteBool('Font','fsUnderline',true) else
ini.WriteBool('Font','fsUnderline',false);

if fsStrikeOut in FontEdit1.Dialog.Font.Style then
ini.WriteBool('Font','fsStrikeOut',true) else
ini.WriteBool('Font','fsStrikeOut',false);


ini.Free;
GeneralIniLoad;
end;



Опять таки нужен try..finally.

И еще:
Ну зачем, ну зачем нужна такая не красивая запись типа:
Код


if fsBold in FontEdit1.Dialog.Font.Style then
ini.WriteBool('Font','fsBold',true) else
ini.WriteBool('Font','fsBold',false);


Все очень легче сделать так:

Код

Ini.WriteBool('Font', 'fsBold', fsBold in FontEdit1.Dialog.Font.Style);


И остальное так же...

На сегодня хватит... Времени нет... Завтра продолжу. ОК?

А вообще:

Код построен на одних компонентах, никакой романтики smile 



Цитата(Rohoss @  4.7.2008,  21:36 Найти цитируемый пост)
THandle В восьмой строчке у тебя ошибка надо так



 smile 

Немножко условие не приметил, пишу то тут smile 

PM   Вверх
Shaggy
Дата 4.7.2008, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 2.5.2007
Где: г.Ижевск

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



Цитата(Rohoss @  4.7.2008,  22:36 Найти цитируемый пост)
В свойстве Caption появляется вот такой символ «&» он нужен для использования горячих клавишь, но он всю малину портит… Его как-то можно отключить?

Код

MainMenu.AutoHotKeys:=maManual;

PM MAIL ICQ   Вверх
Rohoss
Дата 5.7.2008, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



THandle, а зачем так усилено try..finally юзать? Ведь появления исключения при работе с ини-файлами большая редкость, я например, никогда не замечал. 


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
THandle
Дата 5.7.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Цитата(Rohoss @  5.7.2008,  12:34 Найти цитируемый пост)
THandle, а зачем так усилено try..finally юзать? Ведь появления исключения при работе с ини-файлами большая редкость, я например, никогда не замечал.  


А вдруг? Надо быть готовым ко всему. Поэтому и следует всегда для таких целей использовать try..finally.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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