Nesneye yönelik programlama (OOP) ile oluşturulan sınıflar içerisinde ki bazı özelliklere erişimin engellenmesini sağlayan veya bir kısmına erişim izni verilmesine imkan sunan bir yapıdır Encapsulation. Geliştirilen programlarda oluşturulan sınıflarda oluşabilecek değişikliklerin bir çok alanda değişikliğe sebebiyet vermemesi içinde bir önlem olarak kullanılmaktadır.
Örneğin, yazılım geliştirme sürecinde kullanılan bir kütüphaneniz mevcut. Bu kütüphane içerisinde ki tüm yapılar eğer açık olsa ve bu kütüpaneyi kullanan herkes istediği değişikliği yapabilecek olsaydı, herkesin kendi yazılım geliştirme süreçlerini bu değişkliklere göre yeniden dizayn etmesi gerekirdi. Kapsülleme kullanılarak, kütüphane içerisinde hangi değişiklik olursa olsun, sonuç yine o kütüphaneyi kullanan kişilerin değişiklik yapmasına sebebiyet vermemesini sağlayabiliriz.
Encapsulation için aşağıda yer alan örneği inceleyerek daha detaylı bilgi edinebilirsiniz.
Senaryomuz şu; SAP içerisinde oluşturduğumuz ZDEMO_TABLE isminde bir tablomuz var. Bu tablo içerisinde MATNR,WERKS,COST alanları mevcut. İstediğimiz ise, bu tablo içerisinde ki tüm alanları çekerek, eğer WERKS değeri 1000 ise COST değerinin 6 ile çarpılması, WERKS 1000’e eşit değilse COST değerinin tablodaki değerinin olduğu gibi kalması ile oluşan sonuç tablosunun ekrana bastırılması.
İlk olarak, ZCL_ENCAPSULATION_DEMO isminde Class oluşturuyoruz. Class içerisinde 3 tane metodumuz olacak.
- Constructor : Bu metod aslında bizim tablomuzun header’ını oluşturduğumuz metod.
- Get_Material_Info : Malzeme listesinin ZDEMO_TABLE tablosundan çekilmesini sağlayacağız.
- Get_Material_Final_List : Elimizde ki Malzeme tablosu içerisinde istediğimiz işlemi yaparak sonuç tablosunun Return Value olarak döndürülmesini sağlayacağız.
- Malzeme Listesinin oluşacağı tablonun header alanı için dışarıdan erişim vermemek amacıyla PRIVATE section içerisinde tanımlıyoruz.
CLASS ZCL_ENCAPSULATION_DEMO DEFINITION PUBLIC CREATE PUBLIC . PUBLIC SECTION. METHODS CONSTRUCTOR IMPORTING VALUE(IS_MATERIAL_HEADER) TYPE ZDEMO_TABLE. METHODS GET_MATERIAL_INFO EXPORTING VALUE(ET_MATERIAL_LIST) TYPE ZDEMO_TY_TABLE. METHODS GET_MATERIAL_FINAL_LIST RETURNING VALUE(MATERIAL_NEW_INFO) TYPE ZDEMO_TY_TABLE. PROTECTED SECTION. PRIVATE SECTION. DATA : GS_MATERIAL_CONS TYPE LINE OF ZDEMO_TY_TABLE. ENDCLASS.
Class’a ait instance alındığı zaman header alanımızın ekrana bastıracağımız tablo tipine ait olduğunu belirlemek için kullanacağız. Yani bu class’ı kullanacağımız zaman ZDEMO_TABLE tipinde bir yapıya sahip olan tablo döndürüleceğini belirleyeceğiz.
CLASS ZCL_ENCAPSULATION_DEMO IMPLEMENTATION. * <SIGNATURE>---------------------------------------------------------------------------------------+ * | Instance Public Method ZCL_ENCAPSULATION_DEMO->CONSTRUCTOR * +-------------------------------------------------------------------------------------------------+ * | [--->] IS_MATERIAL_HEADER TYPE TY_DEMO_TABLE * +--------------------------------------------------------------------------------------</SIGNATURE> METHOD CONSTRUCTOR. ME->GS_MATERIAL_CONS = IS_MATERIAL_HEADER. ENDMETHOD. * <SIGNATURE>---------------------------------------------------------------------------------------+ * | Instance Public Method ZCL_ENCAPSULATION_DEMO->GET_MATERIAL_FINAL_LIST * +-------------------------------------------------------------------------------------------------+ * | [<-()] MATERIAL_NEW_INFO TYPE ZDEMO_TY_TABLE * +--------------------------------------------------------------------------------------</SIGNATURE> METHOD GET_MATERIAL_FINAL_LIST. DATA : LT_DEMO_TABLE TYPE ZDEMO_TY_TABLE. GET_MATERIAL_INFO( IMPORTING ET_MATERIAL_LIST = LT_DEMO_TABLE ). FIELD-SYMBOLS : <WA_MLZM> TYPE ZDEMO_TABLE. DATA : LS_MLZM TYPE LINE OF ZDEMO_TY_TABLE. LOOP AT LT_DEMO_TABLE ASSIGNING <WA_MLZM>. IF <WA_MLZM>-WERKS EQ '1000'. <WA_MLZM>-COST = <WA_MLZM>-COST * 6. APPEND <WA_MLZM> TO MATERIAL_NEW_INFO. ELSE. APPEND <WA_MLZM> TO MATERIAL_NEW_INFO. ENDIF. ENDLOOP. ENDMETHOD. * <SIGNATURE>---------------------------------------------------------------------------------------+ * | Instance Public Method ZCL_ENCAPSULATION_DEMO->GET_MATERIAL_INFO * +-------------------------------------------------------------------------------------------------+ * | [<---] ET_MATERIAL_LIST TYPE ZDEMO_TY_TABLE * +--------------------------------------------------------------------------------------</SIGNATURE> METHOD GET_MATERIAL_INFO. SELECT * INTO CORRESPONDING FIELDS OF TABLE ET_MATERIAL_LIST FROM ZDEMO_TABLE. ENDMETHOD. ENDCLASS.
Tüm metodlarımızı oluşturduk, Malzemeleri Get_Material_Info ile çektik, Programımızdan oluşturacağımız instance ile Constructure’ı belirledik ve bu Constructure ile oluşturacağımız tablomuzdaki değişiklikleri yapan metodumuz Get_Material_Final_List ile istediğimiz sonuç tablosunu döndürüyoruz.
Bu sınıfı bir program içerisinde nasıl kullanacağımız aşağıda ki şekildedir.
Program içerisinde, oluşturduğumuz class’a ait bir instance yaratıyoruz ve bu instance’ın exporting değerine Tablo yapımızı veriyoruz.
Dağa sonrasında sınıf’ın bize sunduğu ancak bizim hiç bir şekilde diğer metodlarına veya içeriğine erişemediğimiz, ancak constructure’ımızı kullanarak içeriği düzenlenmiş tabloyu sunan metodu çağırıyoruz. Bu kadar kısa bir işlem ile Kapsüllediğimiz sınıfı her programda çağırabiliriz. Şöyle ki döndürdüğü tablo tipi değişmediği sürece ! tabloya alan eklemek veya dönen verileri farklılaştırmak bu programda herhangi bir değişikliği gerektirmeyecektir. Programı yazdığınızda göreceğiniz üzere hiç bir şekilde direkt olarak class içerisinde yer alan GET_MATERIAL_INFO metoduna erişim sağlayamayacaksınız.
REPORT ZDEMO_P_ENCAPSULATION. START-OF-SELECTION. DATA : GO_MALZEMELER TYPE REF TO ZCL_ENCAPSULATION_DEMO. DATA : GS_DEMO_MALZEME TYPE ZDEMO_TABLE. CREATE OBJECT GO_MALZEMELER EXPORTING IS_MATERIAL_HEADER = GS_DEMO_MALZEME. DATA(LT_MATERIAL_INFO_LIST) = GO_MALZEMELER->GET_MATERIAL_FINAL_LIST( ).
Sonuç LT_MATERIAL_LIST internal tablosunu ALV gride bastırdığınız zaman programın çıktısı aşağıda ki gibidir.