Google Interview Süreci Nasıl İşliyor?



#google #interview

Google teknoloji görüşmeleri herkesin bildiği gibi zor ve oldukça zordur. Bir telefon ekranı almak için, özgeçmişinizi çevrimiçi başvuru sistemlerine veya bir Google çalışanının dahili yönlendirmesi yoluyla göndermeniz gerekir.

Özgeçmiş ekranını geçtiğinizi varsayarsak, bir işe alım görevlisi size ulaşacaktır. Genellikle iki telefon ekranı olur ve başarılı olursanız yerinde görüşmelere davet edilirsiniz.

Google geniş bir ölçekte faaliyet gösterdiğinden, yazdığınız algoritmayı birden çok makine için nasıl ölçeklendireceğinizle ilgili birçok soruyu yanıtlamaya hazır olun. Bazı örnekler: Ada Sayısı ve İki Dizinin Kesişimi II .


Mülakat Süreci

Görüşme sürecinin ilk adımı olarak bir çevrimiçi değerlendirme bağlantısı alabilirsiniz. Değerlendirme 7 gün içinde sona erecek ve bir saat içinde tamamlanması gereken iki kodlama sorusu içermektedir. Aşağıda alıştırma yapmanız için bazı Çevrimiçi Değerlendirme soruları bulunmaktadır.

Bu bölümün sonuna doğru, bir Google görüşmesinin farklı aşamaları hakkında daha fazla ayrıntı sağlıyoruz.

 Benzersiz E-posta Adresleri

Çevrimiçi Değerlendirme Sorusu

 Tek Çift Atlama

Çevrimiçi Değerlendirme Sorusu

 Lisans Anahtarı Biçimlendirmesi

Çevrimiçi Değerlendirme Sorusu

 Sepete Meyve

Çevrimiçi Değerlendirme Sorusu

 Google Telefon Görüşmesi

Google Telefon Görüşmesinin Temelleri

 Google Yerinde Görüşme

Google Yerinde Görüşmenin Temelleri

 Google İşe Alma Komitesi

Google İşe Alım Komitesi aşamasının temelleri

 Google Teklif İncelemesi

Google Teklif İnceleme sürecinin temelleri


Google Telefon Görüşmesi


Telefon ekranı genellikle 30 ile 60 dakika arasında sürer.

Telefon görüşmeniz veri yapılarını ve algoritmaları kapsayacaktır. En güçlü dilinizde yaklaşık 20-30 satır kod yazmaya hazır olun. Bu temiz, zengin, sağlam bir kod olmalıdır.

Görüşmeciniz, pek çok takip sorusu içeren bir veya iki kodlama sorusu soracaktır. Görüşmecinizle paylaşacağınız bir Google Dokümanına kod yazarken düşünce süreciniz üzerinden konuşmaya hazır olun. Serbestçe yazabilmeniz için eller serbest kulaklık veya hoparlör kullanmanızı öneririz.

Size açık uçlu bir soru sorulacak. Açıklayıcı sorular sorun, gereksinimler belirleyin.

Bunu bir algoritma ile açıklamanız istenecektir.

Çalışabilir bir koda dönüştürün.

(İpucu: Zaman sınırlı olduğu için mükemmel hale getirme konusunda endişelenmeyin. Neyin geldiğini yazın ama sonra düzeltin. Ayrıca köşe kasaları ve kenar kasaları, üretime hazır olarak değerlendirdiğinizden emin olun.)

Kodu optimize edin, test durumlarıyla takip edin ve hataları bulun.

Google Telefon Görüşmesi

Rapor bildir

Budur! Telefon görüşmelerini geçtiniz ve şimdi bir yerinde görüşme daveti aldınız. Yerinde görüşme, bir Google görüşmesinin en önemli sürecidir ve bir teklif alma beceriniz büyük ölçüde yerinde görüşmeler sırasındaki performansınıza bağlı olacaktır. Geleneksel olarak, yerinde görüşmeden sonra teklif alacak adayların yüzdesi yaklaşık 5'te 1 ila 7'de 1'dir .

Genellikle beş Google çalışanıyla her biri yaklaşık 30 ila 45 dakika görüşeceksiniz ve bunlardan biri öğle yemeği görüşmeciniz olacak ve görüşme geri bildirimi göndermeyecek, bu nedenle bu fırsatı özgürce soru sormak için kullanın.

Tüm adaylar dört farklı alanda güçlü yanlarını öne çıkarma şansına sahip olacak:

Genel bilişsel yetenek: Sorunlara nasıl yaklaştığınızı ve çözdüğünüzü öğrenmek için açık uçlu sorular sorulur. Ve tek bir doğru cevap yok; düşünce sürecinizi açıklama beceriniz ve kararları bilgilendirmek için verileri nasıl kullandığınız en önemli şeydir.

Liderlik: Başkalarını harekete geçirmek için iletişim ve karar verme becerilerinizi nasıl kullandığınızı tartışmaya hazır olun. Bu, işte veya bir kuruluşta liderlik rolüne adım atarak veya resmi olarak lider olmasanız bile bir ekibin başarılı olmasına yardımcı olarak olabilir.

Rol ile ilgili bilgi: Google, etki yaratmak için bireysel güçlü yanlarınızın deneyiminizle nasıl birleştiğiyle ilgilenir. Google, yalnızca bugün nasıl katkıda bulunabileceğinizi değil, henüz icat edilmemiş olanlar da dahil olmak üzere farklı rollere nasıl dönüşebileceğinizi araştırır.

Googleyness: Bireysel olarak ve ekip olarak nasıl çalıştığınızı, başkalarına nasıl yardım ettiğinizi, belirsizliği nasıl aştığınızı ve konfor alanınızın dışına çıkmak için kendinizi nasıl zorladığınızı paylaşın.

İş deneyiminiz ne olursa olsun , Google'ın analitik yeteneğinize büyük önem verdiğini unutmayın . Veri yapılarının ve algoritmaların sağlam bir şekilde anlaşıldığını sergilemeye hazır olun. Sektörde yılların deneyimine sahipseniz ve Bilgisayar Bilimi temellerinizde paslanmışsanız, temel CS temel becerilerinizi geliştirmek için daha fazla zaman ayırın. Aksi takdirde, bir ikili ağacı tersine çeviremediğiniz için Max Howell gibi reddedilebilirsiniz .

Google, kodlama becerilerinizi ve araçlar veya programlama dilleri dahil olmak üzere teknik uzmanlık alanlarınızı ve veri yapıları ve algoritmalar gibi konularda genel bilgileri anlamak istiyor. Bu tartışmalarda genellikle bir miktar ileri geri vardır, tıpkı işte birbirlerinin düşüncelerini zorlamak ve farklı yaklaşımlar hakkında bilgi edinmek gibi. Bu nedenle, çözümlerinizi derinlemesine konuşmaya hazır olun. Kendi sınırlarınızı zorlayın ve en iyi yanıtı bulun; muhtemelen zaten böyle çalışıyorsunuz.

Google'da teknik yerinde görüşmeler, geçmişte beyaz tahtalarda gerçekleştiriliyordu, ancak daha az zaman alan daha özgün bir kodlama deneyimi sağlamak için Google, bazı sitelerde kodlama görüşmeleri için dizüstü bilgisayarlar sunmaya başladı. Bu chromebook'larda, tercih ettiğiniz kodlama dilini seçmenize izin veren bir görüşme uygulaması bulunur.

Görüşme süreci boyunca, sorularını tam olarak anladığınızdan emin olmak için görüşmecilerden açıklama istemekten çekinmeyin.


Google İşe Alma Komitesi


