Yandex Metrica
Clean Code'a Giriş - Yasin Sunmaz

Yasin Sunmaz

Kodladıkça değişen bir dünya...

Clean Code'a Giriş

14.04.2022 yasinsunmaz 1247 0

Yeni bir konu ile karşınızdayım. Yazılımlarımızı elimizden geldiğince iyi stabile ve yönetilmesi kolay olacak şekilde yapmaya çalışıyoruz. Fakat bu işin de belli standartları ve kuralları var. Ne yazık ki ben de dahil olmak üzere bir süre boyunca bu şekilde yazılım yapıyordum. Şuan aldığım eğitimler ve araştırmalar sonucunda daha bilinçli kod yazmaya gayret gösteriyorum. Kısaca kodumuzun her anlamda okunaklı, yönetilmesi, bağımlılığı ve sürdürebilir olması için Clean Code diye bir şey var. Sizlere bu yazımda ve bununla alakalı olarak diğer yazılarımda clean code ile ilgili bildiklerimi ve hala öğrenmekte olduğum kısımlar ile ilgili bilgiler aktarmaya çalışacağım. Hem benim hem de siz değerli yazılımcı ve yazılımcı adaylar için faydalı olacağını düşünüyorum.

Biraz mevcut yaptığımız işlemler üzerine durmak istiyorum. Farklı farklı örnekler vereceğim eminim ki başlangıçta mantıklı bile gelebilir fakat öyle değil :)

  • En basit hali ile metotlarımızı yazarken belli işlemleri yapması için tasarlıyoruz. Örnek üzerinden gidecek olursak seçtiğimiz kullanıcılara mail atmak isteyelim. Bu durumda ilk akla gelen metot içerisinde kullanıcı listesini alıp sonrasında teker teker o kullanıcıya ait mail adresini alıp sonrasında mail gönderme işlemini yapmak olacaktır. Yani işlemleri sırası ile aynı metot içerisinde yapmak diyebiliriz.
  • Bazen bir metota ihtiyacımız oluyor ve bazı parametler ile birlikte bir işlem yaptırmak istiyoruz. Yeri geliyor 1 yeri geliyor 5-6 parametre metotlar yazabiliyoruz.
  • Dosya işlemleri yapacağımız zaman dosya yolunu tanımlıyoruz ve bunu değişkene atıyoruz. Bu değişken ismi "file" gibi bir şey oluyor genelde. Bunu gibi kısa isimlendirmeler kullanıyoruz.
  • Metotlarımızı yazarken karmaşık işlemler sırasında // ekleyerek yorum satırları yazıyoruz böylece başka biri o kodu anlamasını bekliyoruz.
  • Metotlarımızın içerisinde farklı durumlara göre farklı koşullar tanımlıyoruz. Böylece olası her durum için kodumuz çalışıyor. Ama if durumları giderek büyüyüp uzayabiliyor.
  • İf koşullarında tip değişkenlerinde özellikle sayı ve metinsel karşılaştırma yapıyoruz. Yani tip 1300 ise şunu yap. 1400 ise şunu yap şeklinde if koşulları kullanabiliyoruz. Bunun aksine "email" ise mail gönder. "sms" ise sms gönder gibi farklı ayrımlara gidebiliyoruz.
  • Değişken isimlerinde gelen değere göre isimlendirme yapıyoruz. Örneğin km değeri dönen bir kod satırında değişken olarak km yazmak ilk akla gelen oluyor.
  • Değişken ve metot isimlerinde Türkçe ve İngilizce kelimeleri beraber kullanarak isimlendirme yapabiliyoruz. Bunun en temel sebebi de başkalarının anlaması kolay olsun diye. Biz iyi bir şey yapalım derken daha da kötü bir duruma yol açabiliyoruz.

Genel anlamda bu gibi işlemleri isteyerek ya da istemeden yapıyoruz. Bu durumların birçoğu özellikle başlangıçta normal gibi gözükebilir. Ama hiçte göründüğü gibi masum işlemler değil  Gelelim Clean Code neymiş, bizlere ne gibi tavsiyeleri var bir bakalım.

Temiz Kod Nedir?

