Genel

ABAP Clean Code: Okunabilir ve Sürdürülebilir SAP Kodu Yazmanın 10 Altın Kuralı

23 Mart 2026 · 10 dk okuma · aixsap
ABAP Clean Code: Okunabilir ve Sürdürülebilir SAP Kodu Yazmanın 10 Altın Kuralı

ABAP Clean Code: Okunabilir ve Sürdürülebilir SAP Kodu Yazmanın 10 Altın Kuralı

Yıllarca SAP projelerinde çalışırken fark ettiğim en büyük sorunlardan biri şu: Çoğu ABAP geliştiricisi *çalışan* kod yazar, ama *okunabilir* kod yazmayı ihmal eder. Kısa vadede bu fark göze çarpmaz. Ama 2 yıl sonra aynı koda döndüğünüzde—ya da daha kötüsü, başkasının o kodu devralması gerektiğinde—işte o zaman fatura ödenmeye başlar.

Bu makalede, ABAP geliştirmede **Clean Code** prensiplerini gerçek kod örnekleriyle ele alacağım. Robert C. Martin’in “Clean Code” kitabındaki evrensel prensipleri, SAP ve ABAP dünyasına nasıl adapte edebileceğinizi göreceğiz. Yalnızca teori değil—kopyalayıp yapıştırabileceğiniz, hemen işe yarayacak pratik rehberlik.

## Neden ABAP’ta Clean Code Bu Kadar Kritik?

SAP sistemleri genellikle onlarca yıl yaşar. Bir süreç geliştirmesi bugün yazdığınız kod, 2035’te hâlâ çalışıyor olabilir. Bu uzun yaşam döngüsü, ABAP’ta kod kalitesini başka herhangi bir platformdan daha kritik hale getirir.

Üstelik SAP ortamlarında teknik borç (technical debt) çok daha pahalıya patlar: Lisans maliyetleri yüksek, uzman kaynak bulmak zor, sistem bağımlılıkları karmaşık. Kirli bir ABAP kodu;

– **Bakım maliyetini** dramatik şekilde artırır
– **Hata riskini** yükseltir
– **Yeni geliştiricilerin** sisteme adapte olmasını zorlaştırır
– **Performans sorunlarının** tespitini geciktirir

Şimdi gelin, bu sorunları önleyen 10 altın kuralı inceleyelim.

## Kural 1: Anlamlı İsimlendirme — Kodu Kendisi Anlatsın

En sık gördüğüm ABAP anti-pattern: Anlamsız değişken isimleri.

İkinci versiyonu ilk kez okuyan biri bile ne yaptığını anlıyor. Açıklayıcı isimler yazmak birkaç saniye daha alıyor, ama her okumada onlarca saniye kazandırıyor.

**Pratik Kural:** Değişken adı bir yorum gerektiriyorsa, o ad yanlış seçilmiştir.

## Kural 2: Tek Sorumluluk Prensibi (SRP) — Metot Tek İş Yapsın

SAP projelerinde yüzlerce satırlık ABAP metodları görmek ne yazık ki çok yaygın. Bir metot hem veri okuyorsa, hem hesaplıyorsa, hem ekrana yazıyorsa—bu metodun üç farklı sorumluluğu var demektir.

**Kötü Örnek:**
abap
METHOD process_sales_order.
" Veri okuma
SELECT * FROM vbak INTO TABLE @DATA(lt_orders)
WHERE erdat = @sy-datum.

" Hesaplama
LOOP AT lt_orders INTO DATA(ls_order).
ls_order-netwr = ls_order-netwr * 1.18. " KDV ekle
MODIFY lt_orders FROM ls_order.
ENDLOOP.

" Ekrana yazdırma
LOOP AT lt_orders INTO DATA(ls_order).
WRITE: / ls_order-vbeln, ls_order-netwr.
ENDLOOP.
ENDMETHOD.

