Photo by Sagnavel Sodecva on Unsplash

JS ILE FONKSIYONEL PROGRAMLAMA

Soyutlama ve Kapsama (Abstraction & Composition)

Yazılım geliştirmenin temeli olan Abstraction & Composition kavramlarını anlatmaya çalışacağım.

Onur Dayıbaşı
Frontend Development With JS
5 min readJun 4, 2020

--

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 kaçmak için bu şekilde bir yönteme başvurdum.

Yazılım aynı gerçek dünyadaki gibi soyutlamalar üzerine inşaa edilmiştir. İnsanlık gelişimini nasıl bir takım işlerde özelleşerek hizmet verdiği müşterilerinden işlerini detaylarını nasıl yapıldığını soyutluyor ise, yazılım geliştirmede bundan farklı değildir. Örneğin arabanızı bakıma servise götürüyorsunuz, veya bir restorana yemeğe gidiyorsunuz, size sunulan hizmetlerin sonucunu siz görüyorsunuz ama bu hizmetlerin içerisindeki detayları harcanan eforları vs görmüyorsunuz. İşte SOYUTLAMA (Abstraction) dediğimiz kavram yapılan işin NE olduğu ile ilgilenmek, NASIL yapıldığı ile ilgilenmemektir.

Bunu yazılım geliştirmeye uyarladığımızda biz geliştirdiğimiz kodlar ile ekip arkadaşlarımıza, diğer takımlara veya başka firmalardaki geliştiricilere sağlamış olduğumuz soyutlamalar (abstraction) bugün kü yazılım ekosistemini, bugünkü büyük yazılım sistemlerinin , uygulamalarının oluşmasını sağlayan temel yapıdır, diyebiliriz. Daha açık konuşmak gerekirse Yazılımda ;

  • Fonksiyon (Utility functions)
  • Algoritma (Algorithms)
  • Veri Yapıları (Data Structures)
  • Modüller (Modules)
  • Sınıflar (Classes)
  • Kütüphane. (Library)
  • Çerçeve Yazılımları (Frameworks)

Tüm bu saydıklarımız geliştiricilerin büyük yazılımlar , altyapılar oluşturmamız için imkan sağlarlar, hatta günümüzde sağlanan bu hizmet soyutlamaları aynı makinede derlenip tek bir kod bloğu olacak diye zorlamıyor. Örneğin SaaS servisleri sayesinde bir çok hizmeti Stripe(Ödeme), Auth0(Yetkilendirme) vb servisleri uygulamanıza bağlayıp istediğiniz servisleri arayüzler API üzerinden kullanabiliyorsunuz.

Peki KAPSAMA(Composition) neden bu kadar önemli. Yukarıda bahsettiğimiz gibi hizmetleri soyutlayarak belli problemleri, sorunları çözen yapılarımızı oluşturduk.

Aynı gerçek hayatta olduğu gibi Araba servisinde olduğu gibi bir kişi gidiyor arabasını bu servise bırakıyor ve akşam üzeri bakımları yapılmış, aksamları tamamlanmış şekilde alıyor. Gerçek yaşam işler bu kadar basit değil, yazılımlarda günümüzde bu seviyenin çok çok üzerinde. Örneğin bir Havalimanını ele alalım. İşlerin ne kadar karmaşık olduğunu sizde göreceksiniz. (Rezarvasyon Sistemi, Otopark Sistemi, Güvenlik Sistemi, Kafaler/Mağzalar, Kargo Sistemi, Bilet Sistemi, Uçak Sistemi, Havalanı vb…) bir çok hizmetin kesiştiği bir yer. Bu durumda siz nasıl birçok hizmetten faydalanıyorsanız, yazılım geliştirirkende bu soyutlanan parçaları uygulamanızın kullanmasını KAPSAMA’sını sağlayarak büyük yazılımlar, sistemler geliştirebilirsiniz.

Buraya kadar Abstraction & Composition (Soyutlama ve Kapsama) kavramından detaylara girmeden bahsettim. Ama bu işlemlerin doğru ve kaliteli yapılmadığında kurduğumuz sistemler giderek karmaşıklaşacak ve içinden çıkılamaz yapılara dönüşecektir. Bundan dolayıdır ki bu konuda yazılmış bir çok kitap , örnek ve makale bulunur. Yazının devamında bu konulara, yazılımda geçen bazı kavramlara değinmek istiyorum.

1. Soyutlaştırmak Aslında Bir Basitleştirme İşlemidir.

Soyutlaştırmak hizmetin veya servisin arkasında olan bir çok işlemin, problem çözümünün karmaşıklığın size belli basit arayüzler üzerinden sunularak basitleştirilmesidir.

Arayüz derken, Nesne Tabanlı Programlamada Javada interface ve abstract keyword bu dildeki soyutlama arayüzlerinin oluşumunu sağlar, JAR paketleri olsun NPM paketleri olsun, C++ dll modülleri import, require kullanarak h dosyalarını, interface, veya fonksiyon export kullandırarak biz geliştiricilerin arka planda gerçekleştirim detayı dediğimiz karmaşıklıklardan kurtulmamızı sağlar. API (Application Programming Interface) bizim bu kütüphanaler ile haberleşmemizi iletişim kurmamızı sağlar. Aşağıda bu konu hakkında yazmış olduğum Örnek yazıları okursanız bu konuları daha rahat bir şekilde anlayabilirsiniz.