Tüm geliştiriciler tarafından rahatça anlaşılabilen, geliştirilmesi kolay, odaklı, kısa ve basit koddur. Aslında temiz kod(Clean Code) basit olduğu için kısa, kısa olduğu için anlaşılır, anlaşılır olduğu için odaklı ve odaklı olduğu içinde gerekli geliştirmeleri rahatlıkla yapabilmektir. Aynı zamanda temiz kod teknoloji ve sektörden bağımsız olarak düşünülmelidir. Bir diğer husus ise tekrarsız kod yazmaktır. Aynı sınıf içerinde ya da aynı proje içinde aynı koddan ya da aynı metottan olması pek mantıklı bir davranış değildir. Hepsi birbiri ile bağlantılı ve hepsini iyi şekilde kullandığımızda ortaya temiz bir kod çıkacaktır.

Temiz kod aslında yapmasanız da yine o kodunuz bir şekilde çalışacaktır. Ama temiz kod yazmak hem sizin gelişiminiz hem de bulunduğunuz proje ve şirket için bir ahlaki bir sorumluluk olarak düşünmemiz gerekir. Temiz kod yazmak işini iyi yapmakla ilgilidir. Temiz kodun aksine bir kod temiz değilse kötü koddur(dirty kod).

Temiz kod elde edebilmemiz için şirket ve ekip bireylerinin iletişimi, kodları gözden geçirme, kodları iyileştirme, cesarete ve zamana ihtiyacımız olacaktır. Özellikle ciddi projelerde yapacağınız değişiklikler sistemi etkileyebileceğinden bunları yapma konusunda iyi düşünmeli ve ona göre hareket etmelidir.

1-Temiz Kod: Basittir(KISS)

KISS: Keep It Simple, Stupid

Kodumuzun olabildiğince basit, anlaşılabilir ve geliştirebilmesini sağlamayı hedefleyen bir prensiptir. Aptal olacak kadar basit yapmalısınız ki o kodda hata olmadığı açık olsun.

Refactoring

Kodun basitleştirilme işlemidir. İyileştirme yapabilmek için her zaman bölme, çıkarma ve parçalama ile sağlanır. Yani kodunuzun basit olabilmesi için her zaman mevcut kodlar parçalanır ve yeni metotlar, yeni sınıflara bölünmesi gerekir. Bunu yaptıkça kodunuz basitleşir ve tek bir işlevi olur.

Her satırda bir işlem yap: Kodunuzun her satırda sadece bir iş yapmasına yönelik geliştirme yapmak en iyisidir. Aynı satır içerisinde farklı işlemleri aynı anda yapmayın. Siz ve başka geliştiriciler satıra baktığında tek bir işi anlasın. Aksi durumda o satırda anlam karmaşası olup geliştiricinin anlaması güçleşebilir. Buna uyarak kodlarınızın anlaşılabilir olmasını sağlayabilirsiniz.

Basit Kod İçin

  • Kodlarınızda değişken, metot ve isimlendirmelerine dikkat etmek.
  • Her iş tek seferde olacak şekilde yazılmalıdır. Tanımlamalar tek seferde olmalıdır.
  • Kodunuza baktığınız zaman karmaşık olmamalı hem görüntü hem de anlaşılırlık bakımından güzel görünmelidir.
  • Basit kod temelde doğru soyutlamalar ile sağlanabilir.
  • Kodlarınızda gerektiği yerlerde dokümantasyon kullanımına özen gösterilmelidir.
  • Satır, metot ve sınıf seviyesinde iş mantığı farklı şeylerdir. Satır seviyesinde bir iş sadece o satırdaki yapılan işi kapsağı gibi sınıf seviyesindeki iş ise o sınıf içerisinde barındırdığı tüm işlerin genel anlamda tek bir anlam ifade etmesidir.
  • Basit kod anlaşılır ve kısa koddur. Anlaşılır kod ise standart ve odaklı koddur.
  • Gereksiz değişken ve özellikler kaldırılmalıdır.
  • Kodu atmaktan korkmayın. Kodu yeniden düzenlerken her zaman istenmeyen kodu kaldırın.
  • Kodunuzu basitleştirmeden önce soruna odaklanın, nasıl çözebileceğiniz ile ilgili alternatif çözümler üretin. Sorunları iş parçalarına bölüp öyle çözmeye başlayın.
  • Her zaman kod geliştirme standartlarını takip etmelisiniz.