Yerinde görüşmeden sonra, görüşmecilerinizin her birinin (öğle yemeği görüşmecisi hariç) ayrıntılı görüşme geri bildirimi göndermesi gerekecektir. Birinin geri bildiriminin diğerlerini etkilememesini sağlamak için her görüşmecinin geri bildirimi diğer görüşmecilerden gizli tutulur. Her görüşmeci bir puan atayacak ve İşe Al / İşe Almama kararı verecektir.

Geri bildirimden alınan puanların yeterince iyi olduğunu varsayarsak, tüm paketiniz incelenmek üzere işe alım komitesine iletilecektir.

İşe alım komitesi, gönderilen tüm geri bildirimleri kapsamlı bir şekilde inceleyecek ve bir işe alma / işe almama tavsiyesi verecektir.


Google Teklif İncelemesi


İşe Alma Komitesi kiralamayı önerirse, tebrikler! Sürecin son aşamasına geldiniz. Bu aşamada uzatılmamış teklifler yaklaşık % 10-12 aday var. İşveren, Dış Referanslar ve Tazminat Geçmişi ister, referans kontrolleri yapar ve Teklif İnceleme Süreci için bir paket hazırlar.

Teklif İnceleme süreci:

Ön İnceleme Komitesi

Tazminat Komitesi İncelemesi

Kıdemli Başkan Yardımcısı İncelemesi

Son SVP incelemesinde teklifin onaylanmama ihtimali küçük bir yüzdedir .


Veri Bilimi Neden Geleceğin Bilimi? - Veri Bilimi Hakkında Her Şey @istanbuldatascienceacademy938

 



“Veri Bilimi Nedir? Veri Mühendisliği, Analitiği, Madenciliği vs. nelerdir, bu alanlardaki meslekler neler? Yeni başlayanlar nereden başlamalı?” gibi soruları ve çok daha fazlasını canlı yayında konuşacağız. Şimdiden takvimlerinizi ayarlayın.

Gündem Teknoloji - ChatGPT Yapay Zeka Teknolojileri Şirketlere Nasıl Fayda Sağlayacak | 19 Ocak 2023

 



Performans ile ilgili notlarım (Network, CPU, Ram, DB )

Bir uygulama mimarisinde performans için nelere bakmalıyım?

Uygulama performansı, uygulama mimarisi ve uygulama tasarımı gibi birçok faktörden etkilenir. Uygulama performansını iyileştirmek için, aşağıdaki konulara dikkat etmeniz

önerilir:

Ölçeklenebilirlik: Uygulamanızın ölçeklenebilir olması gerekir. Bu, uygulamanızın yüksek talep dönemlerinde bile hızlı ve verimli bir şekilde çalışabileceği anlamına gelir. Ölçeklenebilir bir uygulama tasarlamak için, yüksek talep dönemlerinde kullanılan donanım ve yazılım kaynaklarının kullanımını optimize etmelisiniz.


Veritabanı Tasarımı: Veritabanı tasarımı, uygulama performansı için önemlidir. İyi bir veritabanı tasarımı, veritabanının hızlı, güvenilir ve ölçeklenebilir olmasını sağlar. Ayrıca, uygulamanın veri işleme işlemlerini optimize etmek için indeksleme ve normalleştirme gibi teknikleri kullanabilirsiniz.


Cache Kullanımı: Cache kullanımı, uygulama performansını artırmanın bir başka yolu. Uygulamanızın sık kullanılan verileri, önbelleğe alarak erişim hızını artırabilirsiniz. Bu, uygulamanın daha hızlı yanıt vermesine ve daha iyi bir kullanıcı deneyimi sağlamasına yardımcı olur.


Yüksek Kullanılabilirlik: Yüksek kullanılabilirlik, uygulamanın her zaman kullanılabilir olmasını sağlamak için alınacak önlemleri içerir. Bu, sunucu yedekleme, yük dengeleme, veritabanı yedekleme, güvenlik ve diğer teknikleri içerir. Yüksek kullanılabilirlik, uygulama performansının iyileştirilmesine yardımcı olur, çünkü kullanıcıların uygulamaya her zaman erişebilmeleri gerekir.


Teknoloji Seçimi: Uygulama performansı, teknoloji seçimine de bağlıdır. Doğru teknolojileri seçerek, uygulamanın hızlı ve verimli çalışmasını sağlayabilirsiniz. Ayrıca, uygulamanın ölçeklenebilirliğini de artırabilirsiniz.


Kod Kalitesi: Kod kalitesi, uygulama performansını etkileyen en önemli faktörlerden biridir. İyi bir kod yazmak, uygulamanın daha hızlı ve daha az hata ile çalışmasını sağlar. Ayrıca, kodunuzda gereksiz işlemleri ortadan kaldırmak, uygulamanın daha hızlı çalışmasına yardımcı olur.


Bir java uygulamasında performans için nelere bakmalıyım?





Java uygulamaları, performans açısından bazı özel dikkat gerektiren bir programlama dilidir. Java uygulamalarınızın performansını iyileştirmek için aşağıdaki konulara dikkat etmeniz önerilir:

Bellek Kullanımı: Java uygulamaları, otomatik bellek yönetimi özelliği nedeniyle özellikle bellek kullanımı açısından dikkatli bir şekilde tasarlanmalıdır. Bellek tüketimini optimize etmek için, kullanılmayan nesnelerin zamanında bellekten temizlenmesini sağlamalısınız. Ayrıca, programınızda gereksiz nesneleri yaratmamaya da özen göstermelisiniz.


Multithreading: Multithreading, Java uygulamaları için önemli bir performans artırıcıdır. Eşzamanlılık ve paralelleştirme özelliği sayesinde uygulamanızın performansını artırabilirsiniz. Ancak, multithreading kodu karmaşık hale getirebilir ve hatalara neden olabilir. Bu nedenle, multithreading kodunuzun kalitesini ve doğruluğunu iyileştirmeye özen gösterin.


Koleksiyonlar: Java koleksiyonları, veri yapıları için önemli bir araçtır. Ancak, bazı koleksiyon türleri performans açısından daha iyi olabilir. Örneğin, ArrayList gibi sıralı bir veri yapısı kullanmak, veriye erişim hızını artırabilir. Ayrıca, Java koleksiyonlarının boyutunu önceden belirlemek, performansı da artırabilir.


Garbage Collection: Java, bellek yönetimi için otomatik çöp toplama işlevi sunar. Ancak, bu özellik performans açısından maliyetli olabilir. Bu nedenle, uygulamanızın bellek tüketimini minimize etmek için kullanılmayan nesneleri zamanında temizlemelisiniz.


JIT Derleyici: Java'nın Just-In-Time (JIT) derleyicisi, kodun çalışma zamanında derlenmesini sağlar. JIT derleyici, uygulamanın çalışma hızını artırır. Ancak, JIT derleyici kodun doğruluğunu etkileyebilir. Bu nedenle, JIT derleyiciyi kullanmadan önce, uygulamanızın doğruluğunu test etmelisiniz.


Veritabanı Bağlantısı: Veritabanı bağlantısı, uygulama performansı için önemli bir faktördür. Veritabanı sorgularını optimize etmek için, uygun indeksleme tekniklerini ve hazırlanmış ifadeleri kullanabilirsiniz. Ayrıca, veritabanı bağlantılarını gereksiz yere açık bırakmamaya da özen göstermelisiniz.


Daha fazla detay verebilir misin?


Elbette! Java uygulama performansını değerlendirmek ve geliştirmek için daha fazla detay şunları içerebilir:

Zamanlama: Uygulamanızın hangi bölümlerinin daha uzun süre aldığını ve hangi bölümlerinin daha az zaman aldığını ölçün. Bu, uygulamanın hangi bölümlerinin optimize edilmesi gerektiğini anlamak için önemlidir. Bu ölçümler, uygulamanın zamanlamasını ölçmek için kullanabileceğiniz araçlar veya JVM'in sunduğu birçok ölçümleme aracı ile alınabilir.


Bellek Yönetimi: Java, bellek yönetimi için otomatik bir sistem sunar. Ancak, bellek yönetimi ile ilgili sorunlar uygulama performansını etkileyebilir. Bellek sızıntılarına veya yetersiz bellek kullanımına neden olan kodu tespit etmek ve gidermek önemlidir. Bu amaçla, JVM'in sunduğu araçları kullanabilirsiniz.


Thread Yönetimi: Thread yönetimi, performans açısından kritik bir faktördür. Thread'ler, birden fazla görevin eş zamanlı olarak yürütülmesini sağlar ve performansı artırır. Ancak, yanlış kullanımı veya fazla sayıda thread kullanımı uygulamanın performansını olumsuz yönde etkileyebilir. Thread yönetiminde en iyi uygulamaları kullanarak, thread sayısını ve kullanımını optimize edebilirsiniz.


I/O İşlemleri: I/O işlemleri, uygulama performansını önemli ölçüde etkileyebilir. Bu nedenle, dosya okuma/yazma işlemleri, veritabanı sorguları ve diğer I/O işlemleri optimize edilmelidir. Bu işlemleri optimize etmek için, ara belleklemeyi, giriş/çıkış işlemlerini sıralamayı ve asenkron I/O işlemlerini kullanmayı düşünebilirsiniz.


Veritabanı Etkileşimi: Veritabanı etkileşimi, uygulama performansının en büyük nedenlerinden biridir. Veritabanı tasarımı ve veritabanı sorgularınızı optimize etmek, uygulama performansını artırmanın en iyi yollarından biridir. Veritabanı bağlantı havuzları kullanmak, sorgu optimizasyonunu ve veritabanı tasarımını iyileştirmek performansı artırabilir.


Garbage Collection: Java, otomatik bellek yönetimi ile birlikte gelir. Ancak, otomatik bellek toplama da uygulama performansını etkileyebilir. Büyük nesneleri oluşturmaktan kaçınmak, bellek kullanımını sınırlamak ve uygun bir Garbage


daha da detay verebilir misin?

Tabii, şu detayları da ekleyebilirim:

Kütüphaneler: Kullanılan kütüphaneler uygulama performansı için önemlidir. Güvenilir, performanslı ve güncel kütüphaneler seçmek, uygulama performansını artırmak için önemlidir. Ayrıca, uygulamanızda yalnızca kullanacağınız kütüphaneleri eklemelisiniz. Eğer kullanmadığınız kütüphaneler varsa, uygulamanızı yavaşlatabilirler.


Algoritma ve Veri Yapıları: Uygulamanızdaki algoritmaların ve veri yapılarının performansını etkileyebilir. En iyi algoritmaları ve veri yapılarını kullanarak, uygulama performansını artırabilirsiniz. Ayrıca, büyük veri setleri üzerinde işlem yaparken, algoritma ve veri yapılarına özellikle dikkat etmek gerekmektedir.


Doğru JVM Ayarları: JVM, uygulamanın çalışmasını kontrol eden bir sanal makinedir. JVM ayarları, uygulama performansını önemli ölçüde etkileyebilir. JVM ayarlarını yapılandırarak, uygulama performansını artırabilirsiniz. Bu ayarlar, Java heap boyutu, Garbage Collection zamanlaması ve iş parçacığı havuzu boyutu gibi ayarları içerebilir.


Ölçeklenebilirlik: Uygulamanızın ölçeklenebilirliği de performans açısından önemlidir. Uygulamanızın büyüdükçe performansının da artması gerekiyor. Bu nedenle, uygulamanızın ölçeklenebilirliğini göz önünde bulundurarak tasarlamanız gerekir. Bu amaçla, dağıtılmış sistemler ve bulut tabanlı hizmetler kullanılabilir.


Testler: Uygulama performansının ölçülmesi için testler yapmak önemlidir. Testler, uygulamanın performansını ölçmek ve potansiyel performans sorunlarını tespit etmek için kullanılabilir. Bu amaçla, yük testleri, stres testleri ve diğer performans testleri kullanılabilir.



Sonuç olarak, Java uygulama performansını değerlendirmek ve geliştirmek için birden fazla faktör göz önünde bulundurulmalıdır. Zamanlama, bellek kullanımı, thread yönetimi, I/O işlemleri, veritabanı etkileşimi, garbage collection, kütüphaneler, algoritma ve veri yapıları, doğru JVM ayarları, ölçeklenebilirlik ve testler bu faktörlerin bazılarıdır.şu detayları da ekleyebilirim:

Kütüphaneler: Kullanılan kütüphaneler uygulama performansı için önemlidir. Güvenilir, performanslı ve güncel kütüphaneler seçmek, uygulama performansını artırmak için önemlidir. Ayrıca, uygulamanızda yalnızca kullanacağınız kütüphaneleri eklemelisiniz. Eğer kullanmadığınız kütüphaneler varsa, uygulamanızı yavaşlatabilirler.


Algoritma ve Veri Yapıları: Uygulamanızdaki algoritmaların ve veri yapılarının performansını etkileyebilir. En iyi algoritmaları ve veri yapılarını kullanarak, uygulama performansını artırabilirsiniz. Ayrıca, büyük veri setleri üzerinde işlem yaparken, algoritma ve veri yapılarına özellikle dikkat etmek gerekmektedir.


Doğru JVM Ayarları: JVM, uygulamanın çalışmasını kontrol eden bir sanal makinedir. JVM ayarları, uygulama performansını önemli ölçüde etkileyebilir. JVM ayarlarını yapılandırarak, uygulama performansını artırabilirsiniz. Bu ayarlar, Java heap boyutu, Garbage Collection zamanlaması ve iş parçacığı havuzu boyutu gibi ayarları içerebilir.


Ölçeklenebilirlik: Uygulamanızın ölçeklenebilirliği de performans açısından önemlidir. Uygulamanızın büyüdükçe performansının da artması gerekiyor. Bu nedenle, uygulamanızın ölçeklenebilirliğini göz önünde bulundurarak tasarlamanız gerekir. Bu amaçla, dağıtılmış sistemler ve bulut tabanlı hizmetler kullanılabilir.


Testler: Uygulama performansının ölçülmesi için testler yapmak önemlidir. Testler, uygulamanın performansını ölçmek ve potansiyel performans sorunlarını tespit etmek için kullanılabilir. Bu amaçla, yük testleri, stres testleri ve diğer performans testleri kullanılabilir.

Sonuç olarak, Java uygulama performansını değerlendirmek ve geliştirmek için birden fazla faktör göz önünde bulundurulmalıdır. Zamanlama, bellek kullanımı, thread yönetimi, I/O işlemleri, veritabanı etkileşimi, garbage collection, kütüphaneler, algoritma ve veri yapıları, doğru JVM ayarları, ölçeklenebilirlik ve testler bu faktörlerin bazılarıdır.
#network #performance
Network için performance artırımları neler olabilir?

Http 1.0'da eklenti ile yapılan, ama daha sonraları persistence connection özelliğinin gelmesiyle bağlantı belli bir süre kalıcı hale getrilebilir. Bu sayede her istekte connection kurmaya gerek kalmaz.

