Photo by Gérôme Bruneau on Unsplash

JS ILE FONKSIYONEL PROGRAMLAMA

ADT (Abstract Data Types)

Veri Yapıları(DS) ile Soyut Veri Tipleri(ADT) arasında ne tür farklar bulunuyor. Sıkça kullanılan ADT Türleri nelerdir ? Bu soyut veri tipleri cebirsel işlemlerde ne gibi avantajlar sağlar ?

--

Bu yazıyı daha önceden yazmış olduğum JS ile Fonksiyonel Programlama yazısının bir devamı olarak yazıyorum. Bir çok kavramı tek bir yazıda ele almanın yaratacağı karmaşıklıktan ve okunma zorluğundan kaçmak için yazılarımı bölümler halinde yazma kararı verdim.

Bir önceki yazımda Soyutlama ve Kapsama nasıl büyük yazılımlar geliştirebileceğimizi bu prensiplerin yazılımın temelini oluşturduğundan bahsetmiştik.

Bu yazıda ADT yani Soyut Veri Tipleri ne olduğunu ve yazılım için neden önemli olduğunu anlatmaya çalışacağım.

1. Data Types (Veri Tipleri)

Programlama dillerinde type diller ise 3 aşağı , 5 yukarı aynı türde veri tiplerini içerir. Siz matematiksel bir sayı hesabı yapmak için integer, daha detaylı para hesabı için float, adres, isim vb işlemler için string gibi veri tiplerini kullanırsınız.

Dilleri incelediğimizde Primitive ve Non Primitive olarak veri türleri 2 ‘ye ayrılır. Bazılarında Primary, Derived ve UserDefined olarak ayrılabiliyor. Ama sonuçta dillerin veri tipinin tutacağı verinin türü ve bellekteki boyutu sabit ve değiştirilemez olan (Primitive) ile geliştiriciler tarafından yeni veri tiplerinin oluşturulmasını sağlayan(Non-Primitive) yapılar bulunur.

Java / C

Sonuçta yeni veri tipleri oluşturacaksak bunları önceden dil tarafından tanımlanmış sabit Primitive ile kullanıcı tarafından daha önceden oluşturulmuş Non-Primitive Kapsayacak şekilde yeni yeni veri tipleri oluşturarak Kar Topunun kar üzerinde ilerlerken büyümesi gibi veri tiplerinin diğer veri tipleri kapsayarak büyümesi ile büyük yazılımlar ortaya çıkar.

Geliştiricilere sağlanan bu esneklik sayesinde sonsuz sayıda veri tipi oluşturulabilir. Peki (ADT) Soyut Veri Tipi ne oluyor ? Henüz bu konuya girmeden önce Veri Yapıları (Data Structures) konusunuda biraz değinmek istiyorum. Bilgisayar Mühendisliğinde 1 veya 2nci sınıfta karşımıza çıkan bu derste Algoritma bilgimizi geliştirmek için Node tanımlaması ile başlayan ders ilerleyen süreçte LinkList, DoubleLinkList gerçekleştirip bunların fonksiyonlarını implement(gerçekleştirmemizi) etmemizi isterler. Çünkü yazılımda;

  • bir öğrenci değil birden çok öğrenci vardır
  • bir sınıf değil birden fazla sınıf vardır
  • bir öğretmen değil birden fazla öğretmen vardır.
  • bir ders değil birden fazla ders vardır.

Sizden istenen bu öğrencilere erişmek, yeni öğrenciler eklemek, silmek gibi işlemlerdir. Bunları yapabilmeniz için bilindik bazı veri yapılarını Örneğin Array, LinkedList, Vector, Stack vb.. nasıl oluşturabileceğinizi ve kullanacağınızı bilmeniz gerekir.

Tabi gerçek iş yaşamında sıkça kullanılan bu veri yapılarını kendi başına geliştirmeniz gerekmez. Bunun için dillerin utility paketleri veya farklı kütüphaneleri içerisinde hazır Collection, Template Library vb veri yapıları kütüphaneleri bulunur.

Java’da Collection paketi içerisinde ArrayList, LinkedList, HashSet, HashMap, TreeSet, Vector, PriorityQueue Stack, ConcurrentHashMap

CPP için Standart Template Library pair, vector, list, queue, set, queue, map, bıtset, valarray

Javascript’de Array, Object, Map/Set, WeakMap/WeakSet gibi hazır gerçekleştirimleri görebilirsiniz.

Tüm dillerde hazır benzer veri yapıları mevcuttur ve bunların bazen isimleri farklı olabilir Örneğin HashTable Objective C dilinde karşımıza NSDictionary olarak çıkabilir Önemli olan bu veriyapılarının nasıl çalıştıklarını anlayıp ihtiyaçlarınız doğrultusunda kullanabilmenizdir.

Farklı diller de olsa bunlar hep gerçekleştirimleridir. Biz geliştiriciler bu gerçekleştirimleri kullanırız ama başka bir dili geçsekte diğer gerçekleştirimi kullanmayı öğrenmemiz pek zaman almaz peki bu NASIL olabiliyor ? Cevabı ADT yani Abstract Data Types ‘dır.

1. ADT (Abstract Data Types) Nedir ?

Yukarıda bahsettiğim farklı dillerdeki veri yapıları;

  • gerçekleştirimleri ,
  • verilerin bellekte nasıl tutulduklarına,
  • thread bu verilere nasıl eriştiklerini, vs vs bir çok detayı içerir.