Bu maddeler genel anlamda basitlik için önem içerir. Bunların detaylarını inceleyeceğiz.

1.1-Temiz Kod: Anlaşılırdır

Anlaşılır kod mimariye uyumludur, isimlendirme standartlarına sahiptir, standartlar ve belli şekile sahiptir. Dilin kullanımı da önemlidir. Dokümantasyon ile gerekli açıklamalar ile kodu destekleyebilirsiniz.

Temiz Kod: Mimariye Uyumludur

Clean code için mimariye uyumlu yazılım geliştirmek gerekiyor. Gerekli yerlerde kodlarımızı mimariye uyacak şekilde değiştirmemiz gerekebilir. Eğer mimari değişime müsait değilse mimariye uygun kod yazılmalıdır. Aksi durumda mimari geliştirmeye değiştirmeye müsait ise clean code işlemini buradan başlanmalıdır.

Temiz Kod: İsimlendirme

Temiz kodda bir diğer önemli husus ise isimlendirmedir. İsimlendirmeler değişkenlerde, metotlarda ve sınıf isimlendirmelerinde de dikkat edilmesi gerekir. Genel olarak isimlendirmelerde dikkat edilmesi gerekenler:

  • İsimlendirmelerinizi her zaman İngilizce olarak yapın. Türkçe isimlendirme kullanmak uygun değildir. En temel sebebi kod herkes tarafından ortak bir dilde olması ve yazılımın başkalarına satılması durumunda o kişilerce de anlaşılabilir olması açısından İngilizce olması en uygundur.
  • İngilizce kelimeler ile isimlendirme yaparken kelimenin doğruluğuna dikkat etmelisiniz. Örneğin "Extentions" diye bir kelime kullanacakken "Extentons" gibi kelime hataları yapmamak gerekiyor. Kelimenin doğrulundan emin olmalısınız.
  • Anlaşılır isimlendirmeler kullanılırken en sık yapılan hata kısaltma kullanımıdır. Bir isimlendirme kısaltma yapıp anlaşılması zor olacağına uzun olup anlaşılır olması daha iyidir. Yani kısa isimlendirme yerine uzun anlamlı isimlendirmeler daha iyidir. Örneğin "fileExt" değişkeninde ne olduğu konusunda kafa karışıklığa sebep olabilir. Bunun yerine "fileExtentions" şeklinde bir tanımlama daha anlaşılır olacaktır. Kısaltmalar farklı anlamlar taşıyor ise uzun isimlendirme kullanılmalıdır.
  • Kısaltmalar ancak for, while gibi döngülerde i,j ve k gibi tanımlamalar uygundur. Döngülerde bu harfleri kullanmakta bir sakınca yoktur.
  • Kendi kısaltmalarımız yerine evrensel kısaltmalar kullanmak en doğrusu olacaktır. Evrensel olmayan kısaltmalardan uzak durmak gerekir. Http, tcp gibi evrensel kısaltmalar bunlar arasındadır.
  • Metotlarınızda isimlendirmeye dikkat etmediğinizde karmaşık işlerde anlamanız daha da zor olacaktır. Doğru isimlendirmeler ile karmaşık işlerin bile anlaması kolaylaşacaktır.
  • Var olan bir metot ve buna ait bir isimlendirme vardır. Ama gün gelir o metodun işlevinde bir değişiklik olursa metodun da ismi değiştirilmesi gerekir. Aksi takdirde anlam karmaşasına sebep olup geliştiriciler için zamanla zorluk çıkaracaktır.
  • İsimlendirmelerin uzun olması da her zaman da doğru olacak diye bir şey yoktur. Gereksiz uzun isimlendirmelerde yanlıştır.
  • İsimlendirme genel olarak verilmez. Amacı ne ise açıkça belirtilir.
  • Aynı kelimeleri kullanan değişken isimlendirmelerinde dikkatli olunmalıdır. Benzer isimler de kodda karmaşaya sebep olabilir.
  • Aynı işleve benzer ama farklı iş yapacak işlemlerde isimlendirmeler sonuna 1,2,3 gibi sayılar yazarak isimlendirme yapmayın. Anlamlı isimlendirme yapın.
  • Sınıf-Metot-Değişken isimlendirmeleri birbirleriyle uyumlu olmalıdır. Yani kullanıcı ile ilgili bir sınıfımızda: User sınıfımızda metot isimlendirmeleri de user ile ilgili olmalı. Aynı zamanda da değişkenler de user ile ilgili olacak şekilde tanımlamamız gerekiyor.
  • Metin ve sayısal ifadeler için enumaration kullanılmalıdır. Böylece hata yapma olasılığınız neredeyse olmaz.
  • Genel olarak herkesin benimsediği isimlendirmelere uygun şekilde isimlendirme yapmaya gayret göstermek gerekiyor.
  • İsimlendirme konusunda ekip ve şirket olarak tutarlı olunması en iyi sonucu verecektir. Böylece şirket içinde veya dışında olsun kodun okunurluğu artacaktır.