Reverse proxy : Web sunucunun önünde ngnix gibi reverse proxy'ler bulunur. Bu reverse proxy sayesinde gelen isteklerde static bir content isteniyorsa proxy sunucunun cache'inden bu ihtiyaç karşılanır.
Eğer dinamik bir content isteniyorsa proxy sunucusu web sunucuna isteği aktarır ve web sunucusunun dinamik response'unu kullanıcıya iletir. Ayrıca reverse proxy ile web sunucusu arasında firewall bulunabilir.

Restful gibi Http web çağrıları yerine thrift gprc gibi binary çağrılarla network trafiği düşürülebilir.

Veri client-server server-client taraflarında sıkıştırılarak network'deki veri miktarı düşürülebilir. CPU'ya ek yük getirse de bu tolere edilebilecek düzeydedir.


#cpu #memory #performance

Yazdığınız uygulamaların bigO karmaşıklığının efficient olduğuna ve CPU'ya aşırı yük getirmemesine dikkat etmeliyiz.

Thread pool miktarını CPU sayımıza göre orantılı bir şiklde tutmalıyız. Eğer 2 CPU muz varsa 100-200 threadlik bir pool çok fazla context switching yapacağından çok verimsiz olacaktır. 20-30 gibi bir sayıyla makul hale getirmeliyiz.

Yazdığımız uygulamalar memory'de ne kadar az yer kaplarsa o kadar iyidir. 50 GB JVM memory'miz var diye 40 GB 'lık bir uygulama yazmamalıyız. Çünkü memorydeki bu veriler (heap) süreki garbage collectorler tarafından taranacak ve eğer çok olursa uygulamamız sürekli kesintiye gidecektir.

Doğru garbage collection algoritması ve implemantasyonu seçmeliyiz. Batch gibi işlemlerde belli süre işlem yapılıp ardından garbage collection toplu çalıştırırken, web sunucuları gibi response time'ı küçük olan anında cevap veren sistemlerde garbage collection user thread'lere paralel bir şekilde çalışmalıdır.

Uygulamamızda gerektiği kadar memory olmalıdır. Sabit diski memory olarak kullanmak latency açısından pahalıdır.

#db #performance #denormalization #connectionpool #indexing #queryoptimization

Db'de sorgularımız mümkün olduğunca az veri kümesi üzerinden işlem yapmalıdır. Bu noktada query optimizasyonu önemlidir.

Join işlemleri bir kaç tablo üzerinde işlem yaptığından hard disk üzerinde hareketlere sebep olmaktadrır. Eğer yeterince donanımımız (hardware, ram) varsa denormalizasyon yapmak iyidir. Donanım-yazılım dengesini düşündüğümüzde normalizasyonu çok abartmadan optimal bir seviyede de yapabiliriz.

SSD, RAID gibi güncel donanımlar ve teknolojiler kullanabiliriz.

Full table scan yapmamaak için okuma ağırlıklı tablolarda alanlar için index kullanmalıyız. Eğer sıralama sorgularının çok olduğu bir tabloysa ağaç yapısında index, direk erişim sorgusunun çok olduğu bir tabloysa hash yapısında bir index kullanmalıyız.

Prof. Dr. Selçuk Şirin | Candaş Tolga Işık ile Az Önce Konuştum | 10 Ocak 2023

 



Prof. Dr. Selçuk Şirin | Candaş Tolga Işık ile Az Önce Konuştum | 10 Ocak 2023 Candaş Tolga Işık ile Az Önce Konuştum’a bu hafta Araştırmacı-Yazar Prof. Dr. Selçuk Şirin konuk oluyor. Abone ol; dünyadaki ve ülkemizdeki son gelişmelerden ilk senin haberin olsun 🔔 https://www.youtube.com/tv100/?sub_co... Ayrıcalıklardan yararlanmak için bu kanala katılın📢 https://www.youtube.com/channel/UCnds... Türkiye çapında yayın yapan tv100'ün canlı yayınını YouTube üzerinden her zaman canlı olarak izleyebilirsiniz. www.tv100.com tv100 Canlı Yayın İzle ➤ https://youtu.be/8jEXHzMTR7s TV100 frekans bilgileri TÜRKSAT SD FORMAT Frekans: 11916 Sembol: 30000 Polarizasyon: V (Dikey) TÜRKSAT HD FORMAT Frekans: 12729 Sembol: 30000 Polarizasyon: V (Dikey) tv100 Kablo TV, DIGITURK, Turkcell TV+ ve DSMART platformlarında da 37. kanaldan, Tivibu 47. kanaldan izlenebilir. Facebook: https://www.facebook.com/tv100com/ Twitter: https://twitter.com/tv100 Instagram: https://www.instagram.com/tv.100/?hl=tr Youtube: https://www.youtube.com/tv100 #SonDakika #Gündem #Haber

Refactoring Kitabından Yer Alan Teknikler ve Açıklamaları (Kod Örnekleri İle)- OpenAI

"Refactoring: Improving the Design of Existing Code" (Tasarımı Mevcut Kodun İyileştirilmesi olarak çevrilebilir), Martin Fowler tarafından yazılmış bir kitaptır. Bu kitap, mevcut kodun tasarımını iyileştirmeye yönelik teknikleri anlatır. Kitap, kodu düzenlemeyi ve iyileştirmeyi kolaylaştıran adımları adım adım anlatır ve okuyuculara nasıl daha verimli kod yazabileceklerini öğretir. Kitap ayrıca kodun okunabilirliğini ve anlaşılabilirliğini artırmak için yapılacak değişiklikleri de ele alır.



Kodun okunabilirliğini artırmak için, metodların ve fonksiyonların isimlerini daha anlaşılır hale getirme. Örneğin, "getData" yerine "getCustomerData" gibi daha açıklayıcı bir isim kullanılabilir.


Kodun düzenini iyileştirmeyi hedefleyen "Extract Method" (Metod Çıkar) refactoring tekniği, bir metodun içinde yer alan kod bloğunu ayrı bir metoda çıkararak daha okunabilir hale getirmeyi hedefler. Bu sayede, metodlar daha küçük ve anlaşılır hale gelir ve kodun anlaşılırlığı artar.


void printOwing(double amount) {
  printBanner();

  // print details
  System.out.println("name: " + name);
  System.out.println("amount: " + amount);
}

    

Ayrıntıları yazdıran kodu printDetails adlı ayrı bir yönteme çıkararak bu kodu yeniden düzenleyebilirsiniz:


void printOwing(double amount) {
  printBanner();
  printDetails(amount);
}

void printDetails(double amount) {
  System.out.println("name: " + name);
  System.out.println("amount: " + amount);
}

    

"Encapsulate Field" (Alanı Kapat) refactoring tekniği, bir alanı (değişken) sınıf içinde kapatmayı hedefler. Bu sayede, alanın değerini değiştirmek için kullanılacak metodlar oluşturulur ve böylece alanın direkt olarak erişilememesi sağlanır. Bu teknik, kodun bakımını kolaylaştırır ve hataların önüne geçmeyi hedefler.


class Point {
  public double x;
  public double y;
}
    

x ve y alanlarını kapsülleyerek bu kodu yeniden düzenleyebilirsiniz:


class Point {
  private double _x;
  private double _y;

  public double getX() {
    return _x;
  }

  public void setX(double x) {
    _x = x;
  }

  public double getY() {
    return _y;
  }

  public void setY(double y) {
    _y = y;
  }
}

    
"Extract Class" (Sınıf Çıkar) refactoring tekniği, bir sınıfta yer alan bazı alanları ve metodları ayrı bir sınıfa çıkarmayı hedefler. Bu sayede, sınıflar daha küçük ve anlaşılır hale gelir ve kodun anlaşılırlığı artar.


class Person {
  String name;
  String address;
  String phone;

