Bölüm 11 Soyut Veri Tipleri ve Kılıflama (sarmalama) Kavramı Abstract Data Types and Encapsulation Concepts
Soyutlama Kavramı Veri soyutlamasına giriş Bölüm 12 Başlıklarş Soyut Veri Tiplerinin (SVT) (Abstract Data Types) tasarım unsurları Dil örnekleri Parametrize (jenerik) edilmiş i SVT Kılıflama/sarmalama yapıları (encapsulation constructs) Veri bölütlerini i adres, hata düzeltimi, i alındı gibi kontrol bilgileri i ile donatmak Nesneye yönelik programlamada, programcının bilmesi gerekmeyen bir sınıfın özelliklerini ayrı bir dosyaya koyma. Kılıflamayı isimlendirme (Naming Encapsulations ) Tuğrul Yılmaz - Pamukkale Üniversitesi 2
Soyutlama Kavramı Soyutlama, bir şeyin en önemli özellikleri ile görülmesi ve temsil edilmesidir. Programlama ve bilgisayar bilimlerinde soyutlama kavramı önemlidir. Hemen hemen bütün programlama dilleri görev soyutlamasına alt programlar vasıtası ile destek verirler. 1980 sonrası hemen hemen bütün programlama dilleri veri soyutlamasını desteklerler. Tuğrul Yılmaz - Pamukkale Üniversitesi 3
Veri soyutlamasına giriş ş Soyut veri tipi kullanıcı tanımlı veri tipidir aşağıdaki iki özelliğe sahiptir: 1. Söz konusu tip ile elemanlarının gösterimi (betimlemesi) ve üzerlerinde yapılabilecek işlemler tek bir sözdizimsel birim ile tanımlanır. Avantaj: Program organizasyonu, değiştirilebilme il (veri yapısı ile ilgili ili herşey birlikte), parçaların ayrı derlenmesi 2. Bu elemanların gösterimi kullanacak program birimlerinden saklıdır. Bu nedenle bunlara sadece tip tanımlarında verilen işlemler yapılabilir. Avantaj: Güvenilirlik veri gösterimlerinin saklı olması kullanıcı kodunun doğrudan ğ veri elemanlarına erişimini ş engellediği ğ gibi gösterimine bağlı ğ olmamasını da sağlar. Kullanıcı kodu değiştirilmeden veri gösterimi değiştirilebilir. Tuğrul Yılmaz - Pamukkale Üniversitesi 4
Ön tanımlı tipler SVTdir Örneğin Java int tipii Veri soyutlamasına giriş ş Gösterimi saklıdır (iç yapısını bilmenize gerek yoktur) Yapılabilecek işlemler ön tanımlıdır Kullanıcı programları int tipinde değişkenler tanımlayabilirler Kullanıcı tanımlı soyut veri tiplerinin ön tanımlı SVT ile aynı özelliklere sahip olmaları gerekir. Tuğrul Yılmaz - Pamukkale Üniversitesi 5
Tasarım Unsurları SVT destekleyebilmek k için i bir dilde olması gerekli özellikler: 1. Tip tanımını saracak sözdizimsel birim. 2. Tip adlarını ve alt program başlıklarını kullanıcılara açacak, buna karşılık tanımları ve gösterimleri saklayacak yöntem. 3. Bazı temel işlemlerin dilde ön tanımlı olması gerekir (genellikle atama, karşılaştırma) Bazı işlemlere genel olarak gerek duyulur ancak tip tasarımcısı tarafından tanımlanmaları gerekir. Örneğin, döngü, constructors, destructors Tuğrul Yılmaz - Pamukkale Üniversitesi 6
1. Ada Sarmalayan yapı package Dil Örnekleri Package ler genellikle iki kısımdan oluşur: 1. Özellikler kısmı (arayüz (the interface)) 2. Ana paket (Özellikler kısmında listelenen elemanların gerçekleştirimi) Bilgi saklanması (Information Hiding) 1. Saklı tipler özellikler kısmında aşağıdaki gibi tanımlanır: type NODE_TYPE is private; 2. Paketin kullanıcılara görünmeyen kısmında (private ifadesi), daha önceden açıklanan tiplerin özellikleri tanımlanır: package is type NODE_TYPE is private; private type NODE_TYPE is record end record; Tuğrul Yılmaz - Pamukkale Üniversitesi 7
Dil Örnekleri Özellikler kısmı saklı olmayan tipleri de tanımlarının doğrudan private ifadesinden önce konulması ile tanımlayabilir. private tipler için atama ve karşılaştırma ön tanımlı işleçleri (= ve /= )tanımlanmıştır tanımlanmıştır. Limited private tipler için ön tanımlı işleçler yoktur. Tuğrul Yılmaz - Pamukkale Üniversitesi 8
2. C++ Dil Örnekleri C struct t t tipine ve Simula 67 sınıflarına (classes) dayanır class kılıflama aracıdır Bütün sınıf somutlaşan örnekleri (instances) sınıf fonksiyonlarının (metot) tek kopyasını paylaşırlar Her sınıf somutlaşan örneğinin sınıfın veri üyelerinden kendi kopyası vardır somutlaşan örnekler statik, yığıt dinamik veya yığın dinamik olabilirler. Tuğrul Yılmaz - Pamukkale Üniversitesi 9
Dil Örnekleri Bilgi saklama (Information Hiding): Private yantümcesi saklanan elemanlar l içini Public yantümcesi arayüz elemanları için Protected yantümcesi kalıtım (inheritance) için (Bölüm 12) Tuğrul Yılmaz - Pamukkale Üniversitesi 10
Dil Örnekleri Yapıcılar (Constructors): Somutlaşan örneklerin verilerini başlatan fonksiyonlar (bunlar nesne yaratamaz) Yığın dinamik bellek alabilir Nesneleri parametrize etmek için parametreleri olabilir sınıfın somutlaşan örneği yaratılırken örtülü olarak çağrılır Açıkça da çağrılabilir Adı sınıf ın adıyla aynı olmalıdır l Tuğrul Yılmaz - Pamukkale Üniversitesi 11
Yok ediciler (Destructors) Dil Örnekleri Somutlaşan örneğin yaşam süresi biterken genellikle yığın ğ bellekten alınanları geri vermek için kullanılır Örtülü olarak yaşam ş süresi sonunda çağrılır ğ Açıkça da çağrılabilir Adı sınıf adının önüne tilde (~) konmuş şeklidir Tuğrul Yılmaz - Pamukkale Üniversitesi 12
Dil Örnekleri Tuğrul Yılmaz - Pamukkale Üniversitesi 13
Dil Örnekleri Friend fonksiyonları ve sınıfları bazı ilişkisiz birim veya fonksiyonların özel değerlerine ulaşmak için kullanılır. C++ da gerekli C++ SVT desteğinin değerlendirilmesi SVT açısından sınıf lar Ada package yapıları gibi fark: package yapısı bir kılıfken class bir tiptir, ayrıca class sadece veri soyutlaması için tasarlanmamıştır. Tuğrul Yılmaz - Pamukkale Üniversitesi 14
3. Java C++ gibi şu farklaki: ki: Dil Örnekleri Bütün kullanıcı tanımlı tipler class Bütün nesneler yığın bellekten alınıyor ve referans değişkenleri ile erişiliyor class içindeki bütün bireysel öğelerin yantümceler yerine erişimi düzenleyen değiştiricileri (access control modifiers) ( private veya public ) bulunur Java da kapsamı düzenleyen ikinci bir yöntem bulunur, package kapsamı Bir package içinde erişim düzenleyen değiştiricileri olmayan her class içindeki her şey package içinde görünebilir durumdadır (kapsama çevresi) Tuğrul Yılmaz - Pamukkale Üniversitesi 15
Dil Örnekleri Tuğrul Yılmaz - Pamukkale Üniversitesi 16
C# C++ ve Java ya baz alır Dil Örnekleri İki yeni erişim düzenleyici, internal ve protected internal Bütün class somutlaşan örnekleri yığın dinamik (Java gibi) Bütün sınıflar için i varsayılan yapıcılar (constructor) t Yığın bellek nesneleri için çöp toplama kullanıldığından yok ediciler (Destructors) nadiren kullanılıyor structs somutlaşan örneği (inheritance) desteklemeyen zayıf sınıflar Değere göre geçilen tiplerdir Yığıt ğ bellekte tutulurlar t l ( class yığın ğ bellekte) Temel veri tipleri dahil değere göre geçilen bütün tipler structs Veri üyelerine erişim ş için genel çözüm: Erişim ş metotları (veri alanlar ve veri koyanlar) ( get edenler ve set edenler) (getters and setters) Delphi den esinlenmiştir C# alanlar l ve koyanları açıkça metot t çağırmadan ğ özellik olarak düzenlemiştir. Tuğrul Yılmaz - Pamukkale Üniversitesi 17
C# Property Example public class Weather { public int DegreeDays { //** DegreeDays özelliktir get { return degreedays; } set { degreedays = value; } } private int degreedays;... }... Weather w = new Weather(); int degreedaystoday, d olddegreedays; D... w.degreedays = degreedaystoday;... olddegreedays = w.degreedays; Tuğrul Yılmaz - Pamukkale Üniversitesi 18
Dil Örnekleri Alan ve koyan özelliği veriyi public yapmaktan aşağıdaki nedenlerle daha iyidir: Sadece okuma amaçlı erişim sağlanabilir. Alan özellik tanımlanır, koyan özellik tanımlanmaya bilir. Koyan özelliğe bazı sınırlamalar konulabilir. Örneğin konulacak verinin limitleri olacaksa bu tanımlanabilir. Soyutlanmış veri yapısı kullananları l etkilemeden kolaylıkla l kl değiştirilebilir. Tuğrul Yılmaz - Pamukkale Üniversitesi 19
Parametrize Edilmiş SVT SVT parametrize etmek gerekebilir. Örneğin sayısal bir yığıt yaratılmak isteniyor olabilir. Her bir sayısal tip için ayrı ayrı SVT yaratılacağına, bu parametrize edilebilir. 1. Ada Jenerik paketleri Daha önce jenerik yordamları görmüştük; benzer şekilde jenerik paketler de olabilmektedir. Yığıt ın boyunu ve tipini jenerik yaparak yığıt ı esnek yapabiliriz. Tuğrul Yılmaz - Pamukkale Üniversitesi 20
Örnek Program package INT_STACK is new GENERIC_STACK(100, INTEGER); package FLOAT_ STACK is new GENERIC_ STACK(500, FLOAT); Tuğrul Yılmaz - Pamukkale Üniversitesi 21
2. C++ Templated Classes Parametrize Edilmiş ş SVT Sınıflar yapıcı fonksiyona parametre konulmasıyla bir miktar jenerik olabilirler Sınıfın templated class tanımlanmasıyla jenerik yapı elde edilir. stack (int size) { stk_ptr = new int [size]; max_len = size - 1; top = -1; } stack stk(100); Tuğrul Yılmaz - Pamukkale Üniversitesi 22
Parametrize Edilmiş ş SVT Tuğrul Yılmaz - Pamukkale Üniversitesi 23
Parametrize Edilmiş ş SVT Java 50 5.0 C# Jenerik parametreler class olmalıdır. En genel jenerik tipler LinkedList ve ArrayList gibi toplu veri tipleridir 2005 sürümü ile jenerik SVT desteği vermeye başlamıştır. Java 5.0 a benzer. Tuğrul Yılmaz - Pamukkale Üniversitesi 24
Kılıflama/Sarmalama Yapıları SVT tek tipli minimal kılıflama yapısıdır. Çok tipli kılıflama yapılarına büyük programlarda (birkaç bin satırı geçen) gereksinim duyulur. Baştaki güdüleme: Büyük programların iki önemli gereksinimi bulunur: 1. Altprogramlara bölmenin, SVT kullanmanın ötesinde bir organizasyona gidilmesi. 2. Kısmi derleme (derlenen parçaların programın tamamından daha küçük olması, derlemenin değiştirilen parçalarla sınırlandırılması) Çözüm: mantıksal olarak bağlantılı altprogram grupları birlikte ve ayrı olarak derlenir (derleme birimleri) Bunlara kılıflama (encapsulations) )denir. Programları tasarlarken altprogramların mantıksal olarak büyük altprogramlar altında toplamak. Tuğrul Yılmaz - Pamukkale Üniversitesi 25
Kılıflama Yapıları Ada, Fortran 95, Python ve Ruby iç içe altprogramları desteklerler. C C++ Bir veya birden çok altprogram içeren dosyalar bağımsız ğ olarak derlenir. Ara yüzler başlık (header) dosyaları içine konur. Problem: ilişkilendirici (the linker) başlık içindeki tiplerle derlenen dosyadaki tipleri karşılaştıramaz. Cgibi Friend sınıfının özel üyelerine erişim için friend fonksiyonunun eklenmesi. İki sınıfın özel verileri arasında işlem yapılacaksa buna olanak sağlamak amacıyla kullanılır. Tuğrul Yılmaz - Pamukkale Üniversitesi 26
Ada Package yapısı Kılıflama Yapıları İstenen t sayıda veri ve altprogram tanımlaması yapılabilir, sınırlama yok. İki kısımdan oluşur: ş özellikler ve gövde (specification and body). Bu iki kısım bağımsız olarak derlenebilir. C# Assembly (Kurgu, montaj) Tek dinamik bağlanma ile oluşmuş kütüphane veya yürütüme hazır program oluşturan dosyalar. Sınıftan daha büyük bir yapı;.net programlama dilleri tarafından kullanılır. Tuğrul Yılmaz - Pamukkale Üniversitesi 27
Adlandırma Kılıfları (Naming Encapsulations) Büyük programlar bir anlamda bağımsız çalışan birçok geliştirici tarafından yazılırlar. Bu mantıksal birimlerin bağımsız ğ olmasını, bununla birlikte birlikte çalışabilmelerini gerektirir. Büyük programlar birçok global isim tanımlarlar, değişik grupların tanımladığı isimlerin çakışması tehlikesi vardır; bunların mantıksal gruplara bölünmesi gerekebilir. İsimlere yeni bir kapsam yaratmak için Adlandırma Kılıfları kullanılır. C++ Namespace (alan adı) Her kütüphane kendi namespace içinde olabilir ve dışarıdan alan adı ile erişilir. Namespace MyStack { // Stack tanımları } MyStack::topPtr //başka bir paketten kullanımı C# da aynı yapıyı kullanır Tuğrul Yılmaz - Pamukkale Üniversitesi 28
Java Package Adlandırma Kılıfları Birden çok sınıf tanımı içerebilir; bu sınıflar kısmen friend (aynı package içinde ve public ve protected olanlar) olabilirler. package mystack; örneği gibi, tanımlaması dosyanın başında olmalıdır. Kullanıcıları pakette tanımlanan isimlere dışarıdan tam adları ile (mystack.topptr gibi) veya diğer paket başına import mystack.*; komutu eklenmişse sadece değişken ismiyle erişebilirler. Ada Package Paketlerin tanımlama hiyerarşileri dosya hiyerarşileri ile sağlanır. subpack, Pack paketinin alt paketi ise, subpack dosyasının Pack dosyasının durduğu dizinin alt dizininde durması gerekir. Bir program biriminde bir paketin isimlerinin görünebilmesi, o paketin adının with yan tümcesinde geçmesi ile elde edilir: with Ada.Text_IO; Tuğrul Yılmaz - Pamukkale Üniversitesi 29