- John Carmack, değiştirilebilir değişkenlerin (mutable variable) kullanımına dair kişisel görüşünü paylaştı
- Python kullanırken ‘tek atama (single assignment)’ ilkesini ihmal eder hale geldiğini, bu konuda kişinin kendini uyarması gerektiğini belirtti
- Döngülerdeki yinelemeli hesaplamalar dışında değişkenlerin yeniden atanmasından veya güncellenmesinden kaçınılması gerektiğini vurguladı
- Tüm ara hesaplama adımları elde tutulduğunda bunun debugging sırasında yardımcı olduğunu ve kod blokları taşınırken önceki değerlerin istemeden kullanılmasının önüne geçtiğini söyledi
- C/C++’ta neredeyse tüm değişkenleri ilk tanımlandıkları anda
const olarak bildirmeyi iyi bir alışkanlık olarak tanımladı
- Son olarak, “keşke
mutable bir anahtar kelime olsaydı” diyerek, değişmezliğin varsayılan olmasını istediğini vurguladı
1 yorum
Hacker News görüşleri
Clojure kullandığım 2 yılın ardından, değişmezliğin sağladığı açıklığı başka geliştiricilere anlatmanın gerçekten zor olduğunu fark ettim
Durum değişikliği üzerinden etki yaratmaya alışmış kişiler, bunu bizzat deneyimlemeden anlamakta zorlanıyor
Örneğin
x = 7; x = x + 3; x = x / 2şeklinde yazarsanız sırayı değiştirince hata oluşmayabilir ama sonuç değişirBuna karşılık
x1,x2gibi yeni değişkenler kullanırsanız, yanlış sırada hata oluşur ve sorun açıkça görünürSonuç olarak tek atama (single assignment), bu tür bağımlılıkları açıkça ifade etmenin bir yoludur
Fonksiyonel dil kullanmamış iş arkadaşlarıma, fonksiyon merkezli düşünmenin ne kadar test edilmesi kolay ve temiz olduğunu anlatsam da pek karşılık bulmadı
Python'da fonksiyonel stili okunaklı biçimde yazmak zor, JS ise bu konuda bana daha iyi geliyor
Sonuçta yalnızca meraklı geliştiriciler Clojure gibi dilleri denemeye yöneliyor
Fonksiyonun dış durumu bilmesi gerekmez, dışarıdakilerin de fonksiyonun içini bilmesi gerekmez
Programın tüm durumunu bilmeden de belirli bir fonksiyonu bağımsız olarak test edebilir veya hata ayıklayabilirsiniz
Haskell topluluğunun sonunda tür sistemi içinde değişebilirliği yeniden icat etmeye çalışması ilginç
Asıl mesele, yan etkileri en düşük maliyetle kontrol etmektir
Haskell, tür sistemi nedeniyle giriş eşiği yüksekti; F# ise fazla uzlaşmacı kaldığından C# sözdizimiyle kod yazmaya dönüyordum
Clojure'un homoiconicity özelliği ve güçlü veri yapıları sayesinde, “değerlerle çalışmak” fikri ilk kez gerçekten netleşti
Profesyonel olarak kullanmayacak olsam da, fonksiyonel dil ya da Lisp deneyimi olmayan herkese kesinlikle tavsiye ederim
Değişkenlerin varsayılan olarak değişmez olmasını ve her şeyin bir ifade (expression) olmasını isterdim
Ama gerçek hayatta bir Clojure geliştiricisi olarak Python istilasıyla uğraşıyorum
Artık ben de TypeScript istilasıyla uğraşıyorum, o yüzden empati kurabiliyorum
Bu yaklaşım, değişiklik kapsamını sınırlamak için gerçekten çok faydalı
Diller arası kabile savaşlarına kapılmana gerek yok
Verimlilik artışı çağında bu sınırların pek anlamı kalmadı
Don’t Call Yourself a Programmer yazısını tavsiye ederim
Değişken yeniden atamasını en aza indirmeye çalışıyorum ama sık sık değişken gölgeleme kullanıyorum
result = result.process()gibi kalıpları kısa olduğu için seviyorumÖrneğin
process()bir doğrulama fonksiyonuysa, hangi anda işlenmiş değerden söz edildiği belirsizleşebilirBu yüzden durumu isimlerle net biçimde ayırmak daha iyidir
Örnek:
result = x |> foo |> bar |> bazveya(-> x foo bar baz)result.process()ne demek, hangi result ve hangi process?”Kodu sonra okuyacak kişi için kafa karıştırıcı olabilir
result) olan bir şeyi tekrar işlemek (process) mantıksal olarak tuhaf duruyor“Değişken (variable)” teriminin kendisi hep aklıma takılır
Değişmezse neden variable deniyor?
Rust'ta ancak
mutile açıkça belirtilirse değiştirilebilirBuna karşılık C'de sabit oluşturmak için önişlemciye başvurmak gerekebildiğinden kafa karıştırıcıdır
xparametresi, her çağrıda farklı bir değer alabildiği için kendi başına değişen bir değerdirYeniden atama olmasa bile ona değişken denebilir
Programlama bu kavramı doğrudan devralmıştır
Sabit (constant) ise tüm çalıştırmalarda aynı değeri taşır
Variable (mathematics) bağlantısına bakılabilir
IDE'nin bir değişkenin değiştirilip değiştirilmediğini görsel olarak göstermesi güzel olurdu
Mesela değiştirilmiş değişkenler hafifçe işaretlenebilir
Mümkün olduğunca çok
finalkullanmak, kodu daha okunabilir ve bakımı daha kolay hale getiriyorIDE uyarı vermeli ve yalnızca gerçekten gerektiğinde değişikliğe izin verilmeli
Rich Hickey'nin set vs list anlatısında olduğu gibi, anlamı açıkça ifade eden yapılar seçilmeli
Geçmişte thread safety için değişmezliğin katı biçimde uygulandığı bir projede çalıştım
Bu sayede kod daha okunabilir hale geldi ve neyin değişebileceğini takip etmek kolaylaştı
O günden beri değişmezliğin ateşli bir hayranıyım
Büyük bir Haskell kod tabanında çalıştıktan sonra yeniden C'ye dönünce, değişmezliğin varsayılan olmasını istemeye başladım
constyeterli gelmiyorGerçekten değiştirmek için pointer kullanmanız gerekir; C++ ise yalnızca bir fonksiyon çağrısıyla bile argümanları değiştirebildiğinden daha opaktır
“Neredeyse tüm değişkenleri const olarak tanımlamak iyidir” sözüne katılıyorum
Burada Rust'ın anılması yerinde olur
Varsayılanın değişmez olduğu ve yalnızca belirli bir blok içinde mutable'a izin veren bir sözdizimi hayal ediyorum
Mesela Python'daki
withbloğu gibiBlok dışına çıkınca tekrar değişmez hale gelmesi gibi
Rust'ın borrow checker mekanizmasına bakınca bu fikrin ne kadar karmaşık olduğu görülebilir
“State is the enemy” diye bir söz vardır
Durum arttıkça test edilmesi gereken koşullar katlanarak büyür
Değişmezlik, bu tür durum patlamasını önlemenin bir yoludur
Separation of Church and State