Rust'ta Kapsamlı Yapı Parçalama: Derleyici Hatalarından Yararlanarak Daha Güvenli Kod Yazmak Yazılım

Rust'ta Kapsamlı Yapı Parçalama: Derleyici Hatalarından Yararlanarak Daha Güvenli Kod Yazmak

Rust'ta yapı alanlarını parçalarken tüm alanları listeleme gerekliliği başta sinir bozucu olsa da, bu yaklaşım aslında yazılım bakımını çok daha güven

Rust'a yeni başladığımda, bir yapıyı (struct) parçalarken tüm alanları sıralamak veya `..` sözdizimini kullanmak zorunda olmak beni rahatsız etmişti. Özellikle yazılım geliştirme sırasında sadece birkaç alana ihtiyaç duyduğumda, TypeScript'teki gibi basit bir `const { station_id, recorded_at } = weather_reading;` yazabilmek çok daha pratik görünüyordu. Haskell'de de `NamedFieldPuns` veya `RecordWildCards` uzantılarıyla daha kısa sözdizimleri mümkündü. Bu yüzden başlarda `weather_reading.station_id` şeklinde alanlara nokta ile erişmeyi tercih ettim.

Ancak son birkaç aydır, yapı parçalama (destructuring) yöntemini nokta erişimine göre çok daha fazla tercih etmeye başladım. Bunun nedeni, yazılımın bakımını önemli ölçüde daha güvenli hale getirmesi. Örneğin, tehlikeli hava koşullarını tespit eden bir fonksiyonumuz olduğunu düşünelim. Bu fonksiyon, bir `WeatherReading` yapısı üzerinde çalışıyor ve sıcaklık, nem ve basınç değerlerini kontrol ediyor. Eğer fonksiyonu nokta erişimiyle yazarsak, yapıya yeni bir alan (örneğin rüzgar hızı) eklendiğinde derleyici bizi uyarmaz ve fonksiyon güncellenmeden kalabilir.

Oysa aynı fonksiyonu kapsamlı yapı parçalama (exhaustive destructuring) ile yazarsak, yeni alan eklendiğinde derleyici `pattern does not mention field 'wind_speed'` hatası verir. Bu sayede, fonksiyonun yeni alanı da dikkate alması gerektiğini hemen fark ederiz. Bu teknik, özellikle CRUD web servislerinde farklı katmanlar (veri erişim, iş mantığı, API) arasında `From` implementasyonları yazarken çok kullanışlı. Bir katmana yeni bir alan eklediğinizde, derleyici bu alanın diğer katmanlara yayılıp yayılmayacağına karar vermenizi zorunlu kılar.

Rust'ta metodlar için doğrudan argüman listesinde `self` parçalanamadığından, metod içinde ayrı bir `let` ifadesi kullanmak gerekir. Bu biraz törensel olsa da, aynı güvenlik avantajını sağlar. Ayrıca, aynı alan grubunun sürekli birlikte parçalandığını görürseniz, bu alanları ayrı bir yapıya çıkarmak için iyi bir işarettir. Bu sayede kod daha modüler ve okunabilir hale gelir.

TypeScript'te benzer bir etkiyi `Required` türüyle elde edebilirsiniz. Haskell'de ise şu an için bu konuda bir çözüm bulunmuyor, ancak bir öneri mevcut. Kapsamlı parçalama, Rust'ın derleyici odaklı güvenlik anlayışıyla mükemmel uyum sağlıyor ve yazılım evrimi sırasında fark edilmeyen hataların önüne geçiyor.

Sonuç olarak, başta can sıkıcı gibi görünen bu özellik, aslında Rust'ın en güçlü yanlarından birini temsil ediyor. Derleyicinin sizi yeni alanlar konusunda uyarması, büyük projelerde zaman kazandırır ve bakım maliyetini düşürür. Bu nedenle, Rust'ta yapı parçalama kullanırken `..` kısaltmasından kaçınıp tüm alanları açıkça listelemek, uzun vadede daha güvenli kod yazmanıza yardımcı olacaktır.

Kaynak: antoine.vandecreme.net

Paylaş: