Skip to content

Instantly share code, notes, and snippets.

Created January 17, 2017 08:19
Show Gist options
  • Save anonymous/38b0a0c17a55af85be158d120be39e17 to your computer and use it in GitHub Desktop.
Save anonymous/38b0a0c17a55af85be158d120be39e17 to your computer and use it in GitHub Desktop.
TASK №1
var
...
begin
...
Log.First();
k = 0;
// Цикл по записям лога
while not Log.EOF() do
begin
// Если текущую работу выполнил наш пользователь
if Log.Fields("UserName") = User.Name then
begin
// Добавим к переменной HoursWorked длительность текущей работы
HoursWorked := HoursWorked + Log.Fields("Duration");
inc(k);
end;
// Перейдем к следующей записи лога
Log.Next();
end;
// Переведем общую длительность работ из минут в часы
HoursWorked := HoursWorked / 60;
// Вычислим среднюю длительность работ
Avg := HoursWorked / k;
// Зададим свойства отчета
Report.Fields("UserField1") := User.Name;
Report.Fields("UserField2") := FloatToStr(HoursWorked) + " (" +
FloatToStr(Avg) + " ч./работу)";
Report.Fields("Title") := "Отчет по отработанному времени";
Report.Fields("ViewScale") := "80%";
Report.Fields("LeftMargin") := "2см";
Report.Fields("RightMargin") := "1см";
Report.Fields("TopMargin") := "1см";
Report.Fields("BottomMargin") := "1см";
...
end;
@vkorepanov
Copy link

k = 0;

Имя переменной не отражает ее сути. Предлагаемое имя - userWorksCount

@vkorepanov
Copy link

// Цикл по записям лога
while not Log.EOF() do
begin
    // Если текущую работу выполнил наш пользователь
    if Log.Fields("UserName") = User.Name then
    begin
      // Добавим к переменной HoursWorked длительность текущей работы
      HoursWorked := HoursWorked + Log.Fields("Duration");
      inc(k);
    end;
    // Перейдем к следующей записи лога
    Log.Next();
end;

Будет нагляднее переписать код с использованием continue для уменьшения числа строк внутри отступа (между begin/end):

  // Цикл по записям лога
  while not Log.EOF() do
  begin
    // Пропуск всех пользователей, кроме нашего
    if Log.Fields("UserName") <> User.Name then
    begin
      // Перейдем к следующей записи лога
      Log.Next();
      continue;
    end;
    HoursWorked := HoursWorked + Log.Fields("Duration");
    inc(k);
  end;

@vkorepanov
Copy link

vkorepanov commented Jan 17, 2017

Avg := HoursWorked / k;

Лучше не использовать сокращения и писать слово полностью: average

@vkorepanov
Copy link

vkorepanov commented Jan 17, 2017

>   // Зададим свойства отчета
>   Report.Fields("UserField1") := User.Name;
>   Report.Fields("UserField2") := FloatToStr(HoursWorked) + " (" + 
>     FloatToStr(Avg) + " ч./работу)";
>   Report.Fields("Title") := "Отчет по отработанному времени";
>   Report.Fields("ViewScale") := "80%";
>   Report.Fields("LeftMargin") := "2см";
>   Report.Fields("RightMargin") := "1см";
>   Report.Fields("TopMargin") := "1см";
>   Report.Fields("BottomMargin") := "1см";

Возможно, инициализацию большинства полей можно выполнять 1 раз в отдельном методе (если компонент Report не используется для отображения разных типов данных). Здесь же нужно рассмотреть вариант изменения только поля UserField1 и UserField2.

@vkorepanov
Copy link

>   Report.Fields("UserField1") := User.Name;
>   Report.Fields("UserField2") := FloatToStr(HoursWorked) + " (" + 
>     FloatToStr(Avg) + " ч./работу)";

Имена UserField1 и UserField2 не отражают суть полей. Предлагаю использовать UserName и AverageWorkHours вместо них.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment