clean-abaplisted
Install: claude install-skill williamcorrea23/sap-router-skill
# Clean ABAP Style Guide
Clean ABAP patterns derived from SAP Clean ABAP Style Guide (CC BY 4.0).
## Naming Conventions
| Rule | Good | Bad |
|---|---|---|
| Variables descriptive | `lv_material_description` | `lv_md` |
| Classes prefixed ZCL_ | `zcl_material_handler` | `material_class` |
| Methods verb-first | `create_material()` | `material_create()` |
| Booleans with is/has | `is_active`, `has_errors` | `active_flag` |
| Constants UPPER case | `gc_max_retries` | `max_retries` |
## Formatting
```abap
" Good
METHOD create_material.
DATA(ls_header) = prepare_header( iv_payload ).
DATA(ls_return) = call_bapi( ls_header ).
check_result( ls_return ).
ENDMETHOD.
" Bad
METHOD create_material.
data(ls_header)=prepare_header(iv_payload).
data(ls_return)=call_bapi(ls_header).
check_result(ls_return).
ENDMETHOD.
```
## Method Rules
- Max 50 lines per method (not counting declarations block)
- Single responsibility — one method, one purpose
- Extract conditions into self-documenting methods:
```abap
" Good
IF is_material_locked( lv_matnr ).
RETURN.
ENDIF.
" Bad
IF lt_lock[] IS NOT INITIAL AND lv_matnr IN lt_lock.
RETURN.
ENDIF.
```
## Error Handling
```abap
" Prefer class-based exceptions
TRY.
DATA(lo_handler) = get_handler( iv_module ).
lo_handler->handle_action( iv_action = iv_action iv_payload = iv_payload ).
CATCH cx_zrouter INTO DATA(lx).
mo_logger->log_action( iv_status = 'ERROR' iv_message = lx->mv_text ).
ENDTRY.
" Not:
"