  String getName() { return name; }
  String getAddress() { return address; }
  String getPhone() { return phone; }

  void setName(String name) { this.name = name; }
  void setAddress(String address) { this.address = address; }
  void setPhone(String phone) { this.phone = phone; }
}

    

Ad, adres ve telefon alanlarını ContactInfo adlı ayrı bir sınıfa çıkararak bu kodu yeniden düzenleyebilirsiniz:


class Person {
  ContactInfo contactInfo;

  String getName() { return contactInfo.getName(); }
  String getAddress() { return contactInfo.getAddress(); }
  String getPhone() { return contactInfo.getPhone(); }

  void setName(String name) { contactInfo.setName(name); }
  void setAddress(String address) { contactInfo.setAddress(address); }
  void setPhone(String phone) { contactInfo.setPhone(phone); }
}

class ContactInfo {
  String name;
  String address;
  String phone;

  String getName() { return name; }
  String getAddress() { return address; }
  String getPhone() { return phone; }

  void setName(String name) { this.name = name; }
  void setAddress(String address) { this.address = address; }
  void setPhone(String phone) { this.phone = phone; }
}

    


"Move Method" (Metod Taşı) refactoring tekniği, bir metodu başka bir sınıfa taşımayı hedefler. Bu sayede, metodun işlevine daha uygun bir sınıf içinde yer alması sağlanır ve kodun düzeni iyileştirilir.


public class Customer {
  private String name;
  private String address;

  public Customer(String name, String address) {
    this.name = name;
    this.address = address;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public boolean isPreferred() {
    // Check if customer is preferred
    // This method doesn't use any of the Customer's fields, so it could be moved to another class
    return true;
  }
}
    

Bu örnekte, Customer sınıfından isPreferred yöntemini yeni bir CustomerUtils sınıfına taşıdık. Bu, Customer sınıfının karmaşıklığının azaltılmasına yardımcı olur ve artık müşteriyle ilgili tüm yardımcı program işlevlerinden sorumlu olan CustomerUtils sınıfının uyumunu geliştirir.


public class Customer {
  private String name;
  private String address;

  public Customer(String name, String address) {
    this.name = name;
    this.address = address;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }
}

public class CustomerUtils {
  public static boolean isPreferred(Customer customer) {
    // Check if customer is preferred
    return true;
  }
}

// Usage
Customer customer = new Customer("John", "123 Main St");
CustomerUtils.isPreferred(customer);
    
"Rename Method" (Metodu Yeniden Adlandır) refactoring tekniği, bir metodun adını değiştirmeyi hedefler. Bu sayede, metodun işlevine daha uygun bir ad verilebilir ve kodun anlaşılırlığı artar.


   ShoppingCart adlı bir sınıfta hesaplaCost() adlı bir yönteminiz olduğunu ve amacını daha iyi yansıtması için onu getTotalCost() olarak yeniden adlandırmak istediğinizi hayal edin. Bu yeniden düzenlemeyi şu şekilde gerçekleştirebilirsiniz: HesaplaMaliyet()'in tüm oluşumlarını bulmak için metin düzenleyicinizin arama işlevini kullanın. Yöntemin imzasını bir yere not edin: public double measureCost(). Yeni adı kullanmak için yöntem bildirimini güncelleyin: public double getTotalCost(). Yeni adı kullanmak için yönteme yapılan tüm başvuruları güncelleyin. Örneğin, çift maliyet = cart.calculateCost(); yazan bir kod satırınız varsa, bunu çift maliyet = cart.getTotalCost(); olarak değiştirirsiniz. Yeniden düzenlemenin herhangi bir hata veya soruna yol açmadığından emin olmak için kodunuzu test edin. Değişiklikleri geri almanız gerekebileceğinden, herhangi bir yeniden düzenleme yapmadan önce kodunuzun yedeğini almak her zaman iyi bir fikirdir. 
    
"Inline Method" (Metodu İçe Aktar) refactoring tekniği, bir metodun içeriğini çağrıldığı yere kopyalayarak metodun kullanımını ortadan kaldırmayı hedefler. Bu sayede, kodun okunabilirliği artar ve daha anlaşılır hale gelir.

class Circle {
  double radius;

  double area() { return Math.PI * radius * radius; }
}

class Main {
  void printArea(Circle c) {
    System.out.println(c.area());
  }
}

    

Alan yöntemini satır içine alarak bu kodu yeniden düzenleyebilirsiniz:


class Circle {
  double radius;
}

class Main {
  void printArea(Circle c) {
    System.out.println(Math.PI * c.radius * c.radius);
  }
}

    

"Extract Interface" (Arayüz Çıkar) refactoring tekniği, bir sınıftaki metodları ve alanları ayrı bir arayüze çıkarmayı hedefler. Bu sayede, sınıfın işlevine daha uygun bir arayüz oluşturulur ve bu arayüzü implemente eden sınıfların daha anlaşılır hale gelmesi sağlanır. Ayrıca, bu teknik sayesinde sınıflar arasında daha esnek bir bağlantı oluşturulur ve kodun bakımı kolaylaşır.


public class ShoppingCart {
  public double calculateTotalCost() { ... }
  public double applyDiscount(double discount) { ... }
  // Other methods specific to ShoppingCart
}

    

Arayüzü oluşturun ve yöntemleri arayüze taşıyın:


public interface PricingCalculator {
  double calculateTotalCost();
  double applyDiscount(double discount);
}

public class ShoppingCart implements PricingCalculator {
  public double calculateTotalCost() { ... }
  public double applyDiscount(double discount) { ... }
  // Other methods specific to ShoppingCart
}

    
"Introduce Parameter Object" (Parametre Nesnesi Ekle) refactoring tekniği ise, bir metodun çok sayıda parametresini bir nesne içinde toplamayı hedefler. Bu sayede, metodun okunabilirliği artar ve daha anlaşılır hale gelir. Ayrıca, bu teknik sayesinde parametreler arasında daha kolay bir ilişki kurulur ve kodun bakımı kolaylaşır.

public class CostCalculator {
  public static double calcCost(double price, double taxRate, double discount) {
    double cost = price + (price * taxRate) - discount;
    return cost;
  }
}
    

params parametre nesnesini tanıtarak bu kodu yeniden düzenleyebilirsiniz:


public class CostCalculator {
  public static class Parameters {
    private final double price;
    private final double taxRate;
    private final double discount;

    public Parameters(double price, double taxRate, double discount) {
      this.price = price;
      this.taxRate = taxRate;
      this.discount = discount;
    }
  }

  public static double calcCost(Parameters params) {
    double cost = params.price + (params.price * params.taxRate) - params.discount;
    return cost;
  }
}

// Usage
CostCalculator.Parameters params = new CostCalculator.Parameters(100, 0.1, 10);
CostCalculator.calcCost(params);
    
"Replace Conditional with Polymorphism" (Polimorfizm ile Koşullu İfadeyi Değiştir) refactoring tekniği ise, bir koşullu ifadenin yerine polimorfizmi kullanmayı hedefler. Bu sayede, koşullu ifadelerden daha okunabilir ve anlaşılır bir kod yazılır. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.

public class Employee {
  private String name;
  private int salary;
  private String type;

  public Employee(String name, int salary, String type) {
    this.name = name;
    this.salary = salary;
    this.type = type;
  }