Temiz Kod: Standartları ve Şekil

Kodun bazı standartları vardır. Bunun en bilineni değişken isimlendirme standartlarıdır. Bu isimlendirme standartlarına uygun isimlendirme yapılmalıdır. Bir yerde camelCase başka yerde snake_case standartlarına uygun isimlendirme yapmak yanlış olacaktır. C#'da genel olarak metot isimlendirmeleri PascalCase olarak yapılırken, değişken isimlendirmeleri camelCase olarak kullanılır.

PascalCase: FileExtentions

camelCase: fileExtentions

snake_case: file_extentions

kabab-case: file-extentions

Kodunuzun satır uzunluğu ekranın altındaki kaydırma çubuğunu kaydırmaya gerek olmadan okunacak şekilde olmasına gayret gösterilmelidir. Eğer satır uzunluğunu mevcut ekranınızın uzunluğunu geçiyor ise alt satıra geçmeniz en doğrusudur. Böylece geliştirici kodu okurken tek seferde okuyabilir ikinci bir işlem yapmaya gerek duymaz.

Temiz Kod: Dilin Kullanımı

Kodunuzdaki bir problemi çözmek için farklı kodlamalar yaparak ekleme yapmak anlam karmaşalarına neden olur. O yüzden hep dediğimiz gibi temiz kod ekleyerek değil bölüp parçalamak ile olur. Yazılımda sık karşılaşılan problem için tasarım kalıpları(design patterns) kullanılır. Her tasarım kalıbı belli sorunlara yönelik çözümler üretir. Frameworkler ise kodların standartları olmasını sağlar. Son olarak ise her yazılım diline ait idiomlar vardır. Bu idiomlar hangi durumda ne yapmamız gerektiği konusunda bize yok gösterir.

C# .Net idiomlarını detaylı incelemek için: tıklayın...

Temiz Kod: Dokümantasyon

Kodun anlaşılabilir olması için ilk başvurulan şey dokümantasyon olmamalıdır. Eğer böyle ise o kod zaten basit kod değildir. Yani temiz kod değildir. O yüzden öncelikle kodun clean code olması gerekiyor. Kod anlaşılır olsun ki dokümantasyona bile gerek olmasın. Zaten metot ve isimlendirmeler açık ve net olursa dokümantasyona da gerek olmayacaktır. Dokümantasyon ancak karmaşık işlemlerin olduğu geliştiriciye yön vermek istediğimiz durumlarda gereklidir.

Genel olarak geliştiriciler tek satırda yorum satırı yapmak için "//" kullanılır. Çoklu satırlar için ise "/*.......*/" kullanılır. Ama bunlar pek tercih edilmemelidir. Bunun yerine API dokümantasyonu tercih edilmelidir.

Ayrıca kodlarınızı yorum satırı halde iken projede bırakmayın. Yorum satırı olarak duracak kod yerine direk silmeniz en doğrusudur.

API Dokümantasyonu

Metotta yapılan işlem ile gerekli açıklamayı, eğer alıyorsa parametreleri ve geri dönüş değerleri gibi bilgiler içerir. API dokümantasyonu sınıf, arayüz ve metotlar için kullanılır. C# için API dokümantasyonu aşağıdaki gibi kullanılır:

Clean Code API Dokümantasyon

API Dokümantasyonu ilgili detaylı bilgi için:  tıklayın...

