שאלה בפורום תפוז: Properties ב - .NET
השאלה:
יש לי את הקוד הבא בקלאס כל שהוא:
private float _thickness;
internal float _Thickness
{
get
{
return _thickness;
}
set
{
_thickness = value;
}
}
השאלה שלי היא מה ההבדל בין _thickness לבין _Thickness?
אחד מהעקרונות ב - OOP (ר"ת של Object Oriented Programing) הוא Encapsulation (בעברית יכול להקרא גם "כימוס").
נניח שאתה יוצר Class כלשהו שיש לו התנהגות מסויימת, מבחינת המפתח שמשתמש בו, הקלאס (להלן "המחלקה") היא קופסה שחורה שעושה משהו. (לדוגמה המחלקה Random מחזירה מספר רנדומלי. מבחינתך זה לא משנה איך).
בכדי לממש מחלקה שתעשה פעולה כלשהי, לעתים יש צורך בשימוש במשתנים מסויימים. במקרה של הדוגמה שהבאת מדובר על private _thickness. סביר להניח שלא תרצה שהמתכנת שמשתמש במחלקה יוכל לגעת ב - thickness בצורה ישירה, מכיוון שהוא לא יודע איך המחלקה עובדת מאחורי הקלעים, ולכן זה עלול לגרום לתוצאות לא רצויות.
בכדי לחשוף את ה - thickness למפתח (נניח שאתה מעוניין לתת לו לראות מה הערך אך לא לשנות אותו), היה נהוג להשתמש במתודות שנקראות get_Thickness, ובכדי לקבוע את הערך ב - set_Tickness.
ה - set יכול לשמש גם לבדיקות (לדוגמה ה - thickness חייב להיות ערך חיובי, לכן לא תרצה שהמשתמש יוכל לגשת ל - thickness ולשים בו ערך שלילי). הפתרון לזה היה נראה כך (בלי Properties):
internal sealed class MyClass
{
private float _thickness;
public float get_Thickness()
{
return _thickness;
}
public void set_Thickness(float value)
{
if (value <= 0)
throw new InvalidArgumentException("Thickness must be
greater than 0!!!!11");
_thickness = value;
}
}
מיקרוסופט החליטו לתת פתרון למצב הזה (הקוד הזה מאוד מאוד נפוץ בתכנות OOPי), והציגו את ה - Properties,
הקוד עם Properties יראה כך:
internal sealed class MyClass
{
private float _thickness;
public float Thickness
{
get
{
return _thickness;
}
set
{
if (value <= 0)
throw new InvalidArgumentException("Thickness must be
greater than 0!!!!11");
_thickness = value;
}
}
}
ל -get ול - set האלו קוראים Properties, (גם getter ו - setter)
השימוש במחלקה יראה כך (בלי ועם Properties):
// Sample code without properties
MyClass mc = new MyClass();
mc.set_Tickness(1.0);
Console.WriteLine("{0}", mc.get_Tickness());
// Sample code with properties:
MyClass mc = new MyClass();
mc.Thickness = 1.0;
Console.WriteLine("{0}", mc.Thickness);
בשורה תחתונה מדובר על אותה פונקציונליות, רק הקוד נראה יותר אסתטי, ודורש פחות כתיבה עם properties (ה - properties מתורגמים בסופו של דבר לפונקציות get_xxx ו - set_xxx דבר שה - CLR דואגת לו).
דרך אגב Martin Fowler ו - Jeffrey Richter כתבו את דעתם והם לא ממש בעד העניין. מעניין לקרוא את דעתם.