Software Architecture etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Software Architecture etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

NoSql teknolojileri nasıl öğrenilir?








NoSQL teknolojilerini öğrenmek için aşağıdaki adımları izleyebilirsiniz:

  1. NoSQL Nedir?: NoSQL'nin ne olduğunu ve neden kullanıldığını anlayın. NoSQL, genellikle ilişkisel olmayan veritabanlarından oluşan bir kategoridir ve yüksek oranda işlemci hızı, büyük veri kümeleri ve dağıtılmış bilgi depoları için tasarlanmıştır.
  2. NoSQL Türlerini Anlama: NoSQL veritabanlarının çeşitli türlerini öğrenin. Ana tipler arasında belge tabanlı (MongoDB), sütun tabanlı (Cassandra, HBase), anahtar-değer çifti tabanlı (Redis, DynamoDB) ve grafik tabanlı (Neo4j) veritabanları bulunur. Her türün kendi kullanım durumları, avantajları ve dezavantajları vardır.
  3. Dil Seçimi: NoSQL veritabanları ile çalışmak için bir dili iyi derecede bilmeniz gerekmektedir. Python, JavaScript (Node.js), Java, vb. dilleri kullanabilirsiniz. Bu dillerin her biri, NoSQL veritabanları ile çalışmak için kullanılan çeşitli kütüphanelere ve araçlara sahiptir.
  4. NoSQL Veritabanı Seçimi: Öğrenmek istediğiniz belirli bir NoSQL veritabanı seçin. MongoDB veya Redis gibi popüler seçeneklerden birini seçebilirsiniz. Daha sonra bu veritabanının resmi belgelerini okuyun ve temel konseptlerini öğrenin.
  5. Pratik Yapın: NoSQL teknolojilerini öğrenmenin en iyi yolu, uygulamalı deneyim kazanmaktır. Kendi projelerinizi oluşturmayı deneyin veya mevcut açık kaynaklı projeler üzerinde çalışın. Bu, size NoSQL veritabanlarıyla nasıl etkileşim kurulacağını ve nasıl performans iyileştirmeleri yapılacağını öğretecektir.
  6. Eğitim Kaynaklarını Kullanın: Çevrimiçi kurslar, e-kitaplar, YouTube videoları ve blog gönderileri gibi kaynakları kullanın. Udemy, Coursera ve EdX gibi platformlarda birçok NoSQL eğitimi mevcuttur.
  7. Topluluklar ve Forumlar: Sorularınızı yanıtlayabilecek ve sorunlarınızı çözebilecek bir topluluk bulun. StackOverflow, Reddit ve GitHub, NoSQL teknolojileri hakkında bilgi paylaşan büyük topluluklara sahiptir.
  8. Belge Tabanlı NoSQL Öğrenme: MongoDB gibi belge tabanlı NoSQL veritabanlarını öğrenmek, birçok modern web uygulaması ve büyük veri analizi uygulamaları için çok kullanışlıdır. MongoDB'nin resmi web sitesi, çeşitli dillerde MongoDB'yi kullanma konusunda kapsamlı dökümantasyon ve öğrenme kaynakları sunar.
  9. Sütun Tabanlı NoSQL Öğrenme: Cassandra veya HBase gibi sütun tabanlı NoSQL veritabanlarını öğrenmek, büyük veri setleri ve analitik işlemlerle uğraşırken özellikle yararlı olabilir. Bu veritabanları için resmi belgeler ve çevrimiçi kurslar mevcuttur.
  10. Anahtar-Değer Tabanlı NoSQL Öğrenme: Redis veya Amazon'un DynamoDB'si gibi anahtar-değer tabanlı NoSQL veritabanlarını öğrenmek, yüksek performanslı web uygulamaları ve önbellekleme çözümleri için çok kullanışlıdır. Her iki veritabanı da resmi web sitelerinde öğrenme kaynakları sunar.
  11. Grafik Tabanlı NoSQL Öğrenme: Grafik tabanlı NoSQL veritabanları, özellikle karmaşık veri ilişkilerini modellemek için kullanışlıdır. Neo4j gibi grafik tabanlı veritabanları için çevrimiçi kurslar ve belgeler mevcuttur.
  12. Küçük Projelerle Başlayın: Herhangi bir NoSQL veritabanı teknolojisiyle rahat olduğunuzda, küçük bir projeyle başlayın. Bu, bir blog sitesi, bir görev yöneticisi, bir rezervasyon sistemi veya bir e-ticaret sitesi olabilir. Bu projeler, NoSQL veritabanı teknolojilerini kullanarak gerçek dünya problemlarını nasıl çözebileceğinizi anlamanızı sağlayacaktır.
  13. Yüksek Veri Yoğunluğu Senaryolarını Simüle Edin: Büyük veri kümeleriyle çalışmayı deneyin. NoSQL veritabanlarının ölçeklenebilirlik ve performans özelliklerini gerçekten anlamak için, büyük veri kümeleriyle çalışmayı deneyin. Bu, kendi verinizi oluşturmak veya açık kaynaklı bir veri seti kullanmak anlamına gelebilir.
  14. Farklı NoSQL Veritabanları Arasında Geçiş Yapmayı Deneyin: Farklı NoSQL veritabanları arasında geçiş yapmayı deneyin. Her biri kendi özelliklerine, avantajlarına ve dezavantajlarına sahiptir, bu yüzden birkaçını denemek ve hangisinin belirli bir durum için en uygun olduğunu görmek yararlı olabilir.
  15. Veri Modellemesi Üzerine Çalışın: Veri modellemesi önemlidir ve NoSQL veritabanlarında da bu durum farklı değildir. Farklı veri modellerinin ne zaman ve nasıl kullanılacağını anlamak önemlidir.
  16. Performans Optimizasyonu Öğrenin: NoSQL veritabanları hızlı ve ölçeklenebilir olsa da, verimliliği ve hızı artırmak için genellikle performans optimizasyonu gereklidir. İndeksleme, sharding ve replikasyon gibi konseptleri öğrenmek bu noktada önemlidir.
  17. Güvenlik Önlemlerini Öğrenin: Veritabanı güvenliği, özellikle web uygulamalarında önemli bir konudur. NoSQL enjeksiyon saldırıları gibi potansiyel güvenlik tehditlerini anlamak ve bunlara karşı önlemler almayı öğrenmek önemlidir.
  18. Bir REST API ile NoSQL Veritabanı Kullanmayı Öğrenin: Web geliştirme alanında, RESTful API'lerle çalışmak oldukça yaygındır ve NoSQL veritabanlarını bu API'lerle birlikte kullanmayı öğrenmek çok önemlidir. Örneğin, Node.js ve Express.js kullanarak bir REST API oluşturmayı ve bu API'nin bir NoSQL veritabanı ile nasıl etkileşime gireceğini öğrenin.
  19. Çeşitli Veritabanı Yönetim Araçlarıyla Tanışın: NoSQL veritabanlarını yönetmek için kullanılan çeşitli araçları öğrenin. MongoDB için MongoDB Compass, Redis için Redis Desktop Manager gibi araçları kullanabilirsiniz. Bu tür araçlar, veritabanınızla etkileşimi kolaylaştırır ve veritabanınızın durumunu ve performansını izlemenizi sağlar.
  20. Mimari Tasarımları Anlama: Öğrendiğiniz NoSQL teknolojisinin, genel veritabanı mimarisi ve uygulama tasarımında nasıl rol oynadığını anlamaya çalışın. Örneğin, bir mikroservis mimarisinde, farklı servislerin farklı NoSQL veritabanlarına nasıl bağlandığını inceleyin.
  21. DevOps ve NoSQL: Modern yazılım geliştirme süreçlerinde, veritabanı teknolojilerinin DevOps uygulamaları ve stratejileri ile nasıl entegre olduğunu anlamak önemlidir. CI/CD pipeline'larında NoSQL veritabanlarıyla nasıl çalışılacağını öğrenin.
  22. Dökümantasyon ve API'ler: Herhangi bir NoSQL veritabanının dökümantasyonunu ve API'lerini anlamak çok önemlidir. Her veritabanının API'si farklıdır ve belirli işlevlerin nasıl gerçekleştirileceğini anlamak için API dökümantasyonunu okumak önemlidir.
  23. Veri Normalizasyonu ve Denormalizasyonu: Normalizasyon, verinin veritabanında nasıl organize edildiğine dair bir stratejidir. NoSQL veritabanlarında, veri genellikle denormalize edilir, yani veri tekrarlanır ve genişletilir, böylece daha hızlı okuma işlemleri yapılabilir. Bu kavramları anlamak ve ne zaman kullanılacağını bilmek önemlidir.
  24. Sertifikaları Düşünün: MongoDB, Cassandra, Redis ve diğer popüler NoSQL teknolojileri için birçok sertifika programı mevcuttur. Bu sertifikalar, NoSQL becerilerinizi kanıtlamanın bir yoludur ve işverenler tarafından genellikle olumlu karşılanır.
  25. Bilgi Paylaşımı ve Networking: Bilgi ve deneyimlerinizi paylaşın. Blog yazıları yazın, GitHub'da projeler paylaşın, web seminerlerine ve konferanslara katılın. Ayrıca, NoSQL ile ilgili konuları tartışabileceğiniz ve diğer profesyonellerle bağlantı kurabileceğiniz topluluklara katılın.
  26. NoSQL'nin Sınırlamalarını Anlayın: Her teknolojinin sınırlamaları vardır ve NoSQL istisna değildir. NoSQL'nin sınırlamalarını ve hangi durumlarda ilişkisel veritabanlarının daha iyi bir seçenek olabileceğini anlamak önemlidir.
  27. Sürekli Öğrenme: Teknoloji dünyası sürekli değişiyor ve yeni araçlar, kütüphaneler ve en iyi uygulamalar sürekli olarak ortaya çıkıyor. Bu nedenle, yeni öğrenmeye açık olun ve kendinizi sürekli olarak geliştirin.
  28. Veritabanı İşlemleri ve İşlem Güvenliği: ACID (Atomicity, Consistency, Isolation, Durability - Atomiklik, Tutarlılık, İzolasyon, Kalıcılık) prensiplerini anlamak ve farklı NoSQL veritabanlarının bu prensiplere nasıl uyduğunu ya da uymadığını anlamak önemlidir.
  29. Veri Yedekleme ve Kurtarma Stratejileri: Veritabanı verilerini yedekleme ve kurtarma stratejilerini öğrenin. Her NoSQL veritabanının kendi yedekleme ve kurtarma stratejileri vardır ve bunları anlamak önemlidir.
  30. Distributed Systems (Dağıtık Sistemler) Anlamak: NoSQL veritabanları genellikle dağıtık sistemler olarak tasarlandığından, bu sistemlerin nasıl çalıştığını ve CAP teoreminin (Consistency, Availability, Partition Tolerance - Tutarlılık, Kullanılabilirlik, Bölüm Toleransı) ne olduğunu anlamak önemlidir.
  31. Daha Fazla Dil Öğrenin: NoSQL veritabanları genellikle birçok programlama diliyle kullanılabilir. Bu nedenle, çeşitli dillerle NoSQL veritabanlarına nasıl bağlanacağınızı öğrenmek faydalı olabilir.
  32. Gelecek Trendlerini İzleyin: NoSQL veritabanları hızla gelişen bir alandır ve yeni teknolojiler, araçlar ve teknikler sürekli olarak ortaya çıkmaktadır. Bu nedenle, NoSQL dünyasındaki son trendleri takip etmek ve yeni teknolojilere ayak uydurmak önemlidir.
  33. Veri Bütünlüğünü Anlama: İlişkisel veritabanları, veri bütünlüğünü sağlama konusunda genellikle daha güçlüdür, çünkü daha katı şemaları vardır. NoSQL veritabanları daha esnek şemalar kullanır, bu da veri bütünlüğünün daha zor olabileceği anlamına gelir. Veri bütünlüğünü nasıl sağlayabileceğinizi ve NoSQL veritabanlarının bu konuda nasıl yardımcı olabileceğini anlamak önemlidir.
  34. Veri Analitiği: NoSQL veritabanlarını kullanarak büyük veri setlerini nasıl analiz edeceğinizi öğrenin. SQL gibi dillerle ilişkisel veritabanlarından veri almayı biliyorsanız, NoSQL veritabanlarından veri almayı öğrenmek farklı bir deneyim olabilir.
  35. Veritabanı Yönetimi: Veritabanı yönetimi ve bakımı önemli bir konudur. Veritabanı performansını izlemeyi, sorunları teşhis etmeyi ve çözümlemeyi öğrenin.
  36. Ölçeklenebilirlik Stratejileri: NoSQL veritabanları ölçeklenebilirlik için tasarlanmıştır, ancak bu otomatik olarak gerçekleşmez. Veritabanınızın nasıl ölçekleneceğini planlamayı ve uygulamayı öğrenin.
  37. Mevcut Kaynaklardan Faydalanın: Online eğitim platformlarından, belgelerden, blog yazılarından ve video derslerden yararlanın. Herkesin öğrenme tarzı farklıdır ve en etkili olanı bulmak için farklı kaynakları deneyin.
  38. Soru Sorma ve Yardım Alma: Bir topluluğa katılın veya mentor bulun. Yeni bir şey öğrenirken karşılaştığınız zorlukları ve soruları paylaşabileceğiniz bir topluluk veya mentor, öğrenme sürecinde çok yardımcı olabilir.
  39. Pratik Yapın: En önemlisi, pratik yapın. Bir NoSQL veritabanıyla bir uygulama oluşturun, veritabanınızı çeşitli yükler altında test edin ve farklı ölçeklenebilirlik stratejilerini deneyin.
  40. Gelişmiş Sorgu Tekniklerini Öğrenin: Çoğu NoSQL veritabanı, belgeleri bulmak ve işlemek için karmaşık sorguları destekler. Bu sorgular genellikle veritabanına özgüdür. Bu yüzden, belirli bir NoSQL veritabanıyla çalışırken, ileri düzey sorgu tekniklerini öğrenmek önemlidir.
  41. Güvenlik İlkelerini Anlama: Veritabanı güvenliği, verilerin korunması ve izinsiz erişimin önlenmesi açısından son derece önemlidir. Farklı NoSQL veritabanlarının güvenlik modellerini ve en iyi uygulamalarını öğrenin.
  42. Performansı İzleme ve Optimize Etme: Veritabanı performansı, özellikle büyük ölçekte, önemli bir konudur. Bir NoSQL veritabanında performansı izlemeyi, potansiyel performans sorunlarını tanımlamayı ve gerekli optimizasyonları yapmayı öğrenin.
  43. Veri Modellemesi: Veri modellemesi, hangi verilerin nasıl ilişkilendirileceğini ve depolanacağını belirlemek için önemlidir. NoSQL veritabanları için veri modellemeyi öğrenin ve veritabanının verimli bir şekilde çalışması için en iyi modellemeyi belirlemeyi öğrenin.
  44. Veri Göç Etme: Verilerin bir veritabanından diğerine taşınması genellikle karmaşık ve zorlu bir işlemdir. NoSQL veritabanlarına veri taşımayı ve verileri NoSQL veritabanlarından başka bir yere taşımayı öğrenin.
  45. Veritabanı Sürüm Yükseltmeleri: Her NoSQL veritabanının farklı sürümleri vardır ve her sürüm, yeni özellikler ve değişiklikler getirir. Veritabanınızın sürümünü nasıl güncelleyeceğinizi ve bu sürecin etkilerini nasıl yöneteceğinizi öğrenin.

Bu süreç boyunca, başarılı olmanın anahtarı, sabırlı ve istikrarlı olmaktır. Her bir konsept üzerinde durun ve her birini tamamen anladığınızdan emin olun. NoSQL veritabanlarının karmaşık ve zorlu bir konu olduğunu unutmayın, ancak bu, onları öğrenmenin ve onlarla yetkin hale gelmenin son derece tatmin edici olmadığı anlamına gelmez. Her adımda kendinize zaman verin ve her bir konsepti tam olarak anladığınızdan emin olun.

NoSQL veritabanlarına olan talep, büyük veri ve ölçeklenebilir uygulamaların artan önemi nedeniyle büyümeye devam ediyor. Bu teknolojileri öğrenmek ve bunlarla deneyim kazanmak, modern yazılım geliştirme ve veri bilimi alanlarında kariyer yapmayı düşünenler için önemli bir avantaj olabilir.

Hatırlanması gereken önemli bir nokta, her projenin kendine özgü gereksinimleri olduğudur ve her zaman en uygun veritabanı teknolojisinin seçilmesi gerektiğidir. NoSQL'nin sunduğu avantajları anlamak kadar, hangi durumlarda kullanılması gerektiğini ve hangi durumlarda kullanılmaması gerektiğini anlamak da önemlidir.

Öğrenme yolculuğunuzda, her zaman bir sorunla karşılaştığınızda veya belirli bir konsepti anlamakta zorlandığınızda yardım alabileceğiniz bir topluluk bulundurmanız önemlidir. StackOverflow, GitHub ve belirli veritabanlarının resmi forumları gibi platformlar, genellikle bilgi alışverişinde bulunabileceğiniz ve diğer geliştiricilerin yardımını alabileceğiniz mükemmel kaynaklardır.

Büyük Ölçekli Sistemlerin Yazılım Mimarisi ve Teknolojisi - Eğitim - Udemy - İngilizce

Kursa buradan ulaşabilirsiniz.









Yazılım Sistemleri ve Çözümlerinin Mimarisi: İlerledikçe geliştireceğimiz üç katmanlı temel bir uygulama mimarisiyle başlayacağız.

Nodejs, Redis, Cassandra, Kafka, Hadoop, Elastic Search, .. ve çok daha fazlası gibi ürünler hakkında mimari içgörüler elde ederek teknik bir yığın nasıl oluşturulur?

İşlevsel Olmayan Gereksinimler: Performans, Ölçeklenebilirlik, Güvenilirlik ve Güvenlik dikkate alınarak mimari nasıl tasarlanır?

Docker ve Kubernetes gibi araçları kullanarak büyük ölçekli üretim sistemlerinin devreye alınması





