Bugünkü konumuz ABAP-OO Encapsulation. Nesne yönelimli programlamanın ikinci temel konusudur. İlk temel konuyu ABAP-OO Inheritance şeklinde işlemiştik. Bu özellikler ve yaklaşımlar tek başlarına pek bir anlam ifade etmiyor olabilirler ancak hepsi bir araya geldiğinde sizlere bir mimari oluşturmak için çok güzel araçlar olacaklar. Eğer ki gerçek iş senaryolarıyla ilgili bağlantıyı kuramıyorsanız çekinmeden makalenin yorumlar bölümünde sormanızı öneririm çünkü bu tarz konularda teknik tarafı öğrenmek önemli olduğu kadar gerçek iş senaryolarıyla birleştirebilmeniz de önemli.

Amaç

Encapsulation, bir class içerisindeki belirlenen özelliklere erişimi kısıtlamaktır ancak veriye hiçbir şekilde erişlemeyeceğini düşünmeyin. Sadece tanımladığınız özelliğe birebir kendi adıyla erişim yapmanızı engelleyen bir konudur. Ancak bu veriyi dışarıya açmak istiyorsanız GET metoduyla bunu gerçekleştirebilirsiniz. Bu konu biraz teknik bir konudur. Şöyle bir örnek verelim; Herkesin bir televizyonu vardır ve televizyon kapalı bir kutudur. Siz sadece televizyonun ekranını görebilirsiniz, ekranda en son görüntü sizlere yayınlanır. Sizler hiçbir şekilde televizyonun içini açarak kabloları, çipleri veya televizyonun elektornik tasarımını incelemezsiniz. Sadece ihtiyacınız olan görüntüyü ekranda görmek istersiniz. Encapsulation da aynı bunun gibidir. Bir class’ın içerisinde bir sürü senaryo olabilir veya birden farklı tasarım içeren metodolojiler izlenmiş olabilir ancak sizler sadece dışarıda görünmesini istediğiniz özellikleri bu yöntem ile kısıtlayabilirsiniz. Aynı televizyon ekranının dışarıya verdiği görüntünün yanı sıra, içerisindeki kabloların veya elektronik tasarımın görünmemesi gibi.


ABAP Kodu

[ABAP]
************************************************************************
* ABAP Development
*
* Author      : Barış Arslan
* Description : Encapsulation
************************************************************************

” Satış siparişimiz için başlık bilgisilerinin
” tutacağımız tipi oluşturuyoruz.
TYPES : BEGIN OF gty_order_header
      ,
        id       TYPE numc5
      , customer TYPE char10
      , total    TYPE netwr
      , currency TYPE waers
      ,
        END OF gty_order_header
      .

CLASS lcl_sales_order DEFINITION.
  PUBLIC SECTION.
    METHODS : constructor      IMPORTING VALUE(is_order_header) TYPE gty_order_header
            , get_order_header RETURNING VALUE(rs_order_header) TYPE gty_order_header
            .

  PRIVATE SECTION.
    ” Bu özelliklere direkt dışardan erişim vermiyoruz.
    ” Encapsulation’ın mantığı bu noktada devreye giriyor,
    ” bu değişkenin dışardan erişimine izin vermiyoruz
    ” ancak bu değişkeni dışarıya RETURN eden bir
    ” GET metodu yazıyoruz.

    ” Şu anki örnekte bir kısıtlama yok ancak eğer isteseydik
    ” GET metodunun içerisinde bilgilerin bir bölümünü
    ” kısıtlayarak da dışarıya gönderebilirdik.
    DATA : s_order_header TYPE gty_order_header
         .
ENDCLASS.

CLASS lcl_sales_order IMPLEMENTATION.
  METHOD constructor.
    ” Instance alındığı sırada nesne için ilgili
    ” sipariş bilgilerini sınıfımızın içerisinde
    ” PRIVATE bölümde tanımladığımız sipariş başlık
    ” structure’ına alıyoruz.

    me->s_order_header = is_order_header.
  ENDMETHOD.

  METHOD get_order_header.
    ” Satış siparişi nesnesi yaratıldıktan sonra
    ” Constructor metodunda dolan sipariş bilgilerini
    ” bu metot aracılığıyla dışarıya gönderiyoruz.

    rs_order_header = s_order_header.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  ” Satış siparişi sınıfmıza ait iki farklı sipariş nesnesi oluşturacağız
  ” o yüzden iki farklı referans nesnesi tanımlıyoruz.
  DATA : go_sales_order_1 TYPE REF TO lcl_sales_order
       , go_sales_order_2 TYPE REF TO lcl_sales_order
       .

  ” Sipariş bilgilerini dolduracağımız ve nesneye göndereceğimiz
  ” bir sipariş başlık structure’ı oluşturuyoruz.
  ” İki farklı sipariş içinde bu structure’ı kullanacağız.
  DATA : gs_order_header TYPE gty_order_header
       .

  ” 1. sipariş için bilgileri dolduruyoruz
  gs_order_header-id       = ‘00001’.
  gs_order_header-customer = ‘Sütaş’.
  gs_order_header-total    = ‘1000’.
  gs_order_header-currency = ‘USD’.

  ” 1. siparişimizin nesnesini yaratıyoruz. (Instance alıyoruz)
  CREATE OBJECT go_sales_order_1
    EXPORTING
      is_order_header = gs_order_header.

  ” 2. sipariş için bilgileri dolduruyoruz
  CLEAR gs_order_header.
  gs_order_header-id       = ‘00002’.
  gs_order_header-customer = ‘Pepsi’.
  gs_order_header-total    = ‘5000’.
  gs_order_header-currency = ‘EUR’.

  ” 2. siparişimizin nesnesini yaratıyoruz. (Instance alıyoruz)
  CREATE OBJECT go_sales_order_2
    EXPORTING
      is_order_header = gs_order_header.

  ” 1. siparişin başlık bilgisini alıyoruz
  DATA(gs_order_1) = go_sales_order_1->get_order_header( ).

  ” 2. siparişin başlık bilgisini alıyoruz
  DATA(gs_order_2) = go_sales_order_2->get_order_header( ).

  ” 1. siparişin başlık bilgilerini yazdırıyoruz
  WRITE : gs_order_1-id
        , gs_order_1-customer
        , gs_order_1-total
        , gs_order_1-currency
        .

  ” 2. siparişin başlık bilgilerini yazdırıyoruz
  WRITE : / gs_order_2-id
        , gs_order_2-customer
        , gs_order_2-total
        , gs_order_2-currency
        .
[/ABAP]


Programın Çıktısı

ABAP-OO Encapsulation
ABAP-OO Encapsulation