162 viewsC#Yöntemleri Kullanarak Kapsülleme
0

C# Yöntemleri Kullanarak Kapsülleme nasıl yapılır ?

Cevaplanan soru
0

İlk olarak, alanları gizlemek için yöntemleri kullanmayı özetleyelim.
Bilgisayar ekranındaki bir noktayı x ve y koordinatları olarak gösteren aşağıdaki yapıyı
düşünün. x-koordinatı için geçerli aralığın 0 ile 1280 arasında olduğunu ve y-koordinatı için
de geçerli aralığın 0 ile 1024 arasında olduğunu varsayın:
struct ScreenPosition
{
public ScreenPosition(int x, int y)
{
this.X = rangeCheckedX(x);
this.Y = rangeCheckedY(y);
}
public int X;
public int Y;
private static int rangeCheckedX(int x)
{
if (x 1280)
{
throw new ArgumentOutOfRangeException(“X”);
}
return x;
}
private static int rangeCheckedY(int y)
{
if (y 1024)
{
throw new ArgumentOutOfRangeException(“Y”);
}
return y;
}
}
Bu yapı ile ilgili bir problem, kapsüllemenin altın kuralına uymamasıdır; yani, verisi özel
(private) değildir. Ortak (public) veri kötü bir fikirdir çünkü kullanımı denetlenmez. Örneğin,
ScreenPosition kurucu aralığı parametrelerini denetler fakat böyle bir denetim ortak alanlara
“ham” erişim üzerine yapılamaz. Er ya da geç (büyük olasılıkla hemen), programlama hatası
sonucu olarak, X ya da Y aralığının dışına düşecektir:
ScreenPosition origin = new ScreenPosition(0, 0);

int xpos = origin.X;
origin.Y = -100; // oops
Bu problemi çözmek için yaygın yöntem, alanları özel yapmak ve her özel alanın değerini
sırasıyla okumak ve yazmak için bir değiştirici yöntem ve bir erişimci yöntemi eklemektir.
Değiştirici yöntemler daha sonra yeni alan değerlerinde aralık denetimi yapabilirler. Örneğin,
aşağıdaki kod X alanı için bir erişimci (GetX) ve bir değiştirici (SetX) içerir. SetX ’ in parametre
değerini nasıl denetlediğine dikkat edin.
struct ScreenPosition
{

public int GetX()
{
return this.x;
}
public void SetX(int newX)
{
this.x = rangeCheckedX(newX);
}

private static int rangeCheckedX(int x) { … }
private static int rangeCheckedY(int y) { … }
private int x, y;
}
Kod artık aralık kısıtlamalarını başarıyla uygular, bu da iyidir. Bununla birlikte, bu değerli
garanti için ödenmesi gereken bir bedel vardır (ScreenPosition artık doğal bir alan benzeri
sözdizimine sahip değildir; bunun yerine artık yöntem temelli sözdizimine sahiptir). Aşağıdaki
örnek, X ’ in değerini 10 artırır. Bunu yapmak için, GetX erişimci yöntemini kullanarak X ’ in
değerini okumak ve SetX değiştirici yöntemini kullanarak X ’ in değerini yazmak zorundadır.
int xpos = origin.GetX();
origin.SetX(xpos + 10);
Bunu X alanı ortak olduğunda kullanılan denk kodla karşılaştırın:
origin.X += 10;
Hiç şüphe yok ki, bu durumda alanları kullanmak daha kısa, daha açık ve daha kolaydır.
Ne yazık ki, ortak (public) alanları kullanmak kapsüllemeyi kırar. Özellikler, her iki örneğin
iyi yönlerini birleştirmenizi sağlar: alan benzeri sözdizimine izin verirken, kapsüllemeyi de
sürdürmek.

Cevaplanan soru
Choose A Format
Personality quiz
Series of questions that intends to reveal something about the personality
Trivia quiz
Series of questions with right and wrong answers that intends to check knowledge
Poll
Voting to make decisions or determine opinions
Story
Formatted Text with Embeds and Visuals
List
The Classic Internet Listicles
Countdown
The Classic Internet Countdowns
Open List
Submit your own item and vote up for the best submission
Ranked List
Upvote or downvote to decide the best list item
Meme
Upload your own images to make custom memes
Video
Youtube, Vimeo or Vine Embeds
Audio
Soundcloud or Mixcloud Embeds
Image
Photo or GIF
Gif
GIF format