Gereksinimler
İyi bir programcıysanız veya olmuşsanız, en az bir programlama dilinde kod tasarımı yapabilir ve kod yazabilirsiniz.

Üç katmanlı mimariyi anlarsınız ve web uygulamalarının, hizmetlerinin ve veritabanlarının ne anlama geldiğini genel olarak anlarsınız

Tanım


Yazılım sistemleri tasarlamak, büyük talep gören bir beceridir, ancak hazır bir beceri değildir. Bu becerinin neden nadir bulunduğunu anlamak için, Martin Fowler'ın mimarlık üzerine blogundan birkaç satırı inceleyelim.

Diyor ki: Mimarlık önemli şeylerle ilgilidir. Her ne ise . Bu, yazılım hakkında mimari olarak düşünmenin kalbinin, neyin önemli olduğuna (yani neyin mimari olduğuna) karar vermek ve ardından bu mimari öğeleri iyi durumda tutmak için enerji harcamak olduğu anlamına gelir. Bir geliştiricinin mimar olabilmesi için, hangi unsurların önemli olduğunu, hangi unsurların kontrol edilmediği takdirde ciddi sorunlara neden olabileceğini fark edebilmeleri gerekir.

Bir geliştiricinin mimar olacak kadar öğrenmesi birkaç yıl alır. Bu öğrenme, büyük ölçüde kariyerinizde elde ettiğiniz fırsatların türüne bağlıdır. Genellikle bu fırsatlar yalnızca belirli çalışma alanlarıyla sınırlıdır. Ancak, bir mimar olmak için mümkün olduğu kadar çok alanda kapsamlı teknik bilgiye sahip olmalısınız. Bir sistemin farklı bölümlerindeki tüm karmaşıklıkları ve zorlukları anlamalısınız. Çeşitli değiş tokuşları anlayarak önceden karar verme yeteneğine ihtiyacınız var. Bir sistemin evrimi sırasında karşılaşabileceği kritik sorunları öngörebilmeli veya tahmin edebilmelisiniz.

