Soru geçmişi
Visual Basic'de özellikler, değerleri elde etme ve atama mantığını kapsüllemek için izin verir. Özelliklerin tanıtılması ile kod, doğrudan nesne alanlarına erişim ihtiyacını ortadan kaldırarak daha okunabilir ve güvenli hale gelir ve doğrulama veya hesaplama mantığının nesnelerde doğrudan uygulanmasını kolaylaştırır.
Sorun
Yeni başlayanlar genellikle alanı genel (public) olarak yapar veya mantık içermeyen otomatik özellikler kullanır, bu da kapsülleme ihlali veya hesaplanabilir değerlerin uygulanamaz hale gelmesine neden olur. Bir diğer sorun ise, özelliğin kendisini sürekli olarak çağıran bir döngü oluşturmasıdır ki bu da StackOverflow'a yol açar.
Çözüm
Visual Basic'de, özel bir alan tanımlanır ve özellik, gerekli mantıkla birlikte Get ve Set bloklarını içerir. Hesaplanan özellikler yalnızca Get kullanarak özel alanlara dayalı hesaplanan bir değer döndürür. Set bloğunda her zaman özel alana başvurmak gerekir, böylece sonsuz döngüden kaçınılır.
Kod örneği:
Private _price As Decimal Private _quantity As Integer Public Property Total As Decimal Get Return _price * _quantity ' hesaplanan özellik End Get End Property Public Property Price As Decimal Get Return _price End Get Set(value As Decimal) If value < 0 Then Throw New ArgumentException("Fiyat pozitif olmalıdır") _price = value End Set End Property
Ana özellikler:
Set Price içinde Name özelliğine başvurulabilir mi, eğer o da özel bir alan ile uygulanmışsa?
Evet, Price özelliğinin Set bloğunda başka bir özelliğe (örneğin, Name) başvurulması mümkündür; çünkü farklı özel alanlara yapılan çağrılar döngü oluşturmaz. Ancak, kendi içeriğine başvurmaktan kaçınılmalıdır: Set Price içinde Price çağrılırsa, döngü oluşur.
Kod örneği:
Public Property Name As String Get Return _name End Get Set(value As String) _name = value End Set End Property Public Property Price As Decimal Get Return _price End Get Set(value As Decimal) If Name Is Nothing Then _name = "varsayılan" _price = value End Set End Property
Get bloğu içinde özellik tekrar çağrılırsa ne olur?
Bu sonsuz döngüye ve StackOverflow'a yol açar. Get bloğunda her zaman özel alanı kullanın, aksi takdirde özellik kendisini çağırır.
Public Property Amount As Decimal Get Return Amount ' sonsuz döngüye yol açar End Get Set(value As Decimal) _amount = value End Set End Property
Sadece yazma özellikleri (WriteOnly) tanımlanabilir mi ve bu ne kadar tehlikeli?
Yazma özellikleri vardır, ancak bunların kullanımı önerilmez; çünkü nesne, değer döndüremediği için okunabilirlik ve öngörülebilirlik kaybolur. Eğer yalnızca yazma için ihtiyaç varsa, mimariyi gözden geçirmek daha iyidir.
Private _secret As String Public WriteOnly Property Secret As String Set(value As String) _secret = value ' Yazmak mümkün, almak mümkün değil. End Set End Property
Programcı, Price alanını genel yaptı ve doğrudan onunla çalıştı. Sonuç olarak, Price bazen hatalı olarak negatif değerler alıyordu.
Artılar:
Eksiler:
Bir meslektaş, Price'ı özel alan ve set bloğunda doğrulama ile bir özellik haline getirdi ve bu da hatalı değerleri önledi.
Artılar:
Eksiler: