SAP, 2019 yılında GitHub'da Clean ABAP Style Guide'ı yayımladığında, ABAP dünyasında köklü bir zihniyet değişikliğinin sinyalini verdi. "Çalışıyorsa dokunma" anlayışından; okunabilir, test edilebilir ve yükseltme dostu kod yazmaya geçiş — S/4HANA çağında artık tercih değil, zorunluluk haline geliyor.
Neden Şimdi?
S/4HANA geçiş projelerinde önümüze düşen en büyük engellerden biri custom code temizliği. SAP'ın Custom Code Migration aracı, tipik büyüklükte bir ECC sisteminde binlerce uyumsuz nesne raporluyor. Bunların büyük çoğunluğu; deprecated API kullanımları, açıkça yasaklanan SELECT *, SAP iç namespace'lerine doğrudan erişimler.
Clean ABAP bu sorunun yalnızca reaktif (geçiş sırasında) değil, proaktif (geliştirme sırasında) çözümüdür. Kod yazılırken kaliteyi içselleştirirsek, yıllar sonra çıkan fatura çok daha düşük olur.
"Kodu sonradan okuyan genellikle başkası değil, altı ay sonraki kendinizdir." — Clean ABAP Style Guide
Temel Prensipler
1. Anlamlı İsimler
Değişken, metod ve sınıf isimleri kodun amacını anlatmalı. Hungarian notation (lv_, ls_, lt_) tek başına yeterli değil — değişken adı ne tuttuğunu açıklamalı, sadece tipi değil.
" ❌ Kötü: tip öneki var ama anlam yok
DATA lv_x TYPE i.
DATA lt_tab TYPE STANDARD TABLE OF mara.
LOOP AT lt_tab INTO ls_mat.
" ✅ İyi: ne olduğu net
DATA order_count TYPE i.
DATA materials TYPE STANDARD TABLE OF mara WITH EMPTY KEY.
LOOP AT materials INTO DATA(material).
SAP'ın önerisi: Hungarian notation zorunlu değil. Değişken adı tipi değil, içeriği anlatmalı. lv_flag yerine is_order_complete, lt_result yerine matching_partners.
2. Küçük, Odaklı Metodlar
Bir metodun uzunluğu, satır sayısıyla değil yaptığı işin kapsamıyla ölçülür. Tek sorumluluk ilkesi burada belirleyici: bir metod tek bir şeyi yapmalı ve onu iyi yapmalı.
" ❌ Kötü: her şeyi yapan tanrı metodu (300 satır)
METHOD process_invoice.
" Validation (50 satır)
" Tax calculation (60 satır)
" DB update (80 satır)
" Email trigger (40 satır)
" Posting (70 satır)
ENDMETHOD.
" ✅ İyi: ayrıştırılmış sorumluluklar
METHOD process_invoice.
validate_invoice_data( invoice ).
calculate_tax_amounts( CHANGING invoice = invoice ).
persist_invoice( invoice ).
post_to_accounting( invoice ).
notify_approver( invoice ).
ENDMETHOD.
3. Guard Clause (Erken Çıkış)
İç içe IF blokları (piramit kodu) okunmayı zorlaştırır. Ön koşullar sağlanmadığında erken return: hem kodu düzleştirir hem de asıl iş mantığını vurgular.
" ❌ Kötü: üç katlı IF piramidi
METHOD get_customer_discount.
IF customer IS NOT INITIAL.
IF customer-segment = 'PREMIUM'.
IF customer-years_active > 3.
rv_discount = '0.15'.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.
" ✅ İyi: Guard clause
METHOD get_customer_discount.
IF customer IS INITIAL. RETURN. ENDIF.
IF customer-segment <> 'PREMIUM'. RETURN. ENDIF.
IF customer-years_active <= 3. RETURN. ENDIF.
rv_discount = '0.15'.
ENDMETHOD.
4. SELECT Alanları ve HANA Uyumu
SELECT *, SAP'ın clean core kurallarında da yasaklıdır ve HANA performansı açısından ciddi sorun yaratır. HANA'nın column store mimarisinde sadece ihtiyaç duyulan sütunları okumak, hem bellek hem I/O açısından dramatik fark yaratır.
" ❌ Kötü: tüm alanları çek
SELECT * FROM vbak INTO TABLE @DATA(orders)
WHERE erdat >= @lv_start_date.
" ✅ İyi: sadece ihtiyaç duyulan alanlar
SELECT vbeln, erdat, kunnr, netwr, waerk
FROM vbak
INTO TABLE @DATA(orders)
WHERE erdat >= @lv_start_date.
5. Modern ABAP Söz Dizimi
" ❌ Eski stil — CREATE OBJECT, MOVE, LOOP AT ... INTO
CREATE OBJECT lo_handler TYPE lcl_order_handler.
MOVE lv_old TO lv_new.
" ✅ Modern ABAP — inline declaration, constructor expression
DATA(lo_handler) = NEW lcl_order_handler( ).
DATA(lv_new) = lv_old.
" ✅ Koşullu atama yerine COND
DATA(message) =
COND string(
WHEN order-status = 'C' THEN 'Tamamlandı'
WHEN order-status = 'X' THEN 'İptal Edildi'
ELSE 'İşlemde' ).
Test Edilebilirlik
Clean ABAP'ın belki de en kritik boyutu budur. Bağımlılıkları inject edilemeyen, statik çağrılarla dolu bir sınıfa unit test yazmak mümkün değildir. Sorun genellikle şu kalıpta başlar:
" ❌ Test edilemez: veritabanına doğrudan bağımlı
METHOD get_open_orders.
SELECT vbeln, erdat, kunnr
FROM vbak INTO TABLE @rt_orders
WHERE gbstk <> 'C'.
ENDMETHOD.
Bu metodu test etmek için gerçek bir SAP sistemi ve veri gerekir. Oysa repository pattern ile:
" ✅ Test edilebilir: bağımlılık inject ediliyor
CLASS lcl_order_service DEFINITION.
PUBLIC SECTION.
METHODS constructor
IMPORTING io_repo TYPE REF TO lif_order_repository.
METHODS get_open_orders
RETURNING VALUE(rt_orders) TYPE tt_orders.
PRIVATE SECTION.
DATA mo_repo TYPE REF TO lif_order_repository.
ENDCLASS.
METHOD get_open_orders.
rt_orders = mo_repo->get_by_status( 'OPEN' ).
ENDMETHOD.
Test sınıfında mo_repo için test double (mock) oluşturulur:
CLASS ltcl_order_service DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
PRIVATE SECTION.
DATA cut TYPE REF TO lcl_order_service. " cut = class under test
DATA mo_repo_mock TYPE REF TO ltcl_order_repo_mock.
METHODS setup.
METHODS test_returns_only_open_orders FOR TESTING.
ENDCLASS.
METHOD setup.
mo_repo_mock = NEW #( ).
cut = NEW lcl_order_service( io_repo = mo_repo_mock ).
ENDMETHOD.
METHOD test_returns_only_open_orders.
" Arrange: mock iki açık sipariş döndürüyor
mo_repo_mock->set_test_data( open_order_fixtures ).
" Act
DATA(result) = cut->get_open_orders( ).
" Assert
cl_abap_unit_assert=>assert_equals(
act = lines( result ) exp = 2 ).
ENDMETHOD.
Araçlar ve Kalite Geçitleri
ABAP Test Cockpit (ATC)
SAP'ın built-in statik analiz aracı. SCI transaction'ından custom variant oluşturarak Clean ABAP kurallarını projeye özgü hale getirebilirsiniz. SAP ADT (Eclipse) üzerinden CI/CD pipeline'a entegre etmek de mümkün — her commit öncesi ATC taraması koşulabilir.
abapOpenChecks
Community tarafından geliştirilen, 200'den fazla ATC kuralı içeren açık kaynaklı proje. GitHub üzerinden abapGit ile sisteme import edilip ATC variant'ınıza eklenir. Özellikle Clean ABAP kategorisi, SAP'ın stil rehberindeki kuralları doğrudan kontrol eder.
abaplint
Git-native ABAP linting aracı. Yerel geliştirme ortamında çalışır; GitHub Actions veya Azure DevOps ile CI/CD pipeline'a eklenebilir. SAP sistemine bağlantı gerektirmez — sadece kaynak kod dosyaları üzerinde çalışır.
Pratikte Geçiş Stratejisi
Eski bir ABAP code base'ini temizlemenin en pragmatik yolu Boy Scout Rule: "Bulduğundan daha temiz bırak." Her dokunuşta küçük iyileştirmeler yapılır; büyük rewrite değil, kademeli dönüşüm.
Öncelik sırası: (1) Yeni geliştirmeler → tamamen Clean ABAP uyumlu. (2) Aktif değiştirilen nesneler → değişiklik sırasında temizle. (3) Nadiren dokunulan nesneler → gerekmedikçe dokunma, teknik borç olarak kayıt al.
Clean ABAP bir mükemmelliyetçilik projesi değil, pragmatik bir mühendislik kararıdır. Amacı, kodu bakımını yapacak kişi için — genellikle altı ay sonraki kendiniz — daha az acı verici hale getirmek. S/4HANA geçişlerinde bu kararın maliyeti değil, getirisi konuşuluyor.