一键导入
freepascal-lazarus-code-review
Checklist de revisão de código FreePascal/Lazarus — qualidade, segurança, performance, SOLID, memória
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Checklist de revisão de código FreePascal/Lazarus — qualidade, segurança, performance, SOLID, memória
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Versao curta para migracao Delphi/IntraWeb -> Lazarus com equivalencia funcional. Foco em checklist objetivo, sem refatoracao e com checkpoint de progresso.
Migracao Delphi IntraWeb -> Lazarus IntraWeb com equivalencia funcional, sem refatorar regra de negocio. Inclui conversao FireDAC->Zeos, DFM->LFM, ajuste de units Delphi para FPC e fluxo com checkpoint (RETOMAR/STATUS/PAUSAR).
Padrões arquiteturais, de injeção de dependência e de UI para o ecossistema Projeto ACBr (Automação Comercial Brasil) em FreePascal/Lazarus.
Padrões pragmáticos de código limpo para FreePascal/Lazarus — conciso, direto, sem over-engineering
Implementação dos 23 padrões GoF (Gang of Four) em Object Pascal / FreePascal/Lazarus com interfaces, TInterfacedObject e princípios SOLID. Cobre Creational, Structural e Behavioral patterns.
Padrões de desenvolvimento com banco de dados Firebird via SQLdb/Zeos — conexão, PSQL, generators, transactions, migrations
| name | FreePascal/Lazarus Code Review |
| description | Checklist de revisão de código FreePascal/Lazarus — qualidade, segurança, performance, SOLID, memória |
Format ou concatenação em queriesTObjectList com OwnsObjects configurado corretamentetry/finally com Free para objetos temporáriosAssigned() antes de acessar referências que podem ser nilDestroy com override liberando campos ownedT em classes, I em interfaces, E em exceptionsF em campos privados, A em parâmetros, L em variáveis locaisProjeto.Camada.Dominio.Funcionalidade.pasbtn, edt, lbl, etc.)// ❌ Números mágicos
if ACustomer.Age > 18 then
// ✅ Constantes nomeadas
const MINIMUM_AGE = 18;
if ACustomer.Age > MINIMUM_AGE then
// ❌ with statement
with AQuery do begin
SQL.Text := '...';
Open;
end;
// ✅ Referência explícita
AQuery.SQL.Text := '...';
AQuery.Open;
// ❌ Catch genérico
except
on E: Exception do ShowMessage(E.Message);
// ✅ Exceptions específicas
except
on E: EFDDBEngineException do
raise EDatabaseException.Create('Falha: ' + E.Message);
// ❌ Lógica em OnClick
procedure TfrmMain.btnSaveClick(Sender: TObject);
begin
// 50 linhas de lógica de negócio aqui
end;
// ✅ Delegar para Service
procedure TfrmMain.btnSaveClick(Sender: TObject);
begin
FService.SaveCustomer(GetFormData);
end;
// ❌ Memory leak
function GetItems: TStringList;
begin
Result := TStringList.Create;
LoadItems(Result); // se LoadItems lançar exception, leak!
end;
// ✅ Seguro
function GetItems: TStringList;
begin
Result := TStringList.Create;
try
LoadItems(Result);
except
Result.Free;
raise;
end;
end;
🔴 BLOQUEANTE: Memory leak — objeto não liberado em caso de exception
🔴 BLOQUEANTE: SQL injection — query usando concatenação de string
🟡 SUGESTÃO: Extrair método — este bloco tem 35 linhas
🟡 SUGESTÃO: Usar interface em vez de classe concreta (DIP)
🟢 NIT: Renomear variável 'S' para nome descritivo
🟢 NIT: Preferir guard clause a nesting
❓ PERGUNTA: O que acontece se ACustomer for nil aqui?
❓ PERGUNTA: Este objeto é liberado por quem?
| Princípio | Verificar |
|---|---|
| SRP | Classe tem UMA responsabilidade? Service não faz acesso a dados? |
| OCP | Novas funcionalidades adicionam classes, não modificam existentes? |
| LSP | Qualquer implementação da interface funciona no lugar da outra? |
| ISP | Interface não tem métodos que implementadores não usam? |
| DIP | Constructor recebe interfaces, não classes concretas? |