Temiz kod yazma gayesi cok guzel. Kod yazarken aslinda onemli olan sey zaten teknikler, paradigmalar, konseptlerdir. Kod yazdigin paradigmaya, stile hakim olduktan, o stilde kod okuyabildikten sonra temiz kod yazabiliyorsun. Ornegin temiz buldugun python kodu ile kendi kodunu karsilastir. Kodunda basitlestirmeler yap, gozune karmasik gozuken yerlerin mutlaka ustune git, kullandigin dile, teknige, paradigmaya gore uygun bir cozum mutlaka bulacaksin.
Aslinda baktiginda zaten isin programcilik tarafi da bu. Kod yaziyorsun, sadece islevi onemli olsa programlama dilleri sadece isin en teknik tarafiyla ugrasirdi, muhtemelen sadece prosedurel programlama var olurdu. Sadece derleyiciler, yorumlayicilar, platform gibi kavramlar on planda olurdu ama aksine kod yazarken maintainability kavrami asil gayedir. Koda bir seyler eklemen gerektiginde cok ufak duzeltmelerle, eklemek icin cikarma yapmadan isini halledebiliyor olman gerekiyor. Bunun yaninda kodun okunakli olmasi da gerekiyor ama bu oldukca goreceli. Bana gore (ve haskell kullanmis insanlara) su kod super okunakli mesela:
-- https://www.codewars.com/kata/5287e858c6b5a9678200083c/haskell
module Narcissistic where
import Data.Char (digitToInt)
narcissistic :: Integral n => n -> Bool
narcissistic n = (== n) . fromIntegral . sum . map (\x -> x^len) $ digits
where digits = map digitToInt . show . toInteger $ n
len = length digits
Ve maintain edilebilir bir kod. Ama fonskiyonel programlamayla pek hasir nesir olmadiysaniz muhtemelen su kodu tercih edersiniz:
# (alintidir)
def narcissistic( value ):
value = str(value)
size = len(value)
sum = 0
for i in value:
sum += int(i) ** size
return sum == int(value)
Ilk kod haskell ile yazilmis ve fonksiyonel programlama paradigmasi kullanilmis. Diger kod ise python ve klasik imperatif stil. Tabii bunlar iki ayri paradigma, kendi icinde okunakli/okunaksiz kodlar da var, mesela su post cok guzel bir ornek:
Bir baska haskell ornegi (deklaratif):
getLine >>= readFile >>= putStrLn
Ayni kodun ayni dilde imperatif hali:
main = do
filename <- getLine
contents <- readFile filename
putStrLn contents
Ilk iki paragraftaki terimler hakkinda pek emin degilim, ifade etmeye calistigim seyi anlamissinizdir. Onerilere acigim.