'Geliştiriciden Mimara' kursunun sizin için çok yararlı olabileceği yer burasıdır. Halihazırda büyük geliştirme becerilerine sahip olduğunuzu varsayar ve oradan inşa eder. Bir sistemin işlevsel olmayan özelliklerinin mimarisini, büyük ölçekli dağıtımların ele alınmasını ve yazılım çözümleri oluşturmak için popüler açık kaynaklı ürünlerin dahili çalışmasını kapsamlı bir şekilde kapsar.

Size özel olarak nelerin kapsandığına dair bazı ayrıntılar vermek için:

Performans, Ölçeklenebilirlik, Güvenilirlik, Güvenlik gibi işlevsel olmayan özelliklerin mimarisi.


Docker kapsayıcılarını ve Kubernetes'i kullanan büyük ölçekli dağıtım ve işlemler.


Güvenle yazılım çözümleri tasarlamak için Node.js, Redis, Kafka, Cassandra, ELK stack, Hadoop vb. gibi popüler açık kaynaklı ürünlerin dahili çalışması.

Kısacası, bu kurs çok kısa bir süre içinde 'gerçek' bir mimar olmanız için ihtiyacınız olan her şeyi öğrenmenize yardımcı olacaktır.

Bu kurs kimler için:Halihazırda Kod Tasarımını bilen ve şimdi Büyük Ölçekli Sistemlerin Nasıl Mimari Yapılacağını öğrenmek isteyen tüm Yazılım Geliştiriciler
Yazılım Mimarisi ve Çözüm Mimarisi becerilerini geliştirmek isteyen tüm Yazılım Mimarları