Ama biz Soyut Veri yapılarından bahsediyorsak Gerçekleştirim detaylarından SOYUTLANMIŞ bir kullanımdan bahsediyoruzdur. Veriyapısı üzerindeki bazı verileri ve işlemleri(ops) temsil eden aksiyomlar tarafından tanımlanan soyutlamadır.

Açıklama biraz karmaşık gelmiş olabilir. Aşağıdaki resmin durumu daha iyi anlatacağını düşünüyorum.

Örnek Bir ADT ve VeriYapısı(DS) gösterimi

Arayüz kısmına soyutlamasına ADT , gerçekleştirimine DS diyoruz. Sıkça ve çokça kullanılan ADT ler;

  • List
  • Stack
  • Queue
  • Set
  • Map
  • Stream

Ama burdan sadece sıkça kullanılan ADT var diye anlaşılmasın. ADT herhangi bir veri kümesindeki işlemlerin soyutlaması olduğu için sonsuz sayıda ADT vardır diyebiliriz. ADT’ler, semigroups, monoidler, functorlar, monadlar vb. dahil olmak üzere birçok yararlı cebirsel yapıyı ifade edebilir. Örneğin JS için The Fantasyland Specification bunun ile ilgili kataloğa ulaşabilir.

1.1. Neden ADT ?

Aslında bu sorunun cevabını yukarıda da biraz vermiştim. Biz geliştiricilerin kütüphane(library), çerçeve yazılımı(framework) veya dilden bağımsız şekilde yazılım blokları oluşturabilmek için ortak dil oluşturmamızı sağlar. Bu sayede yazılımlarda veriler üzerinde çalışırken tekrar kullanılabilen modülleri matematiksel olarak tanımlamıza olanak sağlar.

Yazılım dediğimiz kavram her geçen gün giderek büyümekte ve milyonlarca satır kodu barındıran uygulamalar günümüzde çalışmakta Google, Facebook, Amazon, Microsoft hatta Tesla, SpaceX hepsinin içeriside milyonlarca satırlık kodlar var. Yazılım mühendisleri donanımlar üzerinde çalışan kodlarını her ne kadar çalıştığını idda etselerde gerçekte yazılım projeleri çok kompleks, kırılgan ve karmaşık yazıldığından şu temel problemlerle karşı karşıya kalır.

  • Bütçeyi Aşmak
  • Gecikme
  • Hatalı
  • Eksik Gereksinimli
  • Bakımı/Devamlılığı zor

Yazılımı modüler parçalardan oluştuğunu düşünürseniz. Tüm sistemi anlamanıza gerek yoktur. Yazılım’da bu prensibe locality denir. Yazılımda bu localicty prensibini yakalamak için modüle ihtiyacınız var. Bu sizin geliştirdiğiniz kısmı tüm sistemden izole ederek tüm sistemi anlamak ile uğraşmadan kendi yapınıza odaklanma imkanı verir. ADT bu modül gerçekleştirimlerini yapmdan problemi çözmenize olanak sağlar.

1960'lardan bu yana bir çok ünlü bilgisayar bilimci Barbara Liskov, Alan Kay, Bertrand Meyer ve diğerleri ADT’yi içeren Nesne Tabanlı Programlama, ADT ve Tasarım Kontractlı modüler yazılım geliştirme kurallarını prensiplerini oluşturdu. SOLID ‘deki Liskov Substitution Principle bunlardan birisidir

1.2 ADT için Spesifikasyonlar

ADT spesifikasyonunun uygunluğunu değerlendirmek için çeşitli kriterler bulunur. Aşağıdaki 1975 yılında Liskov and Zilles tarafından yazılmış bu makalede de bu durumlar değerlendirilmektedir.

“Specification Techniques for Data Abstractions.

Formal: Spesifikasyonlar formal olmalıdır. Her bir elamanın anlamı hedef kitle açısından uygulama geliştirmesine uygun olmalıdır. Spekteki her aksiyom için kodda bir cebirsel kanıt uygulamak mümkün olmalıdır.

Applicable(Uygulanabilir): Geniş çapta uygulanabilir olmalı. Farklı farklı veri tipleri , dillerde veya ortamlada aynı şekilde çalışabilmeli, kullanılabilmeli.

Minimal(Öz/Sade): Olabildiğince öz olmalı, fazla veya gereksiz hiç bir detay içermemelidir. Kesin ve açık olmalı , hatta çoğu ADT spesifikasyonu aksiyom kullanılarak kanıtlanabilmelidir.

Extensible(Genişleyebilir): ADT’ler genişleyebilir olmalıdır. Gereksinimlerdeki ufak değişiklikler ADT küçük değişikliklere yol açmalı büyük yapısal değişiklikler gerektirmemelidir.

Declarative: Nasıl yaptığını değil ne yaptıpını tanımlamadır. Veri yapısındaki girdi işlemi ile çıktı işlemi arasındaki ilişki bağlantısını anlatması gerekir. Örn : stack.push dediğimizde eklenen elemanı veri yapısının en üstüne ekleyeceğini ve pop deyince en üsttekini alacağımızı anlamak bu ilişkiyi tanımlamakdır. Ama bunu bellekte nasıl tuttuğu ve nasıl yaptığı ile ilgilenmemektir.

Referanslar

Okumaya Devam Et 😃

Bu yazının devamı veya yazı grubundaki diğer yazılara erişmek için bu linke tıklayabilirsiniz.

--

--