  public int payAmount() {
    if (type.equals("Manager")) {
      return salary + 1000;
    } else if (type.equals("Supervisor")) {
      return salary + 500;
    } else {
      return salary;
    }
  }
}

    

Bu örnekte, payAmount yöntemindeki koşullu ifadeyi polimorfizm ile değiştirdik. Bunu, Çalışan sınıfını soyut bir sınıfa çıkararak ve payAmount yöntemini geçersiz kılan üç somut alt sınıf (Yönetici, Süpervizör ve NormalEmployee) oluşturarak yaptık. Bu, kodun okunmasını ve anlaşılmasını kolaylaştırır, çünkü her durum kendi alt sınıfında işlenir ve ayrıca yalnızca alt sınıfları eklemeniz veya kaldırmanız gerektiğinden, durum eklemeyi veya kaldırmayı kolaylaştırır.


public abstract class Employee {
  protected String name;
  protected int salary;

  public Employee(String name, int salary) {
    this.name = name;
    this.salary = salary;
  }

  public abstract int payAmount();
}

public class Manager extends Employee {
  public Manager(String name, int salary) {
    super(name, salary);
  }

  @Override
  public int payAmount() {
    return salary + 1000;
  }
}

public class Supervisor extends Employee {
  public Supervisor(String name, int salary) {
    super(name, salary);
  }

  @Override
  public int payAmount() {
    return salary + 500;
  }
}

public class RegularEmployee extends Employee {
  public RegularEmployee(String name, int salary) {
    super(name, salary);
  }

  @Override
  public int payAmount() {
    return salary;
  }
}

// Usage
Employee employee = new Manager("John", 100000);
System.out.println(employee.payAmount());

employee = new Supervisor("Jane", 80000);
System.out.println(employee.payAmount());

employee = new RegularEmployee("Bob", 70000);
System.out.println(employee.payAmount());
    

"Collapse Hierarchy" (Hiyerarşiyi Birleştir) refactoring tekniği, bir hiyerarşideki benzer sınıfları birleştirmeyi hedefler. Bu sayede, hiyerarşi daha az katmandan oluşur ve kodun okunabilirliği artar. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


public abstract class Shape {
  protected String color;

  public Shape(String color) {
    this.color = color;
  }

  public abstract double getArea();
}

public class Rectangle extends Shape {
  private double width;
  private double height;

  public Rectangle(String color, double width, double height) {
    super(color);
    this.width = width;
    this.height = height;
  }

  @Override
  public double getArea() {
    return width * height;
  }
}
    

Bu örnekte, genişlik ve yükseklik alanlarını Shape sınıfına taşıyarak ve getArea yöntemini tanımlamak için anonim bir iç sınıf kullanarak Rectangle sınıfını Shape sınıfına daralttık. Bu, Rectangle sınıfına ve onunla ilişkili oluşturucuya olan ihtiyacı ortadan kaldırarak kod tabanının karmaşıklığını azaltmaya yardımcı olur.


public abstract class Shape {
  protected String color;
  protected double width;
  protected double height;

  public Shape(String color, double width, double height) {
    this.color = color;
    this.width = width;
    this.height = height;
  }

  public abstract double getArea();
}

// Usage
Shape rectangle = new Shape("Red", 10, 20) {
  @Override
  public double getArea() {
    return width * height;
  }
};
    
"Form Template Method" (Şablon Metod Oluştur) refactoring tekniği, bir sınıfın metodlarının şablon metod olarak yapılandırılmasını hedefler. Bu sayede, metodlar arasında benzerlikler varsa bu benzerlikleri ortaya çıkaran şablon metod oluşturulur ve böylece kodun okunabilirliği artar. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir. "Form Template Method" refaktoring tekniği, bir sınıf içinde yer alan yöntemlerin çalışma şeklini tasarlamayı amaçlar. Bu teknik ile, bir yöntem içinde yer alan adım adım işlemlerin özelleştirilebilir olan kısımlarını bir alt yönteme taşıyarak bu işlemlerin çalışma şeklini tasarlamaya çalışılır. Bu sayede, aynı şekilde çalışan yöntemlerin tekrarını önlemek ve kodun daha okunabilir hale gelmesi amaçlanır. Örneğin, aşağıdaki sınıftaki "calculateTotalPrice" yöntemini "Form Template Method" refaktoring tekniği ile değiştirmeye çalışalım:


public class Order {
  public double calculateTotalPrice() {
    double basePrice = getBasePrice();
    double tax = basePrice * getTaxRate();
    return basePrice + tax;
  }
  
  public double getBasePrice() { ... }
  public double getTaxRate() { ... }
}
    
    

Bu şekilde, "calculateTotalPrice" yönteminde yer alan "getBasePrice" ve "getTaxRate" yöntemleri özelleştirilebilir hale getirilmiş ve "Order" sınıfından türetilen "BasicOrder" ve "PremiumOrder" sınıflarında bu yöntemlerin nasıl çalışacağı belirlenmiştir. Bu sayede, aynı şekilde çalışan yöntemlerin tekrarı önlendi ve kodun daha okunabilir hale gelmesi sağlandı.


public abstract class Order {
  public double calculateTotalPrice() {
    double basePrice = getBasePrice();
    double tax = basePrice * getTaxRate();
    return basePrice + tax;
  }
  
  protected abstract double getBasePrice();
  protected abstract double getTaxRate();
}

public class BasicOrder extends Order {
  @Override
  protected double getBasePrice() {
    // Return the base price for a basic order
  }
  
  @Override
  protected double getTaxRate() {
    // Return the tax rate for a basic order
  }
}

public class PremiumOrder extends Order {
  @Override
  protected double getBasePrice() {
    // Return the base price for a premium order
  }
  
  @Override
  protected double getTaxRate() {
    // Return the tax rate for a premium order
  }
}
    
    
"Replace Constructor with Factory Method" (Fabrika Metodu ile Yapıcıyı Değiştir) refactoring tekniği, bir sınıfın yapıcı metodunu bir fabrika metodu ile değiştirmeyi hedefler. Bu sayede, sınıfın örneklerinin oluşturulma işlemi daha esnek hale getirilir ve kodun bakımı kolaylaşır.


public class Rectangle {
  private double width;
  private double height;
  
  public Rectangle(double width, double height) {
    this.width = width;
    this.height = height;
  }
  
  public static Rectangle createSquare(double sideLength) {
    return new Rectangle(sideLength, sideLength);
  }
  
  public double getArea() {
    return width * height;
  }
}
    
    

Bu şekilde, "Rectangle" sınıfının yapıcı yöntemlerinden birini kullanarak kare bir dikdörtgen oluşturabilmesi sağlandı.

"Extract Subclass" (Alt Sınıf Çıkar) refactoring tekniği, bir sınıftan benzer özellikleri paylaşan alt sınıflar oluşturmayı hedefler. Bu sayede, sınıflar daha anlaşılır hale getirilir ve kodun okunabilirliği artar. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


public class Person {
  private String name;
  private boolean isEmployee;
  private boolean isStudent;
  
  public Person(String name, boolean isEmployee, boolean isStudent) {
    this.name = name;
    this.isEmployee = isEmployee;
    this.isStudent = isStudent;
  }
  
  public String getName() {
    return name;
  }
  
  public boolean isEmployee() {
    return isEmployee;
  }
  
  public boolean isStudent() {
    return isStudent;
  }
}

    

"Person" sınıfını "Employee" ve "Student" alt sınıflarına taşıyarak aşağıdaki gibi değiştirebiliriz: Bu şekilde, "Employee" ve "Student" sınıfları "Person" sınıfındaki "name" özelliğini ve "getName" yöntemini kalıtır ve bu sayede ortak özellikleri ve işlemleri paylaşan nesnelerin kod tekrarı önlendi ve kod daha okunabilir hale getirildi.


public abstract class Person {
  protected String name;
  
  public Person(String name) {
    this.name = name;
  }
  