Senior Java Developer olarak Architect pozisyonuna yükselmek istiyorum. Ne yapmalıyım? (Chat GPT)




Senior Java Developer olarak Architect pozisyonuna yükselmek istiyorsanız, aşağıdaki adımları takip ederek kariyerinizi geliştirebilir ve hedefinize ulaşabilirsiniz:

1. Yetkinliklerinizi geliştirin: Architect pozisyonu için, yazılım tasarımı ve sistem mimarisi konularında derinlemesine bilgi ve deneyim gereklidir. Tasarım desenleri, yazılım mimarisi prensipleri ve uygulama çerçeveleri gibi alanlarda bilginizi artırın.

2. İyi bir problem çözücü olun: Başarılı bir Architect, karşılaşılan sorunlara yaratıcı ve etkili çözümler bulmalıdır. Problem çözme becerilerinizi geliştirin ve yazılım geliştirme sürecinde ortaya çıkan zorluklarla başa çıkmaya hazır olun.

3. Teknolojiyi takip edin: Yeni teknolojiler, araçlar ve yöntemlerle güncel kalmak, bir Architect'in başarısı için önemlidir. Güncel teknolojileri ve trendleri takip edin ve gerektiğinde bunları projelerinizde uygulayın.

4. İletişim ve liderlik becerilerinizi geliştirin: Bir Architect, projelerin başarısı için ekip üyeleriyle etkili bir şekilde iletişim kurmalı ve onları yönlendirmelidir. İletişim ve liderlik becerilerinizi geliştirerek, ekip üyeleri ve yöneticilerle daha iyi çalışabilirsiniz.