**İyi Örnek:**
abap
METHOD process_sales_order.
DATA(lt_orders) = read_todays_orders( ).
DATA(lt_with_vat) = apply_vat_to_orders( it_orders = lt_orders ).
display_orders( it_orders = lt_with_vat ).
ENDMETHOD.

METHOD read_todays_orders.
SELECT * FROM vbak
INTO TABLE @rt_orders
WHERE erdat = @sy-datum.
ENDMETHOD.

METHOD apply_vat_to_orders.
rt_orders = it_orders.
LOOP AT rt_orders ASSIGNING FIELD-SYMBOL().
-netwr = -netwr * 1.18.
ENDLOOP.
ENDMETHOD.

METHOD display_orders.
LOOP AT it_orders INTO DATA(ls_order).
WRITE: / ls_order-vbeln, ls_order-netwr.
ENDLOOP.
ENDMETHOD.

Her metodun tek bir görevi var. Test etmek, debug etmek ve bakımını yapmak çok daha kolay.

## Kural 3: Sihirli Sayılar ve Sabitlerden Kaçının

abap
” Kötü — 1.18 ne anlama geliyor?

ls_order-netwr = ls_order-netwr * 1.18.

” İyi — Anlam açık, değişim merkezi

CONSTANTS: gc_vat_rate TYPE decfloat16 VALUE '1.18'.
ls_order-netwr = ls_order-netwr * gc_vat_rate.

Vergi oranı değiştiğinde, 47 farklı yerde `1.18` aramanıza gerek kalmaz. Tek bir sabit değiştirirsiniz, her yer güncellenir.

## Kural 4: Modern ABAP Syntax Kullanın

SAP, ABAP’ı yıllar içinde büyük ölçüde modernize etti. Hâlâ eski syntax kullanan kod hem okunaksız hem de daha yavaş çalışabilir.

**Eski Stil:**
abap
DATA: ls_material TYPE mara.
DATA: lt_materials TYPE TABLE OF mara.

SELECT * FROM mara INTO TABLE lt_materials
WHERE mtart = 'FERT'.

READ TABLE lt_materials INTO ls_material
WITH KEY matnr = '1000001'.

IF sy-subrc = 0.
WRITE: ls_material-matnr.
ENDIF.

**Modern Stil (ABAP 7.4+):**
abap
SELECT * FROM mara
INTO TABLE @DATA(lt_materials)
WHERE mtart = 'FERT'.

DATA(ls_material) = lt_materials[ matnr = '1000001' ].

IF ls_material IS NOT INITIAL.
WRITE: ls_material-matnr.
ENDIF.

Modern syntax daha kısa, daha ekspresif ve genellikle daha performanslı. Eğer SAP NetWeaver 7.40 SP08 veya üzerindeyseniz, bu syntaxı kullanmak için bir neden yok.

**Not:** `lt_materials[ matnr = ‘1000001’ ]` tablosu boşsa veya kayıt yoksa `CX_SY_ITAB_LINE_NOT_FOUND` exception fırlatır. `VALUE #( OPTIONAL )` ile güvenli erişim sağlayabilirsiniz.

abap
” Güvenli alternatif

DATA(ls_material) = VALUE mara( lt_materials[ matnr = '1000001' ] OPTIONAL ).

## Kural 5: Exception Handling — Hataları Sessizce Yutmayın

abap
" Kötü — Hata yutulmuş, iz bırakmıyor
METHOD get_material.
TRY.
SELECT SINGLE * FROM mara
INTO @rs_material
WHERE matnr = @iv_matnr.
CATCH cx_root. " Hiçbir şey yapma
ENDTRY.
ENDMETHOD.

" İyi — Hata yönetilmiş, loglama yapılmış
METHOD get_material.
TRY.
SELECT SINGLE * FROM mara
INTO @rs_material
WHERE matnr = @iv_matnr.

IF sy-subrc <> 0.
RAISE EXCEPTION TYPE cx_material_not_found
EXPORTING
iv_matnr = iv_matnr.
ENDIF.