  public String getName() {
    return name;
  }
}

public class Employee extends Person {
  public Employee(String name) {
    super(name);
  }
}

public class Student extends Person {
  public Student(String name) {
    super(name);
  }
}

    
"Replace Method with Method Object" (Metod Nesnesi ile Metodu Değiştir) refactoring tekniği, bir metodu bir metod nesnesine dönüştürmeyi hedefler. Bu sayede, metodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.

Öncelikle, hangi yöntemlerin bir yöntem nesnesi ile değiştirilmesi gerektiğini belirleyin. Örneğin, aşağıdaki sınıftaki "calculateTotalPrice" yöntemini bir yöntem nesnesi ile değiştirmek istiyoruz:

public class Order {
  public double calculateTotalPrice() {
    double basePrice = getBasePrice();
    double tax = basePrice * getTaxRate();
    return basePrice + tax;
  }
  
  public double getBasePrice() { ... }
  public double getTaxRate() { ... }
}

    

Yöntemi bir yöntem nesnesi ile değiştirin:


public class Order {
  public double calculateTotalPrice() {
    return new CalculateTotalPriceMethodObject().calculate();
  }
  
  private class CalculateTotalPriceMethodObject {
    double calculate() {
      double basePrice = getBasePrice();
      double tax = basePrice * getTaxRate();
      return basePrice + tax;
    }
  }
  
