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

    


System Design Kitabı Okuma Seansları - Türkçe - Video -Ahmet Alp Balkan + Bonus

Şirketler-Kobiler-Fabrikalar için dijital dönüşüm rehberi - Endüstri 4.0 - Türkiye Bilişim Derneği - PDF



#teknoloji #dijitalleşmeRehberi ortaya koyan ALPER GERCEK ve Dr. Haluk Gökşen'e teşekkürler.
Bugün okuyup bitirdiğim, şirketlerin, kobilerin ve fabrikaların dijital değişim yolculuğuna rehber eden bir kaynak. Çoğu terime ve sürece tandık olsak da bu derli toplu rehber, süreç boyunca ne yapmamız gerektiğini, nelerden kaçınmamızı ve yaşayabileceğimiz zorlukları anlatıyor. Endüstri 4.0 'ın tam anlaşılmadığını vurgulayan rapor, üretimde ve iş süreçlerinde teknoloji yerlisi olarak doğan yeni nesile adapte olmamız gerektiğini ve onlara uygun bir ortam sağlamamızı söylüyor.

Rastgele İçerik

DonanımHaber

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