2-Temiz Kod: Odaklıdır(DRY)

Kodunuzda, metodunuzda ve sınıfınızda ne olursa olsun tek bir şeye odaklanmalıdır ve bir şeyi halletmelidir. Yani sınıf sadece bir şeye odaklanmalıdır. Metot sadece bir işi yapmalıdır. Sınıflar olabildiğince küçük olmalı gerekirse parçalanarak yeni sınıflar oluşturulmalıdır. Yazdığımız kodun tek bir hedefi olmalıdır. Bunu yaparken o işlevde ilgili her şey olmalı ama ilgisiz hiçbir şey olmamalıdır. Yani metotta ya da sınıfta gereken şeyleri barındırmaları eğer ora ile alakası yok ise o dışarıda tutulmalıdır. Örneğin user sınıfında file ile ilgili bir metot bulunmamalıdır.

Bir blokta yapılacak işi bir satırda yapmak, birkaç işi birleştirip tek metotta halletmek yanlış bir soyutlamadır. Her ne kadar kodu azalttığımızı ya da tek seferde işi yaptığını düşünsek bile. Ama öyle değil bir metot birçok işi tek seferde yapması ile bir metodun tek bir işi olması arasında çok büyük fark vardır.

Kodumuzu sürekli iyileştirerek mükemmelliğe ulaştırabilir. Bunun yaparken de ekleyerek değil çıkararak yapmalıyız.

DRY(Dont Repeat Yourself)

Odaklı kod yazabilmenin yanında kodumuz tekrarsız olması gerekiyor. DRY prensibine göre ne olursa olsun kodunuz tek bir yerde olmalıdır. Aynı kod aynı metot farklı yerlerde olmamalıdır. Tek bir yerde olmalıdır. Bunu yapabilmek için de copy-paste değil cut-paste ile sağlayabiliriz. Buna dikkat ederek kod yazmamız gerekiyor. Eğer o kod varsa ve siz kolay olsun diye kopyalayıp istediğiniz yerde tekrar yazarsanız bu kötü koda dönüşür.

3-Temiz Kod: Doğrudur

Bir kodun doğrulundan emin olabilmek için de testlere ihtiyaç duyarız. Birim testler sayesinde kodun doğrulundan emin olabiliriz. İleride tekrar o kod ile ilgili bir geliştirme yapacağımızda yine birim testlere ihtiyaç duyar ve kullanırız. Sonraki konularımızda ama kod yazdıktan sonra birim test yazmak pek mantıklı değildir. Bu birim testlerimiz TDD yöntemleri ile daha iyi sonuçlar verir. TDD ile iligli bilgilendirmeyi sonraki yazılarımda paylaşacağım.

4-Temiz Kod:Tamdır

Kodumuzun tam olması demek:

  • Olması gereken işi başarılı olarak yapması
  • Olmaması, istenmeyen şeye karşı önlem almış olması
  • Olabilecek olanı ön görmesidir.

Bununla birlikte kodu tam yapan şeyler aslında bizim şimdiye kadar bahsettiğimiz basitlik, odaklılık ve doğruluktur. Tüm bunların bir araya gelmesi ile tam bir kod ortaya çıkar. Clean code için ilk aşamada bunlara uyarak güzel geliştirmeler yapabiliriz. Eminim ki bunlara uymaya başladıkça siz de farklı anlayacaksınız.

Evet clean code ile ilgili girişimizi yaptık. Buna bağlı olarak diğer önemli hususlarda da yazılar hazırlayacağım. Bu bahsettiklerime eklemek istedikleriniz varsa benimle paylaşabilir ve yorum yapabilirsiniz.

Kaynak:

Akın Kaldıroğlu

https://www.c-sharpcorner.com/article/k-i-s-s-software-design-principle/

Umarım faydalı olmuştur. İyi çalışmalar dilerim.

  • Yorum yapabilmek için giriş yapmalısınız. Giriş yapmak için tıklayınız.

Diğer Yazılar

Clean Code: High Cohesion Low Coupling

17.05.2022 yasinsunmaz 1031 0

Clean Code içinde bahsedeceğimiz bir diğer konu ise "High Cohesion Low Coupling" yani "Yüksek Birliktelik ve Düşük Bağımlılık"'tır. &O...

Clean Code: İsimlendirmeler

27.04.2022 yasinsunmaz 691 0

Merhabalar Clean Code ile ilgili yazılarıma devam ederken biraz da örneklerin olduğu bir yazı yazmak istedim. İyi ve kötü örnekler üzerinden fark...

Clean Code: Least Astonishment Prensibi

21.04.2022 yasinsunmaz 573 0

Clean Code ve SOLID konuları ile birlikte bilmemiz gereken bir diğer prensip Principle of Least Astonishment'dir. Principle of Least Astonishment En Az Şaşkınlık Prensibi olara...

Clean Code: YAGNI Prensibi

20.04.2022 yasinsunmaz 1249 0

Clean Code ve SOLID konuları ile birlikte bilmemiz gereken bir diğer prensip YAGNI(You Ain’t Gonna Need It)'dir. Bu prensip genel anlamda vurguladığı şey: İhtiy...

Clean Code: DRY Prensibi

19.04.2022 yasinsunmaz 1107 0

Clean Code ve SOLID konuları ile birlikte bilmemiz gereken bir diğer prensip DRY(Don’t Repeat Yourself)'dir. Bu prensib genel anlamda vurguladığı şey: Kendini tekrar...

Dapr Nedir? Dapr'a Giriş

14.12.2024 yasinsunmaz 204 0

Mikroservislerin Gizemi: Karmaşık Altyapı Sorunlarına Kolay Çözüm Günümüzde mikroservis tabanlı uygulamalar geliştirmek, teknolojik açıdan...

RedisConnectionException Hatası ve Çözümü: AbortOnConnectFail=false

31.07.2023 yasinsunmaz 1703 0

Redis, popüler bir açık kaynaklı veri yapısı sunucusudur ve günümüzde birçok uygulama tarafından kullanılmaktadır. Ancak, bu tür veri tabanla...

ASP.NET Core Web API'de Parametre Bağlama Yöntemleri: FromQuery, FromBody ve FromRoute

12.07.2023 yasinsunmaz 2209 0

ASP.NET Core web API projeleri, istemcilerden gelen verileri API metotlarıyla etkileşimde bulunmak için kullanılır. Bu verileri doğru bir şekilde almak ve işlemek içi...

Deployment Stratejileri (Blue Green, Rolling Update/Rollback) Nedir?

23.06.2023 yasinsunmaz 1621 0

Yazılım geliştirme sürecinde, uygulamaları güncellemek ve yeni sürümleri piyasaya sürmek önemli bir adımdır. Ancak, kullanıcıların kesintisiz hizmet a...

SonarQube Kurulumu: Adım Adım Kılavuz

18.06.2023 yasinsunmaz 2500 0

SonarQube, açık kaynaklı bir statik kod analizi platformudur ve geliştiricilere kod kalitesini, güvenliğini ve performansını iyileştirmeleri için yardımcı olur. ...

Active Directory LDAP İle Kullanıcı Kimlik Doğrulama .NET

05.12.2022 yasinsunmaz 3273 0

Active Directory LDAP ile kullanıcıyı belirli bir filtre üzerinde arama veya kullanıcının kimliğini doğrulama işlemleri yapabilmekteyiz. Bu LDAP protokolünde DirectorySer...

SOLID Yazılım Prensipleri

26.11.2022 yasinsunmaz 1023 0

SOLID prensipleri yazılım geliştirmede başlarda anlayıp uygulaması zor olsa da buna uyarak kod geliştirmenin faydasını zamanla görebilirsiniz. Yazdığınız kodlarda sonradan yap...

Regex, Regular Expressions Genel Kullanımı

03.08.2022 yasinsunmaz 2776 0

Bir çok yazılım dilinde bazı kontroller için Regex ifadeler ihtiyaç duyabiliyoruz. Bunların en başında e-posta, telefon ve web site geliyor. Bunların doğruluğu...

Visual Studio'da Aynı Anda Birden Çok Proje Çalıştırma

21.05.2022 yasinsunmaz 4449 0

Katmanlı mimari projelerimizde ya da bir web sitenin kullanıcı arayüzü ve admin dediğimiz yönetici ekranları aynı uygulama içerisinde geliştirebiliyoruz. Admi...