  public double getBasePrice() { ... }
  public double getTaxRate() { ... }-
}

    

"Replace Type Code with Subclasses" (Alt Sınıflar ile Tür Kodunu Değiştir) refactoring tekniği, bir tür kodunun yerine alt sınıflar kullanılmasını hedefler. Bu sayede, kodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


    
    



    
    
"Replace Type Code with State/Strategy" (Durum/Strateji ile Tür Kodunu Değiştir) refactoring tekniği, bir tür kodunun yerine durum veya strateji kullanılmasını hedefler. Bu sayede, kodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


    
    

to


    
    
"Replace Subclass with Fields" (Alanlar ile Alt Sınıfı Değiştir) refactoring tekniği, bir alt sınıfı alanlarla değiştirmeyi hedefler. Bu sayede, kodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.

    
    
to


    
    

"Replace Inheritance with Delegation" (Devralma ile Mirası Değiştir) refactoring tekniği, bir sınıfın işlevlerini bir başka sınıfta barındıran bir sınıf oluşturarak miras yerine devralmayı hedefler. Bu sayede, kodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


    
    
to


    
    
"Introduce Null Object" (Boş Nesne Ekle) refactoring tekniği, bir nesnenin null değerine sahip olma ihtimaline karşı bir boş nesne oluşturarak kodun çalışmasını sağlamayı hedefler. Bu sayede, kodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


    
    



    
    
"Introduce Assertion" (Varsayım Ekle) refactoring tekniği, bir sınıfın işlevlerinin doğruluğunu test etmek için varsayımlar eklemeyi hedefler. Bu sayede, kodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.

    
    



    
    

"Convert Iterator to Visitor" (Ziyaretçiye İteratörü Dönüştür) refactoring tekniği, bir yapıdaki elemanları ziyaret eden bir ziyaretçi oluşturarak iteratörleri ziyaretçilere dönüştürmeyi hedefler. Bu sayede, kodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


    
    



    
    
"Convert Observable to Observer" (Gözlemciye Gözlemleyici Dönüştür) refactoring tekniği, bir gözlemleyicinin bir olayı gözlemleyip bu olaya uygun bir işlem yaptıran bir gözlemleyici oluşturarak gözlemleyicilere dönüştürmeyi hedefler. Bu sayede, kodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


    
    



    
    
"Convert Collection to List/Set/Map" (Liste/Küme/Harita'ya Koleksiyonu Dönüştür) refactoring tekniği, bir koleksiyonun işlevlerini bir liste, bir küme veya bir harita gibi bir yapıda daha uygun bir şekilde gerçekleştirmeyi hedefler. Bu sayede, kodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.

    
    



    
    
"Change Unidirectional Association to Bidirectional" (Tek Yönlü İlişkiyi Çift Yönlü İlişkiye Dönüştür) refactoring tekniği, iki sınıf arasındaki tek yönlü ilişkiyi çift yönlü ilişkiye dönüştürmeyi hedefler. Bu sayede, ilişkiler daha anlaşılır hale getirilir ve kodun okunabilirliği artar. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


    
    



    
    
"Replace Array with Object" (Nesne ile Diziyi Değiştir) refactoring tekniği, bir dizinin yerine bir nesne kullanmayı hedefler. Bu sayede, kodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


class Order {
  private String[] _items;

  public String getItem(int index) {
    return _items[index];
  }

  public void setItem(int index, String item) {
    _items[index] = item;
  }
}

    
_items dizisini bir Items nesnesiyle değiştirerek bu kodu yeniden düzenleyebilirsiniz:


class Order {
  private Items _items;

  public String getItem(int index) {
    return _items.get(index);
  }

  public void setItem(int index, String item) {
    _items.set(index, item);
  }
}

class Items {
  private String[] _items;

  public String get(int index) {
    return _items[index];
  }

  public void set(int index, String item) {
    _items[index] = item;
  }
}

    
"Duplicate Observed Data" (Gözlenen Veriyi Kopyala) refactoring tekniği, bir nesnenin gözlenen verisini başka bir nesnenin özelliği olarak kopyalama işlemini hedefler. Bu sayede, kodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


    
    



    
    
"Encapsulate Field" (Alanı Kapsülle) refactoring tekniği, bir alanı kapsüllemeyi hedefler. Bu sayede, alanın kullanımı daha kolay hale getirilir ve kodun okunabilirliği artar. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


    
    



    
    
"Encapsulate Collection" (Koleksiyonu Kapsülle) refactoring tekniği, bir koleksiyonu kapsüllemeyi hedefler. Bu sayede, koleksiyonun kullanımı daha kolay hale getirilir ve kodun okunabilirliği artar. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.


    
    



    
    
"Extract Superclass" refaktoring tekniğini daha detaylı bir Java kod örneğiyle açıklamaya çalışacağım: Öncelikle, hangi sınıfların ortak özelliklerini bir süper sınıfa taşımak istediğinizi belirleyin. Örneğin, aşağıdaki iki sınıfın "getName" ve "getAddress" yöntemlerini bir "ContactInfo" süper sınıfına taşımak istiyoruz:


public class Customer {
  public String getName() { ... }
  public String getAddress() { ... }
  // Other methods specific to Customer
}

public class Supplier {
  public String getName() { ... }
  public String getAddress() { ... }
  // Other methods specific to Supplier
}

    
Süper sınıfı oluşturun ve yöntemleri süper sınıfa taşıyın:


public class ContactInfo {
  public String getName() { ... }
  public String getAddress() { ... }
}

public class Customer extends ContactInfo {
  // Other methods specific to Customer
}

public class Supplier extends ContactInfo {
  // Other methods specific to Supplier
}

    
"Inline Method" (Metodu İçe Aktar) refactoring tekniği, bir metodun içindeki kodu metodun kullanıldığı yere yerleştirmeyi hedefler. Bu sayede, metodun okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir. Öncelikle, hangi yöntemlerin satır içi olarak değiştirilmesi gerektiğini belirleyin. Örneğin, aşağıdaki sınıftaki "getDiscountPercentage" yöntemini satır içi olarak "calculateDiscount" yöntemine değiştirmek istiyoruz:


public class DiscountCalculator {
  public double calculateDiscount(double amount) {
    return amount * getDiscountPercentage();
  }
  
  public double getDiscountPercentage() {
    // Some complex logic to determine the discount percentage
    return 0.1;
  }
}

    
Yöntemi satır içi olarak değiştirin:


public class DiscountCalculator {
  public double calculateDiscount(double amount) {
    // Some complex logic to determine the discount percentage
    return amount * 0.1;
  }
}

    
"Inline Class" (Sınıfı İçe Aktar) refactoring tekniği, bir sınıfın işlevlerini kullanıldığı yere yerleştirmeyi hedefler. Bu sayede, sınıfın okunabilirliği artar ve daha anlaşılır hale getirilir. Ayrıca, bu teknik sayesinde kodun bakımı kolaylaşır ve hatalar önlenir.

    
    
to


    
    
"Inline Temp" refaktoring tekniğini daha detaylı bir Java kod örneğiyle açıklamaya çalışacağım: Bu teknik, bir yöntem içinde kullanılan geçici değişkenleri satır içi olarak değiştirerek daha okunabilir ve anlaşılır bir yapı oluşturmayı amaçlar. Öncelikle, hangi geçici değişkenlerin satır içi olarak değiştirilmesi gerektiğini belirleyin. Örneğin, aşağıdaki sınıftaki "basePrice" geçici değişkenini satır içi olarak "calculateTotalPrice" yönteminde kullanılacak şekilde değiştirmek istiyoruz:

public class Order {
  public double calculateTotalPrice() {
    double basePrice = getBasePrice();
    return basePrice * getDiscountFactor();
  }
  
  public double getBasePrice() { ... }
  public double getDiscountFactor() { ... }
}

    
Geçici değişkeni satır içi olarak değiştirin:


public class Order {
  public double calculateTotalPrice() {
    return getBasePrice() * getDiscountFactor();
  }
  
  public double getBasePrice() { ... }
  public double getDiscountFactor() { ... }
}

    
"Move Field" refaktoring tekniğini daha detaylı bir Java kod örneğiyle açıklamaya çalışacağım: Bu teknik, bir sınıftaki alanları daha mantıklı bir sınıfa taşıyarak daha okunabilir ve anlaşılır bir yapı oluşturmayı amaçlar. Öncelikle, hangi alanların taşınması gerektiğini belirleyin. Örneğin, aşağıdaki sınıftaki "taxRate" alanını "Customer" sınıfından "TaxCalculator" sınıfına taşımak istiyoruz:

public class Customer {
  public double taxRate;
  // Other methods and fields specific to Customer
}

public class TaxCalculator {
  // Other methods specific to TaxCalculator
}

    
Alanı taşıyın ve gerekli değişiklikleri yapın:


public class Customer {
  // Other methods and fields specific to Customer
}

public class TaxCalculator {
  public double taxRate;
  // Other methods specific to TaxCalculator
}

    

"Replace Temp with Query" refaktoring tekniğini daha detaylı bir Java kod örneğiyle açıklamaya çalışacağım: Bu teknik, bir yöntem içinde kullanılan geçici değişkenleri bir sorgu ile değiştirerek daha okunabilir ve anlaşılır bir yapı oluşturmayı amaçlar. Öncelikle, hangi geçici değişkenlerin bir sorgu ile değiştirilmesi gerektiğini belirleyin. Örneğin, aşağıdaki sınıftaki "basePrice" geçici değişkenini "getBasePrice" yöntemi ile değiştirmek istiyoruz:

public class Order {
  public double calculateTotalPrice() {
    double basePrice = getBasePrice();
    if (basePrice > 1000) {
      return basePrice * 0.9;
    } else {
      return basePrice * 0.95;
    }
  }
  
  public double getBasePrice() { ... }
}


    
Geçici değişkeni sorgu ile değiştirin:


public class Order {
  public double calculateTotalPrice() {
    if (getBasePrice() > 1000) {
      return getBasePrice() * 0.9;
    } else {
      return getBasePrice() * 0.95;
    }
  }
  
  public double getBasePrice() { ... }
}
    

"Split Temporary Variable" refaktoring tekniğini daha detaylı bir Java kod örneğiyle açıklamaya çalışacağım: Bu teknik, bir yöntem içinde aynı değeri birden fazla kez kullanan geçici değişkenleri parçalara bölerek daha okunabilir ve anlaşılır bir yapı oluşturmayı amaçlar. Öncelikle, hangi geçici değişkenlerin parçalara bölünmesi gerektiğini belirleyin. Örneğin, aşağıdaki sınıftaki "temp" geçici değişkenini "height" ve "width" değişkenlerine bölmek istiyoruz:

public class Rectangle {
  public double calculateArea() {
    double temp = height * width;
    return temp / 2;
  }
  
  public double height;
  public double width;
}

    
Geçici değişkeni parçalara bölün:


public class Rectangle {
  public double calculateArea() {
    double halfHeight = height / 2;
    double halfWidth = width / 2;
    return halfHeight * halfWidth;
  }
  
  public double height;
  public double width;
}

    

"Remove Assignments to Parameters" refaktoring tekniğini daha detaylı bir Java kod örneğiyle açıklamaya çalışacağım: Bu teknik, bir yöntem içinde parametrelerin değerlerini değiştiren atamaları kaldırarak daha okunabilir ve anlaşılır bir yapı oluşturmayı amaçlar. Öncelikle, hangi parametrelerin atamalarının kaldırılması gerektiğini belirleyin. Örneğin, aşağıdaki sınıftaki "discountPercentage" parametresinin atamasını kaldırmak istiyoruz:

public class Order {
  public double calculateDiscount(double discountPercentage) {
    discountPercentage = Math.max(discountPercentage, 0);
    discountPercentage = Math.min(discountPercentage, 100);
    return getBasePrice() * (discountPercentage / 100);
  }
  
  public double getBasePrice() { ... }
}


    
Parametre atamasını kaldırın:


public class Order {
  public double calculateDiscount(double discountPercentage) {
    discountPercentage = Math.max(discountPercentage, 0);
    discountPercentage = Math.min(discountPercentage, 100);
    double finalDiscountPercentage = discountPercentage;
    return getBasePrice() * (finalDiscountPercentage / 100);
  }
  
  public double getBasePrice() { ... }
}
    

"Extract Class" refaktoring tekniğini daha detaylı bir Java kod örneğiyle açıklamaya çalışacağım: Bu teknik, bir sınıftaki birden fazla özelliği ve bu özelliklerle ilgili işlemleri ayrı bir sınıfa taşıyarak daha okunabilir ve anlaşılır bir yapı oluşturmayı amaçlar. Öncelikle, hangi sınıf özelliklerinin ayrı bir sınıfa taşınması gerektiğini belirleyin. Örneğin, aşağıdaki sınıftaki "name" ve "address" alanlarının "Person" sınıfından "NameAndAddress" sınıfına taşınmasını istiyoruz:

public class Person {
  public String name;
  public String address;
  
  // Other methods and fields specific to Person
}

    
Özellikleri ayrı bir sınıfa taşıyın ve gerekli değişiklikleri yapın:


public class Person {
  private NameAndAddress nameAndAddress;
  
  // Other methods and fields specific to Person
  
  public Person(String name, String address) {
    this.nameAndAddress = new NameAndAddress(name, address);
  }
  
  public String getName() {
    return nameAndAddress.getName();
  }
  
  public String getAddress() {
    return nameAndAddress.getAddress();
  }
}

public class NameAndAddress {
  private String name;
  private String address;
  
  public NameAndAddress(String name, String address) {
    this.name = name;
    this.address = address;
  }
  
  public String getName() {
    return name;
  }
  
  public String getAddress

    


Rastgele İçerik

DonanımHaber

© tüm hakları saklıdır
made with by templateszoo