sapbuddy-dsh 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +25 -4
- package/defaults/AGENTS.md +114 -114
- package/defaults/connections.example.json +21 -21
- package/defaults/prompts/Memory.md +21 -21
- package/defaults/prompts/SYSTEM.md +110 -110
- package/defaults/settings.example.json +3 -3
- package/dist/client.js +20 -5
- package/dist/index.js +85 -11
- package/dist/sap-tools/adtManager.d.ts +11 -1
- package/dist/sap-tools/adtManager.js +176 -9
- package/dist/sap-tools/connections-store.js +16 -3
- package/dist/sap-tools/execution.js +1 -1
- package/dist/tools.js +5 -3
- package/package.json +8 -3
- package/skills/abap-code-review/SKILL.md +75 -75
- package/skills/abap-code-review/assets/report-template.html +142 -142
- package/skills/abap-code-review/references/checklist.md +114 -114
- package/skills/abap-explain/SKILL.md +126 -126
- package/skills/abap-templates/SKILL.md +764 -764
- package/skills/abap-wiki/SKILL.md +104 -104
- package/skills/clean-abap/SKILL.md +91 -91
- package/skills/clean-abap/references/CleanABAP_zh.md +4309 -4309
- package/skills/dev-write/SKILL.md +137 -137
- package/skills/sap-abap-skills/README.md +205 -205
- package/skills/sap-abap-skills/SKILL.md +498 -498
- package/skills/sap-abap-skills/references/abap-dictionary.md +211 -211
- package/skills/sap-abap-skills/references/abap-sql.md +588 -588
- package/skills/sap-abap-skills/references/amdp.md +279 -279
- package/skills/sap-abap-skills/references/authorization.md +149 -149
- package/skills/sap-abap-skills/references/bits-bytes.md +92 -92
- package/skills/sap-abap-skills/references/builtin-functions.md +373 -373
- package/skills/sap-abap-skills/references/cds-views.md +412 -412
- package/skills/sap-abap-skills/references/cloud-development.md +299 -299
- package/skills/sap-abap-skills/references/constructor-expressions.md +458 -458
- package/skills/sap-abap-skills/references/date-time.md +415 -415
- package/skills/sap-abap-skills/references/design-patterns.md +292 -292
- package/skills/sap-abap-skills/references/dynamic-programming.md +426 -426
- package/skills/sap-abap-skills/references/exceptions.md +432 -432
- package/skills/sap-abap-skills/references/generative-ai.md +180 -180
- package/skills/sap-abap-skills/references/internal-tables.md +578 -578
- package/skills/sap-abap-skills/references/numeric-operations.md +219 -219
- package/skills/sap-abap-skills/references/object-orientation.md +518 -518
- package/skills/sap-abap-skills/references/performance.md +428 -428
- package/skills/sap-abap-skills/references/program-flow.md +302 -302
- package/skills/sap-abap-skills/references/rap-eml.md +549 -549
- package/skills/sap-abap-skills/references/released-classes.md +308 -308
- package/skills/sap-abap-skills/references/sap-luw.md +203 -203
- package/skills/sap-abap-skills/references/skill-reference-guide.md +98 -98
- package/skills/sap-abap-skills/references/sql-hierarchies.md +180 -180
- package/skills/sap-abap-skills/references/string-processing.md +488 -488
- package/skills/sap-abap-skills/references/table-grouping.md +150 -150
- package/skills/sap-abap-skills/references/tool-guide.md +285 -285
- package/skills/sap-abap-skills/references/unit-testing.md +512 -512
- package/skills/sap-abap-skills/references/where-conditions.md +223 -223
- package/skills/sap-abap-skills/references/xml-json.md +315 -315
- package/skills/translate-workflow/SKILL.md +69 -69
|
@@ -1,142 +1,142 @@
|
|
|
1
|
-
<!-- ABAP Code Review Report Template (固化模板)
|
|
2
|
-
用法:复制到工作区,替换所有 {{TOKEN}} 占位符,保持现有 CSS 不变。
|
|
3
|
-
严重度配色:高/需核实=红橙,中=琥珀,低=蓝,亮点=绿。
|
|
4
|
-
结构:顶部元信息常驻;下方为「多页签」切换(4 个页签),纯原生 JS、无外部依赖。
|
|
5
|
-
页签:
|
|
6
|
-
一、程序功能与结构概览 —— 内含「代码逻辑详细解析」子节({{LOGIC_SECTION}})
|
|
7
|
-
二、审查发现汇总 —— {{SUMMARY_SECTION}}
|
|
8
|
-
三、问题详解 —— 含 重点问题详解 {{DETAIL_ITEMS}} / 中危 {{MEDIUM_ITEMS}} / 低危 {{LOW_ITEMS}}
|
|
9
|
-
四、亮点与结论 —— 含 亮点 {{POSITIVES}} / 结论与修复优先级 {{CONCLUSION_SECTION}}
|
|
10
|
-
{{OVERVIEW_SECTION}} 为概览段落+列表;{{LOGIC_SECTION}} 为逻辑叙述+(ALV 报表时)字段取数逻辑表;
|
|
11
|
-
非 ALV 程序(函数/接口类)时 {{LOGIC_SECTION}} 仅含文字解析、不含取数表。 -->
|
|
12
|
-
<!DOCTYPE html>
|
|
13
|
-
<html lang="zh-CN">
|
|
14
|
-
<head>
|
|
15
|
-
<meta charset="UTF-8">
|
|
16
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
17
|
-
<title>ABAP 代码审查报告 · {{PROGRAM_NAME}}</title>
|
|
18
|
-
<style>
|
|
19
|
-
:root{
|
|
20
|
-
--bg:#ffffff; --ink:#1f2937; --muted:#6b7280; --line:#e5e7eb;
|
|
21
|
-
--brand:#b45309; --brand2:#d97706;
|
|
22
|
-
--crit:#dc2626; --high:#ea580c; --med:#d97706; --low:#2563eb; --ok:#059669;
|
|
23
|
-
--chip:#f3f4f6;
|
|
24
|
-
}
|
|
25
|
-
*{box-sizing:border-box}
|
|
26
|
-
body{font-family:-apple-system,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;
|
|
27
|
-
color:var(--ink); background:var(--bg); margin:0; line-height:1.65; font-size:14px}
|
|
28
|
-
.wrap{max-width:1020px; margin:0 auto; padding:40px 36px 64px}
|
|
29
|
-
header{border-bottom:3px solid var(--brand); padding-bottom:18px; margin-bottom:8px}
|
|
30
|
-
h1{font-size:24px; margin:0 0 6px; color:var(--ink)}
|
|
31
|
-
.sub{color:var(--muted); font-size:13px}
|
|
32
|
-
h2{font-size:18px; margin:34px 0 12px; padding-left:10px; border-left:4px solid var(--brand); color:var(--ink)}
|
|
33
|
-
h3{font-size:15px; margin:22px 0 8px; color:var(--brand)}
|
|
34
|
-
table{border-collapse:collapse; width:100%; margin:10px 0; font-size:13px}
|
|
35
|
-
th,td{border:1px solid var(--line); padding:8px 10px; text-align:left; vertical-align:top}
|
|
36
|
-
th{background:#f9fafb; font-weight:600}
|
|
37
|
-
.meta td{width:50%}
|
|
38
|
-
.meta td:first-child{background:#f9fafb; font-weight:600; width:160px}
|
|
39
|
-
.sev{display:inline-block; padding:2px 9px; border-radius:11px; font-size:12px; font-weight:700; color:#fff; white-space:nowrap}
|
|
40
|
-
.s-crit{background:var(--crit)} .s-high{background:var(--high)} .s-med{background:var(--med)} .s-low{background:var(--low)} .s-ok{background:var(--ok)}
|
|
41
|
-
code{background:#f3f4f6; padding:1px 5px; border-radius:4px; font-family:"SFMono-Regular",Consolas,monospace; font-size:12.5px; color:#b45309}
|
|
42
|
-
pre{background:#0f172a; color:#e2e8f0; padding:14px 16px; border-radius:8px; overflow:auto; font-size:12.5px; line-height:1.55; font-family:Consolas,monospace}
|
|
43
|
-
pre .c{color:#94a3b8} pre .k{color:#fca5a5} pre .s{color:#fcd34d}
|
|
44
|
-
.callout{border:1px solid var(--line); border-left:4px solid var(--brand); background:#fffbeb; padding:12px 16px; border-radius:6px; margin:12px 0}
|
|
45
|
-
.grid{display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin:14px 0}
|
|
46
|
-
.stat{background:#f9fafb; border:1px solid var(--line); border-radius:8px; padding:14px; text-align:center}
|
|
47
|
-
.stat .n{font-size:26px; font-weight:800; display:block}
|
|
48
|
-
.stat .l{font-size:12px; color:var(--muted)}
|
|
49
|
-
ul{margin:8px 0; padding-left:22px} li{margin:5px 0}
|
|
50
|
-
.foot{margin-top:40px; padding-top:16px; border-top:1px solid var(--line); color:var(--muted); font-size:12px}
|
|
51
|
-
.pos{background:#ecfdf5; border:1px solid #a7f3d0; border-radius:8px; padding:14px 18px}
|
|
52
|
-
|
|
53
|
-
/* ---- 页签导航 ---- */
|
|
54
|
-
.tabs{display:flex; flex-wrap:wrap; gap:4px; border-bottom:2px solid var(--line); margin:22px 0 0; padding-bottom:0}
|
|
55
|
-
.tab-btn{appearance:none; border:none; background:transparent; cursor:pointer; font:inherit; font-size:13px;
|
|
56
|
-
color:var(--muted); padding:9px 13px; margin-bottom:-2px; border-bottom:3px solid transparent;
|
|
57
|
-
border-radius:7px 7px 0 0; white-space:nowrap; transition:background .15s,color .15s}
|
|
58
|
-
.tab-btn:hover{color:var(--ink); background:#f9fafb}
|
|
59
|
-
.tab-btn.active{color:var(--brand); font-weight:700; border-bottom-color:var(--brand); background:#fffbeb}
|
|
60
|
-
.tab-panel{display:none; padding-top:8px; animation:fade .2s ease}
|
|
61
|
-
.tab-panel.active{display:block}
|
|
62
|
-
@keyframes fade{from{opacity:.35} to{opacity:1}}
|
|
63
|
-
@media (max-width:680px){ .grid{grid-template-columns:repeat(2,1fr)} .tab-btn{font-size:12px; padding:8px 10px} }
|
|
64
|
-
</style>
|
|
65
|
-
</head>
|
|
66
|
-
<body>
|
|
67
|
-
<div class="wrap">
|
|
68
|
-
|
|
69
|
-
<header>
|
|
70
|
-
<h1>ABAP 代码审查报告</h1>
|
|
71
|
-
<div class="sub">程序 <strong>{{PROGRAM_NAME}}</strong> · {{PROGRAM_SUB}}</div>
|
|
72
|
-
</header>
|
|
73
|
-
|
|
74
|
-
<table class="meta">
|
|
75
|
-
<tr><td>程序名称</td><td>{{PROGRAM_NAME}}</td></tr>
|
|
76
|
-
<tr><td>审查对象</td><td>{{REVIEW_OBJ}}</td></tr>
|
|
77
|
-
<tr><td>审查人</td><td>{{REVIEWER}}</td></tr>
|
|
78
|
-
<tr><td>审查日期</td><td>{{REVIEW_DATE}}</td></tr>
|
|
79
|
-
<tr><td>审查方式</td><td>{{REVIEW_METHOD}}</td></tr>
|
|
80
|
-
<tr><td>总体结论</td><td>{{VERDICT_CHIP}} {{VERDICT_TEXT}}</td></tr>
|
|
81
|
-
</table>
|
|
82
|
-
|
|
83
|
-
<!-- ===================== 多页签区域(4 页签) ===================== -->
|
|
84
|
-
<div class="tabs" role="tablist">
|
|
85
|
-
<button class="tab-btn active" role="tab" onclick="showTab('tab-overview',this)">一、程序功能与结构概览</button>
|
|
86
|
-
<button class="tab-btn" role="tab" onclick="showTab('tab-summary',this)">二、审查发现汇总</button>
|
|
87
|
-
<button class="tab-btn" role="tab" onclick="showTab('tab-issues',this)">三、问题详解</button>
|
|
88
|
-
<button class="tab-btn" role="tab" onclick="showTab('tab-concl',this)">四、亮点与结论</button>
|
|
89
|
-
</div>
|
|
90
|
-
|
|
91
|
-
<!-- 一、程序功能与结构概览(内含代码逻辑详细解析) -->
|
|
92
|
-
<section class="tab-panel active" id="tab-overview" role="tabpanel">
|
|
93
|
-
{{OVERVIEW_SECTION}}
|
|
94
|
-
<h2>代码逻辑详细解析</h2>
|
|
95
|
-
{{LOGIC_SECTION}}
|
|
96
|
-
</section>
|
|
97
|
-
|
|
98
|
-
<!-- 二、审查发现汇总 -->
|
|
99
|
-
<section class="tab-panel" id="tab-summary" role="tabpanel">
|
|
100
|
-
{{SUMMARY_SECTION}}
|
|
101
|
-
</section>
|
|
102
|
-
|
|
103
|
-
<!-- 三、问题详解(重点 + 中危 + 低危) -->
|
|
104
|
-
<section class="tab-panel" id="tab-issues" role="tabpanel">
|
|
105
|
-
<h2>重点问题详解(高危 / 需核实)</h2>
|
|
106
|
-
{{DETAIL_ITEMS}}
|
|
107
|
-
<h2>中危问题</h2>
|
|
108
|
-
{{MEDIUM_ITEMS}}
|
|
109
|
-
<h2>低危与改进建议</h2>
|
|
110
|
-
{{LOW_ITEMS}}
|
|
111
|
-
</section>
|
|
112
|
-
|
|
113
|
-
<!-- 四、亮点与结论(亮点 + 结论与修复优先级) -->
|
|
114
|
-
<section class="tab-panel" id="tab-concl" role="tabpanel">
|
|
115
|
-
<h2>亮点(值得保留)</h2>
|
|
116
|
-
{{POSITIVES}}
|
|
117
|
-
<h2>结论与修复优先级</h2>
|
|
118
|
-
{{CONCLUSION_SECTION}}
|
|
119
|
-
</section>
|
|
120
|
-
|
|
121
|
-
<div class="foot">
|
|
122
|
-
报告由 {{REVIEWER}} 生成 · {{REVIEW_METHOD}} · 涉及对象:{{REVIEW_OBJ}}
|
|
123
|
-
</div>
|
|
124
|
-
|
|
125
|
-
</div>
|
|
126
|
-
|
|
127
|
-
<script>
|
|
128
|
-
function showTab(id, btn){
|
|
129
|
-
var panels = document.querySelectorAll('.tab-panel');
|
|
130
|
-
var btns = document.querySelectorAll('.tab-btn');
|
|
131
|
-
for(var i=0;i<panels.length;i++){ panels[i].classList.remove('active'); }
|
|
132
|
-
for(var j=0;j<btns.length;j++){ btns[j].classList.remove('active'); }
|
|
133
|
-
var el = document.getElementById(id);
|
|
134
|
-
if(el){ el.classList.add('active'); }
|
|
135
|
-
if(btn){ btn.classList.add('active'); }
|
|
136
|
-
}
|
|
137
|
-
</script>
|
|
138
|
-
<div style="text-align:center; color:var(--muted); font-size:12px; margin-top:40px; border-top:1px solid var(--line); padding-top:16px">
|
|
139
|
-
Generated by SapBuddy
|
|
140
|
-
</div>
|
|
141
|
-
</body>
|
|
142
|
-
</html>
|
|
1
|
+
<!-- ABAP Code Review Report Template (固化模板)
|
|
2
|
+
用法:复制到工作区,替换所有 {{TOKEN}} 占位符,保持现有 CSS 不变。
|
|
3
|
+
严重度配色:高/需核实=红橙,中=琥珀,低=蓝,亮点=绿。
|
|
4
|
+
结构:顶部元信息常驻;下方为「多页签」切换(4 个页签),纯原生 JS、无外部依赖。
|
|
5
|
+
页签:
|
|
6
|
+
一、程序功能与结构概览 —— 内含「代码逻辑详细解析」子节({{LOGIC_SECTION}})
|
|
7
|
+
二、审查发现汇总 —— {{SUMMARY_SECTION}}
|
|
8
|
+
三、问题详解 —— 含 重点问题详解 {{DETAIL_ITEMS}} / 中危 {{MEDIUM_ITEMS}} / 低危 {{LOW_ITEMS}}
|
|
9
|
+
四、亮点与结论 —— 含 亮点 {{POSITIVES}} / 结论与修复优先级 {{CONCLUSION_SECTION}}
|
|
10
|
+
{{OVERVIEW_SECTION}} 为概览段落+列表;{{LOGIC_SECTION}} 为逻辑叙述+(ALV 报表时)字段取数逻辑表;
|
|
11
|
+
非 ALV 程序(函数/接口类)时 {{LOGIC_SECTION}} 仅含文字解析、不含取数表。 -->
|
|
12
|
+
<!DOCTYPE html>
|
|
13
|
+
<html lang="zh-CN">
|
|
14
|
+
<head>
|
|
15
|
+
<meta charset="UTF-8">
|
|
16
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
17
|
+
<title>ABAP 代码审查报告 · {{PROGRAM_NAME}}</title>
|
|
18
|
+
<style>
|
|
19
|
+
:root{
|
|
20
|
+
--bg:#ffffff; --ink:#1f2937; --muted:#6b7280; --line:#e5e7eb;
|
|
21
|
+
--brand:#b45309; --brand2:#d97706;
|
|
22
|
+
--crit:#dc2626; --high:#ea580c; --med:#d97706; --low:#2563eb; --ok:#059669;
|
|
23
|
+
--chip:#f3f4f6;
|
|
24
|
+
}
|
|
25
|
+
*{box-sizing:border-box}
|
|
26
|
+
body{font-family:-apple-system,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;
|
|
27
|
+
color:var(--ink); background:var(--bg); margin:0; line-height:1.65; font-size:14px}
|
|
28
|
+
.wrap{max-width:1020px; margin:0 auto; padding:40px 36px 64px}
|
|
29
|
+
header{border-bottom:3px solid var(--brand); padding-bottom:18px; margin-bottom:8px}
|
|
30
|
+
h1{font-size:24px; margin:0 0 6px; color:var(--ink)}
|
|
31
|
+
.sub{color:var(--muted); font-size:13px}
|
|
32
|
+
h2{font-size:18px; margin:34px 0 12px; padding-left:10px; border-left:4px solid var(--brand); color:var(--ink)}
|
|
33
|
+
h3{font-size:15px; margin:22px 0 8px; color:var(--brand)}
|
|
34
|
+
table{border-collapse:collapse; width:100%; margin:10px 0; font-size:13px}
|
|
35
|
+
th,td{border:1px solid var(--line); padding:8px 10px; text-align:left; vertical-align:top}
|
|
36
|
+
th{background:#f9fafb; font-weight:600}
|
|
37
|
+
.meta td{width:50%}
|
|
38
|
+
.meta td:first-child{background:#f9fafb; font-weight:600; width:160px}
|
|
39
|
+
.sev{display:inline-block; padding:2px 9px; border-radius:11px; font-size:12px; font-weight:700; color:#fff; white-space:nowrap}
|
|
40
|
+
.s-crit{background:var(--crit)} .s-high{background:var(--high)} .s-med{background:var(--med)} .s-low{background:var(--low)} .s-ok{background:var(--ok)}
|
|
41
|
+
code{background:#f3f4f6; padding:1px 5px; border-radius:4px; font-family:"SFMono-Regular",Consolas,monospace; font-size:12.5px; color:#b45309}
|
|
42
|
+
pre{background:#0f172a; color:#e2e8f0; padding:14px 16px; border-radius:8px; overflow:auto; font-size:12.5px; line-height:1.55; font-family:Consolas,monospace}
|
|
43
|
+
pre .c{color:#94a3b8} pre .k{color:#fca5a5} pre .s{color:#fcd34d}
|
|
44
|
+
.callout{border:1px solid var(--line); border-left:4px solid var(--brand); background:#fffbeb; padding:12px 16px; border-radius:6px; margin:12px 0}
|
|
45
|
+
.grid{display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin:14px 0}
|
|
46
|
+
.stat{background:#f9fafb; border:1px solid var(--line); border-radius:8px; padding:14px; text-align:center}
|
|
47
|
+
.stat .n{font-size:26px; font-weight:800; display:block}
|
|
48
|
+
.stat .l{font-size:12px; color:var(--muted)}
|
|
49
|
+
ul{margin:8px 0; padding-left:22px} li{margin:5px 0}
|
|
50
|
+
.foot{margin-top:40px; padding-top:16px; border-top:1px solid var(--line); color:var(--muted); font-size:12px}
|
|
51
|
+
.pos{background:#ecfdf5; border:1px solid #a7f3d0; border-radius:8px; padding:14px 18px}
|
|
52
|
+
|
|
53
|
+
/* ---- 页签导航 ---- */
|
|
54
|
+
.tabs{display:flex; flex-wrap:wrap; gap:4px; border-bottom:2px solid var(--line); margin:22px 0 0; padding-bottom:0}
|
|
55
|
+
.tab-btn{appearance:none; border:none; background:transparent; cursor:pointer; font:inherit; font-size:13px;
|
|
56
|
+
color:var(--muted); padding:9px 13px; margin-bottom:-2px; border-bottom:3px solid transparent;
|
|
57
|
+
border-radius:7px 7px 0 0; white-space:nowrap; transition:background .15s,color .15s}
|
|
58
|
+
.tab-btn:hover{color:var(--ink); background:#f9fafb}
|
|
59
|
+
.tab-btn.active{color:var(--brand); font-weight:700; border-bottom-color:var(--brand); background:#fffbeb}
|
|
60
|
+
.tab-panel{display:none; padding-top:8px; animation:fade .2s ease}
|
|
61
|
+
.tab-panel.active{display:block}
|
|
62
|
+
@keyframes fade{from{opacity:.35} to{opacity:1}}
|
|
63
|
+
@media (max-width:680px){ .grid{grid-template-columns:repeat(2,1fr)} .tab-btn{font-size:12px; padding:8px 10px} }
|
|
64
|
+
</style>
|
|
65
|
+
</head>
|
|
66
|
+
<body>
|
|
67
|
+
<div class="wrap">
|
|
68
|
+
|
|
69
|
+
<header>
|
|
70
|
+
<h1>ABAP 代码审查报告</h1>
|
|
71
|
+
<div class="sub">程序 <strong>{{PROGRAM_NAME}}</strong> · {{PROGRAM_SUB}}</div>
|
|
72
|
+
</header>
|
|
73
|
+
|
|
74
|
+
<table class="meta">
|
|
75
|
+
<tr><td>程序名称</td><td>{{PROGRAM_NAME}}</td></tr>
|
|
76
|
+
<tr><td>审查对象</td><td>{{REVIEW_OBJ}}</td></tr>
|
|
77
|
+
<tr><td>审查人</td><td>{{REVIEWER}}</td></tr>
|
|
78
|
+
<tr><td>审查日期</td><td>{{REVIEW_DATE}}</td></tr>
|
|
79
|
+
<tr><td>审查方式</td><td>{{REVIEW_METHOD}}</td></tr>
|
|
80
|
+
<tr><td>总体结论</td><td>{{VERDICT_CHIP}} {{VERDICT_TEXT}}</td></tr>
|
|
81
|
+
</table>
|
|
82
|
+
|
|
83
|
+
<!-- ===================== 多页签区域(4 页签) ===================== -->
|
|
84
|
+
<div class="tabs" role="tablist">
|
|
85
|
+
<button class="tab-btn active" role="tab" onclick="showTab('tab-overview',this)">一、程序功能与结构概览</button>
|
|
86
|
+
<button class="tab-btn" role="tab" onclick="showTab('tab-summary',this)">二、审查发现汇总</button>
|
|
87
|
+
<button class="tab-btn" role="tab" onclick="showTab('tab-issues',this)">三、问题详解</button>
|
|
88
|
+
<button class="tab-btn" role="tab" onclick="showTab('tab-concl',this)">四、亮点与结论</button>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<!-- 一、程序功能与结构概览(内含代码逻辑详细解析) -->
|
|
92
|
+
<section class="tab-panel active" id="tab-overview" role="tabpanel">
|
|
93
|
+
{{OVERVIEW_SECTION}}
|
|
94
|
+
<h2>代码逻辑详细解析</h2>
|
|
95
|
+
{{LOGIC_SECTION}}
|
|
96
|
+
</section>
|
|
97
|
+
|
|
98
|
+
<!-- 二、审查发现汇总 -->
|
|
99
|
+
<section class="tab-panel" id="tab-summary" role="tabpanel">
|
|
100
|
+
{{SUMMARY_SECTION}}
|
|
101
|
+
</section>
|
|
102
|
+
|
|
103
|
+
<!-- 三、问题详解(重点 + 中危 + 低危) -->
|
|
104
|
+
<section class="tab-panel" id="tab-issues" role="tabpanel">
|
|
105
|
+
<h2>重点问题详解(高危 / 需核实)</h2>
|
|
106
|
+
{{DETAIL_ITEMS}}
|
|
107
|
+
<h2>中危问题</h2>
|
|
108
|
+
{{MEDIUM_ITEMS}}
|
|
109
|
+
<h2>低危与改进建议</h2>
|
|
110
|
+
{{LOW_ITEMS}}
|
|
111
|
+
</section>
|
|
112
|
+
|
|
113
|
+
<!-- 四、亮点与结论(亮点 + 结论与修复优先级) -->
|
|
114
|
+
<section class="tab-panel" id="tab-concl" role="tabpanel">
|
|
115
|
+
<h2>亮点(值得保留)</h2>
|
|
116
|
+
{{POSITIVES}}
|
|
117
|
+
<h2>结论与修复优先级</h2>
|
|
118
|
+
{{CONCLUSION_SECTION}}
|
|
119
|
+
</section>
|
|
120
|
+
|
|
121
|
+
<div class="foot">
|
|
122
|
+
报告由 {{REVIEWER}} 生成 · {{REVIEW_METHOD}} · 涉及对象:{{REVIEW_OBJ}}
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
</div>
|
|
126
|
+
|
|
127
|
+
<script>
|
|
128
|
+
function showTab(id, btn){
|
|
129
|
+
var panels = document.querySelectorAll('.tab-panel');
|
|
130
|
+
var btns = document.querySelectorAll('.tab-btn');
|
|
131
|
+
for(var i=0;i<panels.length;i++){ panels[i].classList.remove('active'); }
|
|
132
|
+
for(var j=0;j<btns.length;j++){ btns[j].classList.remove('active'); }
|
|
133
|
+
var el = document.getElementById(id);
|
|
134
|
+
if(el){ el.classList.add('active'); }
|
|
135
|
+
if(btn){ btn.classList.add('active'); }
|
|
136
|
+
}
|
|
137
|
+
</script>
|
|
138
|
+
<div style="text-align:center; color:var(--muted); font-size:12px; margin-top:40px; border-top:1px solid var(--line); padding-top:16px">
|
|
139
|
+
Generated by SapBuddy
|
|
140
|
+
</div>
|
|
141
|
+
</body>
|
|
142
|
+
</html>
|
|
@@ -1,114 +1,114 @@
|
|
|
1
|
-
# ABAP 代码审查通用清单
|
|
2
|
-
|
|
3
|
-
每次审查按以下维度逐条核对,记录:编号、严重度、位置(FORM/方法/区域)、现象、建议修复。
|
|
4
|
-
适用对象:所有 ABAP 程序(报表、INCLUDE、函数模块、类),尤其含外部接口(HTTP/CRM)调用、可编辑 ALV 回写、JSON 序列化场景的程序。
|
|
5
|
-
本清单为通用基线,不绑定某次具体审查结果;针对特定程序可临时增删条目。
|
|
6
|
-
|
|
7
|
-
## 1. 文档与规范
|
|
8
|
-
- [ ] 程序头(名称 / 创建者 / 申请者 / 概要)与变更记录是否填写完整。
|
|
9
|
-
- [ ] `MESSAGE-ID` 声明后是否在代码中使用消息类,而非硬编码字面量;同一消息是否重复多处以致难以维护。
|
|
10
|
-
- [ ] 命名规范:Z/Y 前缀、变量/类型/常量命名是否清晰自解释(匈牙利前缀:lv_/ls_/lt_/iv_/ev_ 等)。
|
|
11
|
-
- [ ] **结构/表字段类型:自建结构、DDIC 表/结构字段使用裸内置类型时,可提示是否有更合适的 DDIC 数据元素;裸类型本身不算阻断问题。**
|
|
12
|
-
有业务语义或复用约束时可优先使用 DDIC 数据元素/结构;无合适标准元素时可评估是否创建 Z 数据元素 + 域。
|
|
13
|
-
- [ ] **硬编码中文:是否存在代码内硬编码的用户可见文案(提示/错误/列标题/消息)?**
|
|
14
|
-
必须走消息类(MESSAGE e001(zxxx))或文本元素(TEXT-xxx)。
|
|
15
|
-
- [ ] 注释是否说明「为什么」(业务意图),而非复述「做了什么」。
|
|
16
|
-
|
|
17
|
-
## 2. 语法与版本兼容
|
|
18
|
-
- [ ] 内联声明 `DATA(...)` / `FINAL(...)` 是否被目标系统版本支持(7.40 SP08+;`FINAL` 需 7.50+)。
|
|
19
|
-
- [ ] 表表达式 `itab[...]`、构造运算符 `VALUE`/`NEW`/`CONV`/`COND`/`SWITCH`/`REDUCE`/`FILTER` 使用是否兼容目标版本。
|
|
20
|
-
- [ ] ABAP SQL 宿主变量 `@`、逗号分隔列表、SELECT 内 SQL 表达式需 7.40 SP05+。
|
|
21
|
-
- [ ] 避免使用已废弃写法:`TABLES` 语句、`MOVE...TO`、动态 `PERFORM`、云环境禁用的 `WRITE`/`DESCRIBE TABLE`/`sy-datum` 直接引用。
|
|
22
|
-
- [ ] 云/ steer 环境优先 released API(如 `xco_cp`),避免未发布对象。
|
|
23
|
-
|
|
24
|
-
## 3. ABAP SQL(开放性 SQL)
|
|
25
|
-
- [ ] 一律使用宿主变量 `@`,杜绝字符串拼接 SQL(防注入)。
|
|
26
|
-
- [ ] 避免在循环内 `SELECT`(应改用 `FOR ALL ENTRIES` / `JOIN` / 临时内表)。
|
|
27
|
-
- [ ] `FOR ALL ENTRIES` 前检查驱动内表非空,避免退化为全表扫描。
|
|
28
|
-
- [ ] 大结果集使用 `PACKAGE SIZE` / `UP TO n ROWS` 限流。
|
|
29
|
-
- [ ] `JOIN` 类型(INNER/LEFT/RIGHT)与 `ON` 条件完整正确。
|
|
30
|
-
- [ ] 聚合、`GROUP BY`、`HAVING` 逻辑正确;避免 `SELECT *`,只取所需字段。
|
|
31
|
-
|
|
32
|
-
## 4. 内表与数据结构
|
|
33
|
-
- [ ] 高频键值访问优先 `SORTED` / `HASHED` 表或辅助键。
|
|
34
|
-
- [ ] 循环内修改优先 `FIELD-SYMBOL` 而非工作区拷贝(性能与一致性)。
|
|
35
|
-
- [ ] 判存在用 `line_exists()` / `line_index()` 替代仅判 `READ TABLE` 的 `sy-subrc`。
|
|
36
|
-
- [ ] `MOVE-CORRESPONDING` 字段对齐正确;通用场景显式赋值更清晰更快。
|
|
37
|
-
- [ ] 表对表 `MOVE-CORRESPONDING` 要求行类型一致。
|
|
38
|
-
|
|
39
|
-
## 5. 外部接口 / HTTP / JSON(对接类程序重点)
|
|
40
|
-
- [ ] 反序列化前校验返回数据非空/格式;解析失败有 `TRY/CATCH` 兜底,避免 `CX_SY_*` 短 dump。
|
|
41
|
-
- [ ] URL 查询参数做 URL 编码(`CL_HTTP_UTILITY=>ESCAPE_URL`),防请求被破坏或参数注入。
|
|
42
|
-
- [ ] HTTP 状态码 / 通信异常有处理,且失败提示明确、非空白。
|
|
43
|
-
- [ ] 序列化 `PRETTY_NAME`(驼峰 / 下划线 / 用户格式)与对端约定一致。
|
|
44
|
-
- [ ] 视场景评估超时、重试、熔断等健壮性。
|
|
45
|
-
|
|
46
|
-
## 6. 数据处理与展平
|
|
47
|
-
- [ ] 嵌套 `LOOP` 中修改内表应使用 `MODIFY ... INDEX` / `TRANSPORTING`。
|
|
48
|
-
- [ ] 数值计算防除零(`CX_SY_ZERODIVIDE`)。
|
|
49
|
-
- [ ] 字符串转数字前校验格式(`CX_SY_CONVERSION_NO_NUMBER`)。
|
|
50
|
-
- [ ] 子串 / 偏移访问前校验长度(`CX_SY_RANGE_OUT_OF_BOUNDS`)。
|
|
51
|
-
|
|
52
|
-
## 7. 错误处理与异常
|
|
53
|
-
- [ ] 关键操作包 `TRY/CATCH`,捕获 `cx_root` 兜底,避免裸奔。
|
|
54
|
-
- [ ] 动态 `ASSIGN (lv_name)` 字段名非法会短 dump,需 `TRY/CATCH` 或先校验字段名合法性。
|
|
55
|
-
- [ ] 解引用引用变量 / 对象前做 `IS BOUND` 检查。
|
|
56
|
-
- [ ] 业务校验失败给出明确消息,不静默吞掉错误。
|
|
57
|
-
|
|
58
|
-
## 8. ALV 与用户交互
|
|
59
|
-
- [ ] 可编辑 ALV 单元格回写优先 `MODIFY ... TRANSPORTING (fieldname)`,避免脆弱的动态 `ASSIGN`。
|
|
60
|
-
- [ ] 事件类(如 `DATA_CHANGED`)必须实例化并 `SET HANDLER`,否则为死代码(常带 `##NEEDED` 抑制)。
|
|
61
|
-
- [ ] 下拉、复选框、选择框的字段名与内表结构一致。
|
|
62
|
-
- [ ] 刷新使用 `IS_STABLE` 避免光标跳变。
|
|
63
|
-
- [ ] 用户命令(`USER_COMMAND`)对未选行给出提示而非 dump。
|
|
64
|
-
|
|
65
|
-
## 9. 授权与安全
|
|
66
|
-
- [ ] 敏感操作 / 数据读写字前 `AUTHORITY-CHECK`(事务码、业务对象权限)。
|
|
67
|
-
- [ ] SQL 注入:一律宿主变量,禁止拼接。
|
|
68
|
-
- [ ] 凭据(token / secret / key / 账号)不在配置表明文存储;评估加密与权限收敛。
|
|
69
|
-
- [ ] 对外回写 / 发送前确认权限与可追溯性。
|
|
70
|
-
|
|
71
|
-
## 10. 性能
|
|
72
|
-
- [ ] 避免循环内数据库访问。
|
|
73
|
-
- [ ] 内表访问选对表类型(SORTED / HASHED)。
|
|
74
|
-
- [ ] `SORT` 后 `READ TABLE` 用 `BINARY SEARCH`(否则线性扫描)。
|
|
75
|
-
- [ ] 嵌套 `LOOP` 用辅助表/`SORTED` 表消除 N×M 扫描;可用 `GROUP BY` / `REDUCE` 替代手工累加。
|
|
76
|
-
- [ ] `DELETE ADJACENT DUPLICATES` 前确认已按去重键排序(否则结果不确定)。
|
|
77
|
-
- [ ] 大批量 `MODIFY` / `INSERT` 用内表整批而非单条。
|
|
78
|
-
- [ ] 避免重复 `SORT` / 重复查询。
|
|
79
|
-
- [ ] 大结果集用 `PACKAGE SIZE` 流式处理。
|
|
80
|
-
- [ ] 字符串拼接用 `&&` / 字符串模板,避免 `CONCATENATE` 循环。
|
|
81
|
-
|
|
82
|
-
## 11. 并发 / 锁 / 事务一致性(写入类程序重点)
|
|
83
|
-
- [ ] 跨会话/跨用户竞争场景用 `ENQUEUE`/`DEQUEUE`(或 `SELECT ... FOR UPDATE`)保护关键数据。
|
|
84
|
-
- [ ] 事务提交(`COMMIT WORK`)位置正确——不在循环内过早提交,失败可回滚。
|
|
85
|
-
- [ ] BAPI 调用后 `BAPI_TRANSACTION_COMMIT` / `ROLLBACK` 配对正确。
|
|
86
|
-
- [ ] 数据一致性:先查后写场景防并发覆盖(版本/时间戳/状态校验)。
|
|
87
|
-
- [ ] 长时间运行的批量程序避免单一大事务(分块提交,可重启续跑)。
|
|
88
|
-
|
|
89
|
-
## 12. 代码质量与可维护性
|
|
90
|
-
- [ ] 无死代码:未实例化类、未调用 FORM、`##NEEDED`/`##CALLED` 抑制项。
|
|
91
|
-
- [ ] 无未使用变量;`FORM` 内不重复定义 `TYPES`。
|
|
92
|
-
- [ ] 模块化:过长 `FORM` 拆分;新需求优先 OO 方法而非过程式堆叠。
|
|
93
|
-
- [ ] 消息统一用消息类,避免字面量。
|
|
94
|
-
- [ ] 常量抽取到 `INCLUDE` / 接口,避免魔法值散落。
|
|
95
|
-
|
|
96
|
-
## 13. 面向对象(类/接口审查)
|
|
97
|
-
- [ ] 类职责单一;方法短小(≤ 15 行);过长方法拆分。
|
|
98
|
-
- [ ] 构造注入依赖(`mo_`),避免方法内 `NEW` 硬编码(难测试)。
|
|
99
|
-
- [ ] 属性私有(`PRIVATE SECTION`),通过方法暴露行为;避免公开 `mv_`/`mt_`。
|
|
100
|
-
- [ ] 接口解耦:跨层调用走 `IF_*` 接口,非具体类。
|
|
101
|
-
- [ ] 异常用 `RAISE EXCEPTION`(`cx_static_check`)而非返回码/静默吞错。
|
|
102
|
-
- [ ] 单例仅当确有共享状态时使用(避免滥用隐藏全局)。
|
|
103
|
-
- [ ] 避免 getter/setter 过度封装(无行为的值容器);`READ-ONLY` 属性优于手工 getter。
|
|
104
|
-
- [ ] 测试友好:有 `FOR TESTING` 测试类覆盖关键逻辑。
|
|
105
|
-
|
|
106
|
-
## 14. 亮点记录
|
|
107
|
-
- [ ] 记录值得保留的设计:统一常量 INCLUDE、合理 ALV 交互、宿主变量防注入、公共能力复用等。
|
|
108
|
-
|
|
109
|
-
## 严重度定义
|
|
110
|
-
| 级别 | 含义 | 处理 |
|
|
111
|
-
|------|------|------|
|
|
112
|
-
| 高 / 高需核实 | 导致功能完全失效、数据丢失或致命误判 | 投产前必须处理(P0) |
|
|
113
|
-
| 中 | 健壮性 / 安全 / 可维护性缺口 | 尽快(P1) |
|
|
114
|
-
| 低 | 整洁度、规范、非缺陷改进 | 择机(P2) |
|
|
1
|
+
# ABAP 代码审查通用清单
|
|
2
|
+
|
|
3
|
+
每次审查按以下维度逐条核对,记录:编号、严重度、位置(FORM/方法/区域)、现象、建议修复。
|
|
4
|
+
适用对象:所有 ABAP 程序(报表、INCLUDE、函数模块、类),尤其含外部接口(HTTP/CRM)调用、可编辑 ALV 回写、JSON 序列化场景的程序。
|
|
5
|
+
本清单为通用基线,不绑定某次具体审查结果;针对特定程序可临时增删条目。
|
|
6
|
+
|
|
7
|
+
## 1. 文档与规范
|
|
8
|
+
- [ ] 程序头(名称 / 创建者 / 申请者 / 概要)与变更记录是否填写完整。
|
|
9
|
+
- [ ] `MESSAGE-ID` 声明后是否在代码中使用消息类,而非硬编码字面量;同一消息是否重复多处以致难以维护。
|
|
10
|
+
- [ ] 命名规范:Z/Y 前缀、变量/类型/常量命名是否清晰自解释(匈牙利前缀:lv_/ls_/lt_/iv_/ev_ 等)。
|
|
11
|
+
- [ ] **结构/表字段类型:自建结构、DDIC 表/结构字段使用裸内置类型时,可提示是否有更合适的 DDIC 数据元素;裸类型本身不算阻断问题。**
|
|
12
|
+
有业务语义或复用约束时可优先使用 DDIC 数据元素/结构;无合适标准元素时可评估是否创建 Z 数据元素 + 域。
|
|
13
|
+
- [ ] **硬编码中文:是否存在代码内硬编码的用户可见文案(提示/错误/列标题/消息)?**
|
|
14
|
+
必须走消息类(MESSAGE e001(zxxx))或文本元素(TEXT-xxx)。
|
|
15
|
+
- [ ] 注释是否说明「为什么」(业务意图),而非复述「做了什么」。
|
|
16
|
+
|
|
17
|
+
## 2. 语法与版本兼容
|
|
18
|
+
- [ ] 内联声明 `DATA(...)` / `FINAL(...)` 是否被目标系统版本支持(7.40 SP08+;`FINAL` 需 7.50+)。
|
|
19
|
+
- [ ] 表表达式 `itab[...]`、构造运算符 `VALUE`/`NEW`/`CONV`/`COND`/`SWITCH`/`REDUCE`/`FILTER` 使用是否兼容目标版本。
|
|
20
|
+
- [ ] ABAP SQL 宿主变量 `@`、逗号分隔列表、SELECT 内 SQL 表达式需 7.40 SP05+。
|
|
21
|
+
- [ ] 避免使用已废弃写法:`TABLES` 语句、`MOVE...TO`、动态 `PERFORM`、云环境禁用的 `WRITE`/`DESCRIBE TABLE`/`sy-datum` 直接引用。
|
|
22
|
+
- [ ] 云/ steer 环境优先 released API(如 `xco_cp`),避免未发布对象。
|
|
23
|
+
|
|
24
|
+
## 3. ABAP SQL(开放性 SQL)
|
|
25
|
+
- [ ] 一律使用宿主变量 `@`,杜绝字符串拼接 SQL(防注入)。
|
|
26
|
+
- [ ] 避免在循环内 `SELECT`(应改用 `FOR ALL ENTRIES` / `JOIN` / 临时内表)。
|
|
27
|
+
- [ ] `FOR ALL ENTRIES` 前检查驱动内表非空,避免退化为全表扫描。
|
|
28
|
+
- [ ] 大结果集使用 `PACKAGE SIZE` / `UP TO n ROWS` 限流。
|
|
29
|
+
- [ ] `JOIN` 类型(INNER/LEFT/RIGHT)与 `ON` 条件完整正确。
|
|
30
|
+
- [ ] 聚合、`GROUP BY`、`HAVING` 逻辑正确;避免 `SELECT *`,只取所需字段。
|
|
31
|
+
|
|
32
|
+
## 4. 内表与数据结构
|
|
33
|
+
- [ ] 高频键值访问优先 `SORTED` / `HASHED` 表或辅助键。
|
|
34
|
+
- [ ] 循环内修改优先 `FIELD-SYMBOL` 而非工作区拷贝(性能与一致性)。
|
|
35
|
+
- [ ] 判存在用 `line_exists()` / `line_index()` 替代仅判 `READ TABLE` 的 `sy-subrc`。
|
|
36
|
+
- [ ] `MOVE-CORRESPONDING` 字段对齐正确;通用场景显式赋值更清晰更快。
|
|
37
|
+
- [ ] 表对表 `MOVE-CORRESPONDING` 要求行类型一致。
|
|
38
|
+
|
|
39
|
+
## 5. 外部接口 / HTTP / JSON(对接类程序重点)
|
|
40
|
+
- [ ] 反序列化前校验返回数据非空/格式;解析失败有 `TRY/CATCH` 兜底,避免 `CX_SY_*` 短 dump。
|
|
41
|
+
- [ ] URL 查询参数做 URL 编码(`CL_HTTP_UTILITY=>ESCAPE_URL`),防请求被破坏或参数注入。
|
|
42
|
+
- [ ] HTTP 状态码 / 通信异常有处理,且失败提示明确、非空白。
|
|
43
|
+
- [ ] 序列化 `PRETTY_NAME`(驼峰 / 下划线 / 用户格式)与对端约定一致。
|
|
44
|
+
- [ ] 视场景评估超时、重试、熔断等健壮性。
|
|
45
|
+
|
|
46
|
+
## 6. 数据处理与展平
|
|
47
|
+
- [ ] 嵌套 `LOOP` 中修改内表应使用 `MODIFY ... INDEX` / `TRANSPORTING`。
|
|
48
|
+
- [ ] 数值计算防除零(`CX_SY_ZERODIVIDE`)。
|
|
49
|
+
- [ ] 字符串转数字前校验格式(`CX_SY_CONVERSION_NO_NUMBER`)。
|
|
50
|
+
- [ ] 子串 / 偏移访问前校验长度(`CX_SY_RANGE_OUT_OF_BOUNDS`)。
|
|
51
|
+
|
|
52
|
+
## 7. 错误处理与异常
|
|
53
|
+
- [ ] 关键操作包 `TRY/CATCH`,捕获 `cx_root` 兜底,避免裸奔。
|
|
54
|
+
- [ ] 动态 `ASSIGN (lv_name)` 字段名非法会短 dump,需 `TRY/CATCH` 或先校验字段名合法性。
|
|
55
|
+
- [ ] 解引用引用变量 / 对象前做 `IS BOUND` 检查。
|
|
56
|
+
- [ ] 业务校验失败给出明确消息,不静默吞掉错误。
|
|
57
|
+
|
|
58
|
+
## 8. ALV 与用户交互
|
|
59
|
+
- [ ] 可编辑 ALV 单元格回写优先 `MODIFY ... TRANSPORTING (fieldname)`,避免脆弱的动态 `ASSIGN`。
|
|
60
|
+
- [ ] 事件类(如 `DATA_CHANGED`)必须实例化并 `SET HANDLER`,否则为死代码(常带 `##NEEDED` 抑制)。
|
|
61
|
+
- [ ] 下拉、复选框、选择框的字段名与内表结构一致。
|
|
62
|
+
- [ ] 刷新使用 `IS_STABLE` 避免光标跳变。
|
|
63
|
+
- [ ] 用户命令(`USER_COMMAND`)对未选行给出提示而非 dump。
|
|
64
|
+
|
|
65
|
+
## 9. 授权与安全
|
|
66
|
+
- [ ] 敏感操作 / 数据读写字前 `AUTHORITY-CHECK`(事务码、业务对象权限)。
|
|
67
|
+
- [ ] SQL 注入:一律宿主变量,禁止拼接。
|
|
68
|
+
- [ ] 凭据(token / secret / key / 账号)不在配置表明文存储;评估加密与权限收敛。
|
|
69
|
+
- [ ] 对外回写 / 发送前确认权限与可追溯性。
|
|
70
|
+
|
|
71
|
+
## 10. 性能
|
|
72
|
+
- [ ] 避免循环内数据库访问。
|
|
73
|
+
- [ ] 内表访问选对表类型(SORTED / HASHED)。
|
|
74
|
+
- [ ] `SORT` 后 `READ TABLE` 用 `BINARY SEARCH`(否则线性扫描)。
|
|
75
|
+
- [ ] 嵌套 `LOOP` 用辅助表/`SORTED` 表消除 N×M 扫描;可用 `GROUP BY` / `REDUCE` 替代手工累加。
|
|
76
|
+
- [ ] `DELETE ADJACENT DUPLICATES` 前确认已按去重键排序(否则结果不确定)。
|
|
77
|
+
- [ ] 大批量 `MODIFY` / `INSERT` 用内表整批而非单条。
|
|
78
|
+
- [ ] 避免重复 `SORT` / 重复查询。
|
|
79
|
+
- [ ] 大结果集用 `PACKAGE SIZE` 流式处理。
|
|
80
|
+
- [ ] 字符串拼接用 `&&` / 字符串模板,避免 `CONCATENATE` 循环。
|
|
81
|
+
|
|
82
|
+
## 11. 并发 / 锁 / 事务一致性(写入类程序重点)
|
|
83
|
+
- [ ] 跨会话/跨用户竞争场景用 `ENQUEUE`/`DEQUEUE`(或 `SELECT ... FOR UPDATE`)保护关键数据。
|
|
84
|
+
- [ ] 事务提交(`COMMIT WORK`)位置正确——不在循环内过早提交,失败可回滚。
|
|
85
|
+
- [ ] BAPI 调用后 `BAPI_TRANSACTION_COMMIT` / `ROLLBACK` 配对正确。
|
|
86
|
+
- [ ] 数据一致性:先查后写场景防并发覆盖(版本/时间戳/状态校验)。
|
|
87
|
+
- [ ] 长时间运行的批量程序避免单一大事务(分块提交,可重启续跑)。
|
|
88
|
+
|
|
89
|
+
## 12. 代码质量与可维护性
|
|
90
|
+
- [ ] 无死代码:未实例化类、未调用 FORM、`##NEEDED`/`##CALLED` 抑制项。
|
|
91
|
+
- [ ] 无未使用变量;`FORM` 内不重复定义 `TYPES`。
|
|
92
|
+
- [ ] 模块化:过长 `FORM` 拆分;新需求优先 OO 方法而非过程式堆叠。
|
|
93
|
+
- [ ] 消息统一用消息类,避免字面量。
|
|
94
|
+
- [ ] 常量抽取到 `INCLUDE` / 接口,避免魔法值散落。
|
|
95
|
+
|
|
96
|
+
## 13. 面向对象(类/接口审查)
|
|
97
|
+
- [ ] 类职责单一;方法短小(≤ 15 行);过长方法拆分。
|
|
98
|
+
- [ ] 构造注入依赖(`mo_`),避免方法内 `NEW` 硬编码(难测试)。
|
|
99
|
+
- [ ] 属性私有(`PRIVATE SECTION`),通过方法暴露行为;避免公开 `mv_`/`mt_`。
|
|
100
|
+
- [ ] 接口解耦:跨层调用走 `IF_*` 接口,非具体类。
|
|
101
|
+
- [ ] 异常用 `RAISE EXCEPTION`(`cx_static_check`)而非返回码/静默吞错。
|
|
102
|
+
- [ ] 单例仅当确有共享状态时使用(避免滥用隐藏全局)。
|
|
103
|
+
- [ ] 避免 getter/setter 过度封装(无行为的值容器);`READ-ONLY` 属性优于手工 getter。
|
|
104
|
+
- [ ] 测试友好:有 `FOR TESTING` 测试类覆盖关键逻辑。
|
|
105
|
+
|
|
106
|
+
## 14. 亮点记录
|
|
107
|
+
- [ ] 记录值得保留的设计:统一常量 INCLUDE、合理 ALV 交互、宿主变量防注入、公共能力复用等。
|
|
108
|
+
|
|
109
|
+
## 严重度定义
|
|
110
|
+
| 级别 | 含义 | 处理 |
|
|
111
|
+
|------|------|------|
|
|
112
|
+
| 高 / 高需核实 | 导致功能完全失效、数据丢失或致命误判 | 投产前必须处理(P0) |
|
|
113
|
+
| 中 | 健壮性 / 安全 / 可维护性缺口 | 尽快(P1) |
|
|
114
|
+
| 低 | 整洁度、规范、非缺陷改进 | 择机(P2) |
|