SOLID Prensipleri
SOLID prensibleri yazılım geliştiren hemen hemen herkesin en azından bir defa duymuş olduğu bir kısaltmadır. İnternette araştırıldığı zaman bu SOLID prensipleriyle ilgili binlerce içerik bulmanız mümkün. O sebeple ben bu yazıda detaya girmeden, yüzeysel olarak, ilk defa okuyacak kişinin bile kolaylıkla anlayabileceği tarzda özetler geçeceğim.
SOLID prensipleriyle amaçlanan şey özetle, kodların yeniden kullanılabilirliliğini sağlamak ve projeye yeni bir özellik eklenecek olması durumunda, proje kodlarının okunurluluğunu koruyacak esnekliği projeye kazandırmaktır.
SOLID kısaltması, 5 temel prensibin baş harflerinden oluşmaktadır.
S – Single-Responsibility Principle (Her sınıf/fonksiyonun bir tek görevi olmalı)
O – Open-Closed Principle (Geliştirmeye açık değiştirmeye kapalılık prensibi)
L – Liskov Substitution Principle (Liskov yerine geçme prensibi)
I – Interface Segregation Principle (Interface ayrımı prensibi)
D - Dependency Inversion Principle (Dependency Injection uygulamak)
Single-Responsibility Prensibi
Bir Sınıfın ya da fonksiyonun, metodun tek bir görevi ve sorumluluğu olmalıdır. Başka sınıfların görevlerini gerçekleştirmemelidir. Fonksiyon bazında bir örnek vermek gerekirse, bir fonksiyon toplama işlemi yapmakla yükümlü ise, bu fonksiyona bölme işlemi yaptırmamak gerek. Daha somut bir örnekle bir fonksiyon bir kullanıcıya ait parola güncelleme işini üstlenmişse eğer, o fonksiyon sadece parola bilgisi güncellemesi gerekiyor, kullanıcıya ait başka verilerin güncellenmesi işlemini üstlenmemeli. Sınıf üzerinden bir örnek verecek olursam. Eğer Kullanıcı adında bir sınıfımız varsa bu sınıf, sadece kullanıcıya ait sorumlulukları üstlenmeli. Mesela kullanıcının adı, soyadı gibi kullanıcıya has değişkenler içermeli ve bu doğrultuda fonksiyonlar içermelidir. Mesela kullanıcı adını güncellemek, bu sınıfa ait bir fonksiyon olacaktır. Kullanıcıya ait adres bilgisini güncellemek gibi bir fonksiyona ihtiyaç duyarsak yada kullanıcının yaşadığı şehir, sokak, mahalle gibi değişkenlere ihtiyaç duyarsak, bu tarz bilgileri ve işlemleri Kullanıcı sınıfı üzerinden yapmak yerine Adres adında yeni bir sınıf oluşturup oradan gerçekleştirmek, tek bir sınıfa çok fazla sorumluluk yüklemeyi azaltacaktır. Bu da sınıfların daha temiz, anlaşılır yapıda olmasını sağlayacaktır.
Open-Closed Prensibi
Bir uygulamanın, objelerin yada entitylerin geliştirilmeye açık ancak değiştirmeye kapalı olduğunu belirtir. Örneğin elimizde televizyon adında bir sınıf yada interface var. Bu sınıfa ait tvAc() adında bir fonksiyonumuz var. Bir gün dedik ki bu televizyonu açıyoruz bir de buna televizyonu kapatma fonksiyonu ekleyelim. Böyle bir durumda tvAc(); fonksiyonunu editlemek zorunda kalıyorsak, Open-Closed prensibine aykırı bir iş yapıyoruz demektir. Kuracağınız yazılım mimarisini öyle bir dizayn etmeliyiz ki, bir gün televizyonu kapatmak şeklinde bir implementasyona ihtiyaç dıuyarsak, tvAc(); fonksiyonuna hiç dokunmadan, Televizyon adlı sınıfımıza sadece tvKapat(); adında bir fonksiyon ekleyerek projeye televizyonu kapatma fonksiyonunu kolaylıkla implemente edebilmeliyiz. Konuyu iyi anlattığını düşündüğüm şu yazıyı incelemenizi tavsiye ederim : https://www.gokhan-gokalp.com/open-closed-principle-ocp-acik-kapali-prensibi/
Liskov Prensibi
Bir abstract class yada interface içerisinde kullanılan yada tanımlanan fonksiyonlar, alt sınıflar tarafından override edilerek kullanılamıyorsa, Liskov prensibine aykırı bir kod yazmışız demektir. Çok beğendiğim ve her zaman verdiğim klima örneği vardır. Eminim bu örnekten sonra siz de bu prensibin asıl amacını kolaylıkla anlayacaksınız. Diyelim ki elimizde araba diye bir interface var. Bu interface içerisinde bir arabada olması gereken bazı fonksiyonları tanımladım. Mesela bu fonksiyonlardan bir tanesi klimaAc(); fonksiyonu olsun. Ben bu interface'i Ferrari ve Şahin adında 2 tane sınıfa implemente ederek kullanmak istedim diyelim. Ferrari'de klima olduğu için ben bu fonksiyonu Ferrari sınıfımda kolaylıkla implemente edebileceğim fakat Şahin sınıfında klima adında bir fonksiyon olması gerektiği halde, gerçek hayatta Şahin'in kliması olmadığını düşündüğünüz zaman, klimaAc(); fonksiyonu Şahin sınıfı içerisinde ya NULL bir response dönecek yada Exception fırlatan bir fonksiyon olacaktır. Bu da Liskov prensibine aykırı bir davranıştır.
Interface Segregation Prensibi
Bir interface içerisinde tanımlı olan fonksiyon, implement edilecek class’lardan birinde bile kullanılmıyorsa, o interface sınıfını ikiye böl veya farklı interface yaz. Kısacası, bir class içerisinde hiçbir zaman kullanılmayacak bir interface fonksiyonu yer almamalı. Örneğin Liskov başlığı altında araba - klima örneğini verdim. Eğer klima özelliği her araçta yoksa, LüksAraclar şeklinde yeni bir interface oluşturabiliriz. Tabii ki günümüzde artık bir aracın klimalı olması lüks değil ama ben konuyu daha anlaşılabilir kılmak için böyle bir örnek vermek istedim.
Dependency Inversion Prensibi
Sınıflar arası bağımlılığı en azaltan bir prensiptir. Bu prensibin implementasyonuna ise Dependency Injection denmektedir. Bu prensip, üst sınıfı doğrudan alt sınıfa bağlamak yerine, üst sınıfa ait nesneyi alt sınıfa enjekte etmeyi tavsiye eder. Bunu yapmak için ise üst sınıfa ait nesne, alt sınıfta parametre olarak kullanılır. Eğer Spring Boot kullanıyorsanız, bunu @Autowired notasyonu ile defalarca farkında olmadan yapmışsınıdır. Notasyon kullanmadan, getter ve setter metodlarla veya doğrudan constructor sınıflar aracılığıyla üst sınıf nesnesini, başka bir sınıfa parametre olarak verebilirsiniz. Aslında @Autowired notasyonu da bunu yapıyor. Böylece üst sınıfa ait implementasyonları istediğimiz sınıfın içerisinde kullanabiliyoruz. Bu prensip, sınıflar arası"decoupling" yapıyor. Bu sayede sınıfları birbirinden soyutlayarak ayrıştırmış oluyoruz. Bu sayede proje büyüdükçe ortaya çıkabilecek kod karmaşasını önleyerek, projeye esneklik kazandırmış oluyoruz. Bu konuyla ilgili internette binlerce içerik ve örnek var. Ufak bir aramayla bir sürü örneğe ulaşabilir ve bu konuyu daha da pekiştirebilirsiniz. Bana göre yazılım geliştirme alanında mutlaka bilinmesi, hakim olunması gereken bir konu.
ORM, Hibernate, Spring Data ve JPA Kavramları Nedir?
- ORM toolları nesne tabanlı programlamada bulunan objeler ile veritabanı sistemimizdeki tablolar arasında köprü görevi kurulmasını sağlar.
- ORM bir konsepttir. Yani model ile veritabanı arasında kurulması gereken konseptin adıdır. Bir araç değildir.
- Hibernate gibi EclipseLink, OpenJPA, TopLink gibi birçok farklı ORM aracı bulunmaktadır
- ORM toollarından önce yazılımcılar, modeldeki tanımlamaları veritabanındaki tablolarla eşleştirecek kodlar yazıyorlardı.
Hibarnate
- ORM’nin bir aracıdır. ORM konseptini uygulayan bir araçtır.
- JPA'nın implementasyonudur.
JPA - Java Persistence Api
- Java’nın persistence (kalıcılaştırma) apisi olarak geçer. Persistence kelimesi ise uygulama tarafında, veritabanındaki tablo yapısına denk gelen bir model oluşturmak ve bu modele gerekli dataları set etmek anlamına gelmektedir. Bu objeye ait datalar JPA tarafından veritabanına kayıt edilmek üzere kullanılmaktadırlar.
- JPA aslında Hibernate, EclipseLink, DataNucleus gibi diğer persistence apilerin birleştirilmesiyle oluşmuştur.
- JPA bir standarttır. Hibernate, EclipseLink gibi ORM toolları, JPA'nın implementasyonlarıdırlar.
- JPA sayesinde ORM toolları arasından istediğimiz birini kullanabilmekteyiz.
Konuyla ilgili internetteki kaynaklarda verilmiş şu benzetmeler gayet hoşuma gitti.
“JPA is the dance, Hibernate is the dancer.”
“JPA is the art, Hibernate is the artist."
Spring Data JPA
- Hibernate gibi JPA Provider’ların üzerine ek bir soyutlama katmanı ekleyerek veritabanın sorguları kolaylaştırılmıştır.
- Sprin Data JPA kullanırsak Repository sınıfımız şöyle olacaktır. En üstte Spring Data JPA > Spring Data Commons > JPA Provider
- Spring Data Commons, veri kaydetmeye özgü Spring Data projeleriyle paylaşılan altyapıyı sağlar.
- JPA Provider, Hiberbate gibi Java Persistence API’leri implement eder.
JpaRepository, CrudRepository ve PagingeAndSortingRepository
- JpaRepository, Spring Data'da kullanılan interface'tir. (https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html)
- CrudRepository sadece Crud işlemlerini barındırır.
- PagingAndSortingRepository sadece sıralama ve sayfalama fonksiyonlarını barındırır.
- JpaRepository, CrudRepository ve PagingAndSortingRepository sahip olduğu tüm fonksiyonları barındırır.
- @CrudRepository @JpaRepository https://stackoverflow.com/questions/14014086/what-is-difference-between-crudrepository-and-jparepository-interfaces-in-spring
- ORM ve Hibernate https://medium.com/@tugrulbayrak/hibernate-1-orm-kavramına-giriş-c2ba2f2a3bfe
- JPA ve Entity https://medium.com/@tugrulbayrak/hibernate-2-jdbc-jpa-entity-hibernate-kurulum-konfigürasyon-mysql-30fa801a0840
- Spring Data JPA https://www.javaguides.net/2018/11/spring-data-jpa-tutorial-getting-started.html
@SpringBootApplication, @Bean, @Configuration, @Component Nedir?
Bellek Yetersiz Olduğundan Windows Bu Resmi Görüntüleyemiyor Hatası
Bilgisayarınızda kullanılabilir bellek yetersiz olduğundan Windows Fotoğraf Görüntüleyicisi bu resim görüntüleyemiyor. Kullanmadığınız programları kapatın veya sabit diskinizin belleğinde (tamamına yakın doluysa) yer açın, sonra da yeniden deneyin.
Spring Anotasyonlarının Çalışma Mantığı ve Temel Anotasyonlar
Türk Telekom "Boş Port Yok" Sorunu Nedir ve Ben Bu Sorunu Nasıl Çözdüm?
Yıllar önce TTNET Berbat İnternet başlıklı bir yazı yazmıştım. O yazıdan tam 7 yıl sonra bu yazıyı yazıyorum ve isimlerinin TTNET'ten Türk Telekom'a değişmesi haricinde istikrarlı bir şekilde berbat hizmet vermeye devam ediyorlar.
Şu malum "boş port yok" sorunu benim de başıma geldi. Aslında port var. Zaten port yok dedikleri şey de oturup kazı kazılacak yada böyle aylarca alt yapı döşenmesi gereken bir problem değil. İstedikleri takdirde bir saatlerini bile almayacak bir iş. Ayrıca mahallede port sorunu olmadığı halde Türk Telekom, "Mobil wifi" yada "Jet wifi" adını verdikleri, baz istasyonu aracılığıya evde internet hizmeti satabilmek için kullanıcılara "port yok" şeklinde bir bahane uyduruyorlar. Bu bahaneye inan insanlar ise ya internetsiz kalıyorlar yada bu mobil wifi adı verilen hizmeti satın alarak 2 - 3 kat pahalıya internet hizmeti kullanmak zorunda kalıyorlar.
Öncelikle şunu bilmeniz gerekir ki "port yok" şeklindeki dayatılmaya çalışılan şey uydurmasyondan ibarettir. Teknoloji çağında yaşadığımız bu dönemde, böyle bahanelere inanmayın ve hakkınızı her türlü mercide sonuna kadar arayın. Eninde sonunda o "port yok" bahanesi bir anda çözülüyor. Bugün port yok diyen şirket yarın size "port sorunu çözüldü" şeklinde dönüş yapabiliyorlar. Asıl mevzu olayın peşini bırakmamakta yatıyor. İnternette eğer araştırırsanız, forum sitelerinde insanlar bir şekilde, kendi yöntemlerini uygulayarak bu problemle başa çıkıp evlerine internet bağlatabiliyorlar.
Peki Ben Bu Sorunu Çözebilmek İçin Ne Yaptım?
Bilgi Teknolojileri ve İletişim Kurumu (BTK) üzerinden Türk Telekom'a şikayet yazdım. Sizde şikayette bulunmak için tek yapmanız gereken şey https://tuketicisikayet.btk.gov.tr/ adresi üzerinden online şikayet bildirim sistemine e-devlet ile giriş yapmak.Şikayet olarak ise, "Tür Telekom'dan mahallenizdeki port sorununu çözmek istediğinizi talep ettiğinizi ama Türk Telekom sizin bu port sorununu çözmek yerine size sürekli beklemenizi yada mobil wifi paketlerini kullandırmak istediğini" belirtin. Sizin bu şikayetinizden sonra Türk Telekom size cevap atacak ve "alt yapı yok, mobil wifi paketlerimizi kullanın" şeklinde cevap dönecek. Siz yine BTK üzerinden Türk Telekom'un bu cevabına "Şikayete İtiraz Et" yaparak cevap atın. Yine aynı şeyleri yazın. Durumunuzu anlatın ve Türk Telekom'un derhal mahallenizde port sorununu çözme çalışmalarında bulunmasını talep edin. Bu şikayetinize Türk Telekom, önceki cevabın aynısını kopyala-yapıştır yaparak size cevap olarak iletecek. Siz ise tekrardan Türk Telekom'un cevabına itiraz edin. Bu itirazınızdan sonra BTK bu sefer otomatikman olaya kendisi dahil olacak ve sizin yerinize Türk Telekom ile iletişime geçerek sizin sorununuzu çözecek.Olayın mantığı şu. İlk mesajlarda direkt Türk Telekom ilgileniyor. İkinci şikayet cevabına itirazdan sonra direkt BTK konuya el atıyor. Sonra bir de bakmışsınız ki bir sihir gibi port sorununuz 1-2 gün içinde çözülüyor. Olayın bu şekilde üzerine gitmediğiniz takdirde ise aylarca hatta yıllarca port yok diye size oyalarlar. Maalesef ki Türk Telekom, tekel olmanın verdiği gücü kullanarak, elinden geldiğince hizmet verme konusunda, siz zorla hizmet talep etmedikçe 1 gram bile kıllarını kıpırdatıp hizmet verme tenezzülünde bulunmuyor. Bu sebeple biz de onlardan paket alma tenezzülüne bulunmamaya karar verdik. Şimdi size Türk Telekom alternatifi firmalardan bahsedeceğim.
Alternatif Çözüm Yöntemi
Türk Telekom Alt Yapısı Kullanan Alternatif Firmalar
Eğer İstanbul'da yaşıyorsanız, her ne kadar Türk Telekom alt yapısı kullansa da Türk Telekom'un taahhütlü ve yüksek fiyatlarına maruz kalmamak için sizin için şu firmalardan hizmet almanızı tavsiye ederim :- Net Galaksi
- Türknet
- Millenicom
- Netspeed
Sakın bir yanlış anlaşılma olmasın. Bu firmalardan abonelik alırken de yine Türk Telekom'dan port alma sıkınıtısıyla karşılaşabilirsiniz. Bu firmaları port sorununuzu çözmek için yazmadım. Sadece ucuza internet paketi kullanın diye yazdım. Çünkü bu firmalarada da Türk Telekom alt yapı sağlayıp, port veriyor. Siz bu şirketlerden size uygun olana başvurduktan sonra eğer bu şirketlerden biri size "Türk Telekom bize port atamadığı için internetinizi aktif edemiyoruz" şeklinde dönüş yaparlarsa, artık ne yapacağınızı biliyorsunuz. Yazıda bahsettiğim gibi BTK üzerinden şikayetinizin takipçisi ve ısrarcısı olarak port sorununuzu çözebilirsiniz. BTK üzerinden çözemezseniz araya farklı kurumlar sokarak yada başka kurumlara şikayet ederek o da olmazsa ilçenizdeki Türk Telekom Genel Müdürlüğü'ne giderek orada hakkınıızı arayın.
Ek olarak, Türk Telekom harici listelediğim firmalar İstanbul içi hizmet veriyorlar. İstanbul dışında yaşıyorsanız, kendi şehriniz için internet üzerinden ufak çaplı bir arama yaparak Türk Telekom alternatifi firmaları bulma imkanınız olabilir. Tekrar etmek de fayda var. Bu alternatif firmalar sayesinde sadece daha ucuza ve taahhütsüz internet kullanırsınız. Sadece ilk bağlatma aşamasında Türk Telekom ile yüz göz olmanız gerekebilir o da malum port sorunu vs. gibi sebepler yüzünden. Çünkü bu firmalarda Türk Telekom alt yapısı kullanıyorlar. Hiçbir port sorunu ile karşılaşmadan internet bağlantınız sağlanırsa eğer, kendinizi şanslı hissedebilirsiniz.