CATCH cx_sy_open_sql_error INTO DATA(lx_sql_error).
" Log ve anlamlı mesajla tekrar fırlat
log_error( ix_exception = lx_sql_error
iv_context = |Material read failed: { iv_matnr }| ).
RAISE EXCEPTION TYPE cx_material_read_error
EXPORTING
previous = lx_sql_error.
ENDTRY.
ENDMETHOD.

Bir exception’ı `CATCH cx_root` ile yakalayıp hiçbir şey yapmamak, production sistemlerinde saatlerce hata aramanıza neden olabilir. Her zaman hataları logla veya anlamlı bir şekilde yönet.

## Kural 6: SELECT * Kullanmayın

SAP veritabanı tablolarının onlarca hatta yüzlerce kolonu olabilir. `SELECT *` ile tüm kolonları çekmek, gereksiz network trafiği ve bellek tüketimi yaratır.

abap

" Kötü
SELECT * FROM vbak INTO TABLE @DATA(lt_orders)
WHERE erdat = @sy-datum.

" İyi — Sadece ihtiyaç duyulan kolonlar
SELECT vbeln, erdat, netwr, waerk
FROM vbak
INTO TABLE @DATA(lt_orders)
WHERE erdat = @sy-datum.

Büyük tablolarda bu tek değişiklik, sorgu süresini dramatik biçimde düşürebilir.

## Kural 7: FIELD-SYMBOL ile Performanslı Döngü

Büyük iç tablolarla çalışırken `INTO DATA(ls_line)` veri kopyası oluşturur. `ASSIGNING FIELD-SYMBOL` ise referans kullanır—hem daha hızlı hem de değişiklikleri doğrudan tabloya yansıtır.

abap
" Kötü — Her iterasyonda kopya oluşturulur
LOOP AT lt_materials INTO DATA(ls_material).
ls_material-matkl = 'NEW_CAT'.
MODIFY lt_materials FROM ls_material. " Ekstra MODIFY adımı
ENDLOOP.

" İyi — Referans, kopya yok, direkt değişiklik
LOOP AT lt_materials ASSIGNING FIELD-SYMBOL().
-matkl = 'NEW_CAT'. " MODIFY gerekmez
ENDLOOP.

Milyonlarca kayıt içeren tablolarda bu fark, dakikalar mertebesinde performans kazancı sağlayabilir.

## Kural 8: Yorumlar Kodu Değil, Niyeti Açıklar

Yanlış anlaşılan bir Clean Code prensibi: “Yorum yazmayın.” Aslında doğrusu şu: **Kodu açıklayan yorum yerine, kodu açık yaz. Niyeti açıklayan yorumu ise yaz.**

abap
” Kötü — Kodu anlatıyor, gereksiz
” Müşteri tablosundan kayıt çek
SELECT * FROM kna1 INTO TABLE @DATA(lt_customers).

” İyi — Niyeti ve iş kuralını açıklıyor
” SAP standart iade süreci: Müşteri bakiyesi negatifse
” otomatik alacak notu oluşturulur (SD-FI entegrasyon kuralı)
IF ls_customer-balance < 0. create_credit_memo( ls_customer ). ENDIF. —

Kural 9: Unit Test Yazın — ABAP Unit Framework Clean Code’un en çok ihmal edilen boyutu:

Test edilebilirlik. ABAP Unit Framework, SAP sistemlerine entegre bir test altyapısı sunar.

abap

CLASS lcl_vat_calculator_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. 

PRIVATE SECTION. 
METHODS: test_standard_vat_rate FOR TESTING,
test_zero_amount FOR TESTING.
ENDCLASS.

CLASS lcl_vat_calculator_test IMPLEMENTATION. METHOD test_standard_vat_rate. 

