Please enable JavaScript.
Coggle requires JavaScript to display documents.
Temiz Kod (Clean Code), SOLID - Coggle Diagram
Temiz Kod (Clean Code)
Anlamlı İsimler (Meaningful Names)
Açıklayıcı İsimler Kullanmak
Değişken İsimleri
costumerService
firstDayOfWeek
Metot İsimleri
getCostumerAdresses()
Sınıf İsimleri
Adress
Book
Açıklama satırı gerektirmeyen isimler kullanmak
long t; //time
İçeriği ile ilgili anlamlı isimler kullanmak
getProductNameList()
(ürünlerin ismin getirsin sadece)
Telaffuzu edilebilir isimler kullanmak
Karmaşık adlandırmalardan uzak durulmalı
int _00xrht;
List<Object> theList;
Tutarlı isimler kullanın
getUserNames()
getUserAddres()
findUserAge()
Aynı kavramlara, farklı yerlerde farklı isimler vermeyin !
DeviceServiceImpl
Device
Manager
Impl
InterfaceServiceImpl
InterfaceService
Jop
Türkçe harf kullanmaktan kaçının
ö, ı, ş, ç, ğ, ü, İ, Ğ, Ç, Ö, Ü
Yazım Şekilleri
PascalCase
NeKadarGüzelBirGün
camelCase
neKadarGüzelBirGün
nocase
nekadargüzelbirgün
snake_case
ne_kadar_güzel_bir_gün
skewer-case
ne-kadar-güzel-bir-gün
Yazı Fontlarına dikkat
l (küçük L harfi)
I (Büyük ı harfi)
O (Büyük o harfi)
0 (rakam)
Benzedikleri için karıştırılabilir
Programlama diline özgü anahtar kelimeleri kullanma
class,
this,
super,
null,
int
Yazım Hassasiyeti (case sensitive)
Bilgisayarlarda, büyük / küçük harfe duyarlılığı
Dezenformasyondan kaçının
:no_entry: accountList
:check: accounts
Yanlış, fazla ya da eksik bilgi vermek.
Aşırı benzerlikten kaçının
ControllerForEfficientHandlingOfStrings
ControllerForEfficientStorageOfStrings
İnce farkı fark etmek ne kadar sürdü ?
Aynı adı farklı amaçlar için kullanmayın
:no_entry: add(value)
:check: concate(value)
:check: insert(value)
:check: append(value)
Fonksiyonlar (Functions)
Küçük işlemler yapması
20 satır uzunluğundan fazla olmamalıdır.
yatay olarak da uzun olmamalıdır.
Kendini tekrar etmeyen (
DRY
)
kod tekrarlarından kaçınmak
Odaklı olması
Tek bir iş yapmak (O işi yapmak)
Anlaşılır isimlendirme
Parametre isimleri
Metot isimleri
Tek görev
Birden fazla işlem yapmamalıyız
Fonksiyonlar bir şey yapmalı, en iyisini yapmalı, yalnız onu yapmalı.
Az sayıda parametre kullanmak
Anlaşılabilir
Okunabilir
Kolay test edilebilir
En fazla 3 parametre
Fonksiyonlar ya bir şey yapmalı ya da bir şeye cevap vermelidir, ancak ikisini birden değil.
try/catch blok yapılarında uzak dur
Eylem Belirten İsimler kullanmak
deletePage()
postPayment()
save()
İç içe yapılardan uzak dur
if - else
while, do - while
Yan Etki (Side Effect) uzak dur
Konu ile ilgisi olmayan işlemler başlatmak
sessionStart();
Biçimlendirme (Formatting)
Değişkenlerin sınıfın üstünde bildirilmesi
Değişkenlerin birbirine yakın olması
İlgili olan metotlar bir birlerine yakın olamalı
Dikey olarak boşluk bırakmak, kodun daha okunaklı olmasını sağlar
İlgili kapsayıcı alanları kendi aralarında hizala
Sola göre girinti kısmı
Bağımlı fonksiyonları alt alta gelecek şekilde yakın bulundur
Küçük kod parçalarını anlamak daha kolaydır
IDEA 'nin kod güzelleştirme nimetlerinde faydalan
Kavramsal Yakınlık (İlgili birimlerin bir birine daha yakın tutmak)
Ekranı sola doğru kaydırmak zorunda kalma
Tek bir satırda uzunca karakter olasın
Boşluk kullanmaktan korkma
!! Abartıya Kaçmadan !!
(-b+Math.sqrt(determinant))/(2*a);
( -b + Math.sqrt( determinant )) / ( 2 * a );
Ekip veya organizasyonun belirlemiş olduğu biçim kurallarına uymak
Gazete Metaforu
Kodun sanki bir yazar tarafından yazılmış gibi görünmesi
Yorumlar (Comment)
Kendini yazdığın kodlarda açıkla !
Kodun açıklamaya ihtiyaç duyduğunda
Yorum eklemek yerine kodu daha açıklayıcı hale getir
Az yorum içeren kod açık ve anlamlı
Yorum yazmakla geçireceğin zamanı kodunu düzelterek geçir
İyi Yorum
TODO (yapılacaklar)
Bilgilendirici
Yasal
Sonuç uyarısı
Niyet açıklama
public API & Javadocs
Kötü Yorum
Zorunlu kalmak
anlaşılması için açıklama getirmek
Yorumlanan kod
kodu yorum satırına almak
Fazla detay
Belirsiz bağlantılar
Fonksiyon başlıkları
metotların ne olduklarını açıklamak
Yanıltıcı yorumlar
Gereksiz Yorumlar
Kapanış Ayracı
//if end
//main end
Konum İşaretçisi
//Dikkat ----------------------------------
Yorumlar, kötü kodu telafi etmez
En iyi yorum, yazılmamış yorumdur. :smiley:
Açıklama satırına alınmış kodları derhal Sil !
başka zaman ihtiyacımız olur diye hiçbir zaman silinmeyen kod
Bir yorum yazacaksanız, bunun en iyi yorum olduğundan emin olmak için zaman ayırın.
Yorumlar size yalan söyleyebilir
Kodu yapısı değişir
Nesneler ve Veri Yapıları
Soyut yapılar oluşturmak
Veri Soyutlama
Neyi Bilir sormak yerine ne yapmalı sorusunu sormalıyız
interface kullanımı önemli
Encapsulation
Dışarıya property (yani değişken) erişimi olmamalı
Objenin internal (dahili) verilerinin dışarıya açmamalıyız
Dış bağlantılara sadece davranışlar (metotlar) erişsin
Objeler =
Veri + Davranış
Yabancılarla konuşma (Arkadaşlarınla konuş)
Sınıfımızın ilgisiz sınıflarla ilgisi olmasın
Araba - Şehir - B. Başkanı
public long mesafe(Sehir sehir){
Değişkenlerimizi gizli tutmak
DTO
Entity'leri direk olarak dışarıya açmamak
iç içe yapılarda kolaylık
Kodun iç yapısını gizleyin
Dillerin hazır Collection yapılarını tercih edin
Az sayıda değişkenlerle çalışın.
Customer => Address
Bir şey yapın.
:no_entry: God Class
Hata Yakalama
anlaşılır ve daha kolay müdahale edebilir hale getirmek için kullanmaktayız
Checked
Compiler tarafından kontrol edilen hatalar
RuntimeException dışındaki tüm exceptionlar
Unchecked
Runtime oluşacak hatalar
Anahtar Kelimeler
try
catch
throw
throws
finally
hatanın uygun şekilde işlenip uygun hata mesajlarının loga basılması önemli.
her zaman hata sıralamasında özelden genele doğru gidilmeli.
NullPointerException
:no_entry: null değer döndürme
:no_entry: null değer gönderme
Unit Testleri
Bir tek production kodları clean yazmak yeterli değil
İsimlendirmeleri ve davranışları anlaşılıyor olması
Neyi test ettiği anlaşılması
Test Driven Development (TDD)
?
F.I.R.S.T.
Hızlı (Fast)
Bağımsız (Independent)
Tekrarlanabilir (Repeatable)
Kendini doğrulamalı (Self - Validating)
Zamanında (Timely)
Sınıflar (Classes)
Sanki gazete okurcasına akıcı ve anlaşılır olması.
Encapsulation
paketler arası erişim seviyeleri
set / get
Collection yapılarını doğrudan erişilmemesi.
Küçük olmalı
Az sayıda davranış içermeli (metot)
God Class
Tek bir sorumluluğu olmalı
Uyum
Dışarı sadece Davranışları açmak
Coupling
Bağlılık
Contract (Sözleşme)
Interface kullanımı
doğrudan sınıfları erişip kullanmamak
İşi yapana bağımlı olmuyorsunuz.
Temiz Kod Nedir
Yazdığımız kodun hiçbir insanoğlu tarafından
okunmayacağına
eminsen, temiz kod yazmak zorunda değilsin
Çalışsın
Yeterli performans
Müşterinin ihtiyaçlarını karşılasın
Basit olarak
Kodu okuyan kişinin kolay anlamasını ve kod üzerinde geliştirme yapabilmesi.
Orijinal yazarı dışında bir geliştirici tarafından okunabilir ve geliştirilebilir.
Elegant and Efficient (Şık ve Verimli)
Simple and Direct (Basit ve Doğrudan)
Genel Kurallar
Standarttı Takip Edin
Kamp alanını bulduğunuzdan daha temiz bırakın.
Basit Tut
readability
, (Basitçe okunup anlaşılıyor ise)
changeability
, (Basitçe değiştirilebiliyor ise)
extensibility
(Basitçe genişletilebiliyor ise)
maintainability
. (Basitçe bakım yapılabiliyor ise)
DRY
D
on't
R
epeat
Y
ourself
Tutarlı Ol
kaynaklar
https://erik-uus.gitbook.io/clean-code/
https://gist.github.com/wojteklu/73c6914cc446146b8b533c0988cf8d29
https://www.youtube.com/watch?v=StEs0fRyVqw
https://medium.com/architectural-patterns/clean-code-temiz-kod-nedir-754fc7ccd5b8
WTF / minutes
Teknik Borç
Kötü Kod Kokusu (
Code Smells
)
Rigidity
(Sertlik)
Yazılımı değiştirmeniz çok zor hale gelmiş, bir değişiklik bir çok yeri etkiliyor ise
Fragility
(Kırılganlık)
Yazılımda ufak bir değişiklik uygulamanın bir çok yerini bozuyor ise
Immobility
(Hareketsizlik)
Kodunuzun bir takım tekrar eden kısımlarını diğer projelerde kullanılıyorsa
Needless Complexity
Gereksiz kompleks ise
Needless Repetition
Gereksiz tekrar var ise
Bu tarz sinyaller alıyorsanız, kodunuzda düzeltmeler yapma zamanı gelmiştir.
kodumuzu nasıl temiz hale getireceğiz ?
Refactoring (yeniden düzenleme)
Opacity
(Saydamlık)
Okunabilirliği zor ise
Saat Yönünde Okumanızı Tavsiye Ediyorum.
SOLID
SRP
single responsibility principe
OCP
open closed principe
LSP
Derived class should be substitutable for the base class.
ISP
Interface Segregation Principle
DIP
Dependeny Inversion Principle