5. Mentorluk ve danışmanlık yapın: Diğer geliştiricilere rehberlik etmek ve onların yetkinliklerini geliştirmelerine yardımcı olmak, bir Architect'in sorumluluklarındandır. Mentorluk ve danışmanlık yaparak, kendi bilginizi de pekiştirebilir ve liderlik yeteneklerinizi sergileyebilirsiniz.

6. İşbirliği ve takım çalışmasına önem verin: Başarılı bir Architect, ekip üyeleriyle iyi bir işbirliği kurarak ve projelerin başarıya ulaşması için gereken destek ve yönlendirmeyi sağlayarak etkili çalışır. Takım çalışmasına önem verin ve diğer ekip üyeleriyle uyumlu bir şekilde çalışmayı öğrenin.

7. Sertifikalar edinin: Yazılım mimarisi ve ilgili alanlardaki sertifikalar, bilgi ve deneyiminizi göstermenin iyi bir yoludur. Örneğin, Oracle Certified Master, Java EE Enterprise Architect sertifikası gibi prestijli sertifikaları alarak, yetkinliklerinizi kanıtlayabilirsiniz.

8. Networking: Sektördeki etkinliklere, konferanslara ve toplantılara katılarak, alanında uzman kişilerle tanışın ve bağlantılarınızı geliştirin. Bu bağlantılar, kariyer fırsatları ve yeni bilgi kaynakları sağlayabilir. Ayrıca, sosyal medya ve sektörel forumlar aracılığıyla da diğer profesyonellerle iletişim kurarak, bilgi ve deneyim paylaşımında bulunabilirsiniz.

9. Öğrenmeye ve gelişmeye açık olun: Başarılı bir Architect, sürekli olarak öğrenmeye ve kendini geliştirmeye istekli olmalıdır. Kariyeriniz boyunca yeni bilgiler öğrenmeye ve becerilerinizi geliştirmeye devam ederek, daha başarılı bir Architect olabilirsiniz.

10. Başarılarınızı ve projelerinizi sergileyin: Geçmiş projelerinizdeki başarılarınızı ve elde ettiğiniz sonuçları vurgulayarak, mimari becerilerinizi ve liderlik yeteneklerinizi sergileyin. Özellikle, karmaşık ve ölçeklenebilir sistemlerdeki deneyiminizi ve başarılarınızı paylaşarak, Architect pozisyonu için uygun olduğunuzu gösterin.

11. Hedeflerinize ulaşmak için stratejik adımlar atın: Şirketinizde veya sektördeki Architect pozisyonlarına başvurarak, hedeflerinize ulaşmak için stratejik adımlar atın. Kariyer planlamanızı yaparak, mevcut becerilerinizi değerlendirebilir ve eksiklerinizi belirleyerek, bu alanlarda çalışarak kendinizi geliştirebilirsiniz.

Sonuç olarak, Senior Java Developer olarak Architect pozisyonuna yükselmek istiyorsanız, teknik yetkinliklerinizi geliştirirken, iletişim, liderlik ve takım çalışması gibi soft becerilere de önem verin. Sürekli öğrenmeye ve kendinizi geliştirmeye açık olun ve sektördeki networking fırsatlarını değerlendirin. Bu sayede, hedefinize ulaşma şansınızı artırabilirsiniz.

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.

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