Никакие метрики относительно стиля кодирования не являются частью такого предупреждения.
Для меня это - [приблизительно 1 116] статический анализ кода , который может действительно быть 'на' все время:
я поместил бы тест покрытия во второй шаг, тесты как таковые могут занять время.
не забывают, что "дрянной" код не обнаруживается метриками, но комбинация и эволюция (как в" тенденция ) метрик: посмотрите , Каково восхищение метриками кода? вопрос.
, Который означает, Вы не должны только рекомендовать, чтобы метрики кода к "автоматически определили "дрянной код"", но также необходимо рекомендовать правильной комбинации и анализу тенденции продвинуться те метрики.
На заметке на полях, я действительно совместно использую Ваш разочарование ;), и я не совместно использую точку зрения tloach (в комментариях другого, отвечает), "Задайте неопределенный вопрос, получите неопределенный ответ", он говорит..., что Ваш вопрос заслуживает определенного ответа.
Я делал что-то подобное в прошлом.
Я могу придумать два способа сделать это.
С помощью действий:
При использовании действий очень легко отслеживать использование пользовательского интерфейса, помещая код в обработчик TActionList.OnExecute. Это событие запускается перед выполнением отдельного действия, что позволяет вам отслеживать, что и когда произошло.
Например:
procedure TForm1.ActionList1Execute(Action: TBasicAction; var Handled: Boolean);
begin
WriteToLog(TAction(TBasicAction).Caption);
end;
Без действий:
Если вы не используете Действия, это становится немного сложнее, но не невозможно . Вы должны создать новый модуль с потомком TMenuItem с вашим кодом регистрации в нем. Обязательно поместите новый модуль после модуля MENU в разделе uses в каждом модуле, который его использует. Чтобы это работало, новый потомок должен называться TMenuItem. Поскольку вы, по сути, повторно вводите тот же класс, но с расширенной функциональностью.
Вот краткий блок, который я собрал, показывая очень простой пример.
unit MenuItemLogger;
interface
uses Menus;
Type
TMenuItem = class(Menus.TMenuItem)
public
procedure Click; override;
end;
implementation
uses windows;
{ TMenuItem }
procedure TMenuItem.Click;
begin
outputdebugstring(PWideChar(self.Caption));
inherited;
end;
end.
Чтобы использовать вышеуказанный блок, поместите его в качестве последнего блока в предложении uses любой формы / DataModule с меню (TMainMenu или TPopupMenu), которое вы хотите отслеживать. Если вы не хотите отслеживать конкретный объект, не включайте его.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ActnList, Menus, MenuItemLogger;
Эти два метода просты, и хотя они действительно работают, они, вероятно, не самые лучшие решения.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ActnList, Menus, MenuItemLogger;
Эти два метода просты и, хотя они работают, вероятно, не являются лучшими решениями.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ActnList, Menus, MenuItemLogger;
Эти два метода просты и, хотя они работают, вероятно, не являются лучшими решениями.
Полагаю, вы говорите о счетчиках производительности Windows
Взгляните на эту ссылку
Используйте системный монитор Windows (SYSMON), чтобы увидеть результат
взгляните на эту ссылку
Также есть Компоненты мониторинга производительности Prof для delphi