" Arrange 
DATA(lo_calc) = NEW lcl_vat_calculator( ). DATA(lv_net_amount) = CONV decfloat16( '100.00' ). " Act DATA(lv_gross) = lo_calc->calculate_gross(
iv_net_amount = lv_net_amount
iv_vat_rate = '18' ).

" Assert
cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat16( '118.00' )
act = lv_gross
msg = 'KDV hesaplaması hatalı' ).
ENDMETHOD.

METHOD test_zero_amount.
DATA(lo_calc) = NEW lcl_vat_calculator( ).

DATA(lv_gross) = lo_calc->calculate_gross(
iv_net_amount = '0'
iv_vat_rate = '18' ).

cl_abap_unit_assert=>assert_equals(
exp = CONV decfloat16( '0' )
act = lv_gross
msg = 'Sıfır tutar için KDV sıfır olmalı' ).
ENDMETHOD.

ENDCLASS.

Unit test yazmak başlangıçta yavaşlatır, ama her refactoring’de sizi korur. Hiçbir zaman pişman olmayacağınız bir yatırım.

## Kural 10: Kod Gözden Geçirme Kültürü Oluşturun

Teknik bir kural değil ama belki en önemlisi: **Code Review kültürü.**

Clean Code yalnızca bireysel bir pratik değil, takım pratiğidir. Ekibinizde şu alışkanlıkları geliştirin:

– Her değişiklik, en az bir kişi tarafından incelenmeli
– Code review yorumları yapıcı ve eğitici olmalı—eleştirici değil
– SAP’ta ABAP Git (abapGit) kullanarak versiyon kontrolü sağlanmalı
– Takım için ortak bir **ABAP Coding Guidelines** dokümanı oluşturulmalı

Bir mimarın en büyük etkisi, yazdığı koddan çok, etrafındaki geliştiricilere kattığı bakış açısıdır.

## Sonuç: Temiz Kod Bir Lüks Değil, Profesyonel Sorumluluktur

Bu 10 kuralı uygulamaya başladığınızda hemen mükemmel olmak zorunda değilsiniz. Küçük adımlarla başlayın:

1. **Bu hafta:** Yazdığınız tüm değişken isimlerini anlamlı yapın
2. **Bu ay:** Bir metodunuzu SRP’ye göre refactor edin
3. **Bu çeyrekte:** İlk ABAP Unit testinizi yazın

Clean Code bir hedef değil, süregelen bir pratiktir. Her gün biraz daha iyi kod yazmak, zamanla büyük fark yaratır.

Ve en önemlisi: Temiz kod yazan geliştirici sadece kendine değil, gelecekte o koda dokunan herkese saygı gösteriyor demektir. SAP projelerinin uzun ömrü düşünüldüğünde, bu saygı gerçek bir mühendislik değeridir.

## Sıkça Sorulan Sorular

**ABAP’ta Clean Code uygulamak performansı etkiler mi?**
Tersine, genellikle performansı iyileştirir. Field-symbol kullanımı, SELECT optimizasyonu gibi clean code pratikleri doğrudan performans kazancı sağlar.

**Eski ABAP kodunu temizlemek için nereden başlamalıyım?**
En çok dokunulan ve değişen modüllerden başlayın. Hiç değişmeyen eski kodu refactor etmek risk/fayda açısından düşük önceliklidir.

**abapGit olmadan clean code uygulanabilir mi?**
Evet, ancak abapGit versiyon kontrolü sayesinde code review ve refactoring çok daha güvenli hale gelir. Mümkünse ekibinize mutlaka dahil edin.

*Bu makale ABAP Clean Code serisinin ilk bölümüdür. Bir sonraki makalede ABAP Object-Oriented programlamada SOLID prensiplerine derinlemesine bakacağız.*

**Siz ABAP projelerinizde hangi clean code pratiklerini uyguluyorsunuz? Aşağıda yorumlarınızı paylaşın—deneyimlerinizi okumak çok değerli.**

← ABAP CDS Views ile Performanslı… ABAP OOP ile Tasarım Desenleri:… →

2 Yorum