Bu soyutlaştırma ilk düşünce ortaya çıktığı dönemlerden Aristoteles (theory of knowledge) çağdaş yöntem bilim ve bilgi kuramını ortaya attığı dönemlere kadar eskiye gider aslında. Tümdengelim ve Tümevarım akıl yürütme yöntemleri ile bu soyutlamaları insanoğlu önce düşünme şekillerinde gerçekleştirmiştir.

Tümdengelim: Genelden özele giderek akıl yürütmektir.

  • Bütün balıklar denizde yaşar. Hamsi bir balıktır. O halde hamsi denizde yaşar.
  • Bütün insanlar ölümlüdür. Sokrates insandır. O halde Sokrates ölümlüdür.

Tümevarım: Özelden genele giderek akıl yürütmektir.

  • Sokrates insandır. Sokrates öldü. O halde tüm insanlar ölecektir.

Tümevarım özelden genele gittiği için örnek sayısı arttıkça ve sonuç hep aynı çıkar ise Çıkarımımız doğru olma ihtimali artacaktır.

Şimdi gelelim yazılımda buna karşılık gelen Generalization ve Specialization kavramlarının neler olduğuna.

Generalization, Specialization

Generalization (Genelleme) : Tekrar eden örüntüleri ve işlemleri çıkarıp bu benzerlikleri bir soyutlama arkasında saklamaktır. Farz edelim tüm aldığımız ürünlerde %18 kdv ekleniyor. Tüm muhasebe yazılımı yapan uygulamaların bunu yapması yerine Bunu yapan bir fonksiyon, sınıf veya kütüphane yazarak bu muhasebe işlemini soyutlayabiliriz.

Specialization (Özelleşmek) : Özelleştirmek’te genelleştirmenin aksine sadece o duruma özel işlemleri , mantıkları oluşturarak soyutlamak anlamına gelir.

Soyutlama (Abstraction) işlemi yaparken bu iki yöntemi ne kadar iyi algılayabildiğimiz ve ne ölçüde başarılı şekilde yapabildiğimize kalacaktır. Buna göre yazılımımız ya çok karmaşık yada istenilen basitlik seviyesinde olacaktır.

2. Fonksiyonel Programlama’da Soyutlama ve Kapsama

Bizim nesil Java’daki Nesne tabanlı programlamadan öğrendi Abstraction, Encapsulation, Aggregation, Composition, Generalization, Inheritance, Polymorphism etc.. bir çok kavramı ama burda Fonksiyonel Programlama üzerine durduğumuz için Fonksiyonel Soyutlama ve Kapsama’dan bahsediyor olacağım. İleriki yazılarda Nesne Tabanlı Programlama’da bu Soyutlama ve Kapsama’da ne tür yanlışlıklar yapılabildiği üzerinde de duracağız

Fonksiyonlar farklı farklı bağlamlarda farklı isimler atayıp(identity) kullanabildiğiniz ve bu fonksiyonları birbirine kapsayacak şekilde data kapsayıcı(composition) komplex fonksiyonlar yazabildiğiniz için fonksiyonlar başarılı bir soyutlama araçlarıdır diyebiliriz.

Pure(Saf) fonksiyonlar soyutlama için en kullanışlı fonksiyonlardır. (Saf Fonksiyonlar Nedir ?)

f(x)= y , g(w)=z fonksiyonları olsun (f(g)(x)) olan bir h fonksiyonu nasıl yazacağız.

Bunu gerçek bir örnek ile göstermek istersek. Toplama işlemi yapan bir fonksiyonumz olsun.

const add = (a, b) => a + b;//Kullanım
const a = add(1, 1);
const b = add(a, 1);
const c = add(b, 1);

Bunu bu şekilde yazmak yerine Curried fonksiyon şeklinde yazdığımızda kendi özelleşmiş +1 yapan fonksiyonumuz geliştirebiliriz.

const add = a => b => a + b;
const inc = add(1);

Örneğin Higher Order Function dediğimiz map,reduce,filter kendi uygulamamıza göre özelleştirip kullandırtabiliriz. doubleAll fonksiyonu yazıp kullanabiliriz.

const map = f => arr => arr.map(n=>n*n); yerineconst f = n => n * 2;
const doubleAll = map(f);

3. Sonuç

Sonuç olarak yazılım geliştiriciler sürekli olarak bu soyutlama ve kapsama işlemini gerçekleştirerek yazılımlarını geliştirirler burada önemli olan konu bunları nasıl yapmalılarki rahatça ve herkes tarafından kolaylıkla kullanılabilsin ? map, filter, and reduce fonksiyonlarını analiz ederek bu soyutlaştırmanın olması gereken temek özelliklerini çıkarabilirsiniz;

  • Simple (Basit)
  • Concise (Öz)
  • Reusable (Tekrar Kullanılabilir)
  • Independent (Bağımsız)
  • Decomposable (Ayrıştırılabilen)
  • Recomposable (Yeniden kapsayabilen)

Referanslar

Okumaya Devam Et 😃

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

--

--