PowerShell’de hesaplanmış özellik yazarken her zaman aynı yapıyı kullanmanız gerekmez; seçiminiz, sıranın gerçekten önemli olup olmamasına göre değişir. Sıra önemliyse kullanın, değilse hashtable çoğu hesaplanmış özellik senaryosunda yeterlidir.
Bu ayrım pratikte iki soruyu çözer: Select-Object içinde yalnız yeni alan ekliyor musunuz, yoksa raporun sütun düzenini de sabitlemek mi istiyorsunuz? İlk durumda basit bir hashtable iş görür; ikinci durumda OrderedDictionary veya ile düzeni koruyan bir yapı tercih etmek gerekir.
Ama çıktıların insan gözüyle okunacağı bir tablo, rapor ya da CSV benzeri bir düzen kuruyorsanız, sadece özellik eklemek yetmez. O durumda ana mesele, alanların hangi sırayla görüneceğidir. Hashtable anahtar sırasını garanti etmediği için, sütun düzenini korumak istiyorsanız @{} ile OrderedDictionary kullanmanız daha güvenlidir.
Bu yaklaşımın güçlü yanı, kısa ve doğrudan olmasıdır. Örneğin değeri dönüştürmek, sabit bir etiket eklemek ya da sayısal bir alanı metne çevirmek gibi durumlarda sıraya bağımlı değilsinizdir. Dolayısıyla yapıyı sırf düzenli görünsün diye büyütmek yerine, hashtable ile işin özünü korumak daha uygundur.
Bu fark özellikle aynı nesneden birkaç alan çıkarıp ekrana, dosyaya ya da başka bir araca aktarıyorsanız önemlidir. Alan adları doğru olsa bile sıra değişirse okunabilirlik düşer. O yüzden “çıktı doğru görünsün” isteği ile “çıktı sırası sabit kalsın” isteği aynı şey değildir; ilki için hashtable yetebilir, ikincisi için ordered yapı gerekir.
Ancak burada da sıralama ihtiyacını ayrıca düşünmek gerekir. PSCustomObject özellikleri nesne olarak sunar; ama “hangi alan önce görünecek?” sorusu, nesneyi nasıl oluşturduğunuza bağlıdır. Bu yüzden nesne temelli akış ile düzen sabitleme ihtiyacını karıştırmamak gerekir.
Bu kuralın pratik değeri şudur: aynı PowerShell söz dizimi, üç farklı ihtiyaca hizmet edebilir ama hepsi aynı sorun değildir. Biri özellik tanımıdır, biri çıktı düzenidir, biri de veri taşıma biçimidir. Doğru seçim, önce hangi sorunu çözdüğünüzü ayırınca netleşir.
Bu ayrım pratikte iki soruyu çözer: Select-Object içinde yalnız yeni alan ekliyor musunuz, yoksa raporun sütun düzenini de sabitlemek mi istiyorsunuz? İlk durumda basit bir hashtable iş görür; ikinci durumda OrderedDictionary veya ile düzeni koruyan bir yapı tercih etmek gerekir.
PowerShell’de Hangi Yapı Ne İçin Kullanılır?
Hesaplanmış özellik yazarken amaç, mevcut nesnenin üstüne yeni bir alan eklemektir. Bu iş için Select-Object ile hashtable biçimi yaygın ve doğrudur; çünkü PowerShell burada ifadeyi bir özellik tanımı olarak yorumlar. Sıra beklentiniz yoksa bu, en kısa ve en okunabilir yoldur.Ama çıktıların insan gözüyle okunacağı bir tablo, rapor ya da CSV benzeri bir düzen kuruyorsanız, sadece özellik eklemek yetmez. O durumda ana mesele, alanların hangi sırayla görüneceğidir. Hashtable anahtar sırasını garanti etmediği için, sütun düzenini korumak istiyorsanız @{} ile OrderedDictionary kullanmanız daha güvenlidir.
Select-Object İçinde Hashtable Ne Zaman Yeterli?
Select-Object’in calculated property desteği, bir özelliği anlık hesaplayıp yeni adla çıktıya eklemek için tasarlanmıştır. Burada sadece tek bir alanı üretmek, mevcut bir alanı yeniden adlandırmak veya basit bir türetme yapmak istiyorsanız hashtable kullanımı yeterlidir.Bu yaklaşımın güçlü yanı, kısa ve doğrudan olmasıdır. Örneğin değeri dönüştürmek, sabit bir etiket eklemek ya da sayısal bir alanı metne çevirmek gibi durumlarda sıraya bağımlı değilsinizdir. Dolayısıyla yapıyı sırf düzenli görünsün diye büyütmek yerine, hashtable ile işin özünü korumak daha uygundur.
Sütun Sırası Önemliyse Ne Seçilmeli?
Rapor okuyan kişi alanların yerini de anlamlı bulacaksa, hashtable yerine @{} daha doğru seçimdir. Çünkü PowerShell’de normal hashtable’ın anahtar düzeni garanti edilmez; buna karşılık ordered dictionary, girdileri eklediğiniz sırayla saklar.Bu fark özellikle aynı nesneden birkaç alan çıkarıp ekrana, dosyaya ya da başka bir araca aktarıyorsanız önemlidir. Alan adları doğru olsa bile sıra değişirse okunabilirlik düşer. O yüzden “çıktı doğru görünsün” isteği ile “çıktı sırası sabit kalsın” isteği aynı şey değildir; ilki için hashtable yetebilir, ikincisi için ordered yapı gerekir.
| Yapı | Ne zaman seçilir |
|---|---|
| Hashtable | Anahtar sırası güvenilir değildir; değer erişimi için uygundur, çıktı sırası beklemeyin. |
| [ordered]@{} | Eklediğiniz sırayı korur; rapor, tablo ve okunabilir çıktı için tercih edilir. |
| Select-Object calculated property | Yeni özellik eklemek için hashtable biçimi yeterlidir. |
| PSCustomObject | Özellikleri nesne olarak taşır; düzenli çıktı gerekirken hashtable yerine düşünülebilir. |
| Sıra kritikse | Hashtable değil, [ordered] söz dizimini seçin. |
PSCustomObject Ne Zaman Daha Uygun?
daha çok veriyi nesne biçiminde taşımak istediğinizde anlam kazanır. Birkaç alanı bir arada tutup sonra bunları daha sonra boru hattında işlemek, filtrelemek ya da başka komutlara vermek istiyorsanız, bu yapı çoğu zaman daha temiz bir sonuç verir.Ancak burada da sıralama ihtiyacını ayrıca düşünmek gerekir. PSCustomObject özellikleri nesne olarak sunar; ama “hangi alan önce görünecek?” sorusu, nesneyi nasıl oluşturduğunuza bağlıdır. Bu yüzden nesne temelli akış ile düzen sabitleme ihtiyacını karıştırmamak gerekir.
Tek Cümlelik Karar Kuralı
Yeni bir hesaplanmış özellik ekliyorsanız ve sıra önemsizse hashtable kullanın. Sıra önemliyse @{} seçin. Veriyi daha sonra nesne olarak taşımak istiyorsanız PSCustomObject düşünün.Bu kuralın pratik değeri şudur: aynı PowerShell söz dizimi, üç farklı ihtiyaca hizmet edebilir ama hepsi aynı sorun değildir. Biri özellik tanımıdır, biri çıktı düzenidir, biri de veri taşıma biçimidir. Doğru seçim, önce hangi sorunu çözdüğünüzü ayırınca netleşir.