Iterator design Pattern

1 בMay 2013

 

ה”איטרטור” נשמע לנו קצת כמו “איטרציות” וזה מזכיר לנו
סיבובים בלולאה.. עפ”י המילון העברי איטרציה בשפה תקינה ניתן לומר
“חזרור”.. וואלה !! בכל מקרה מטרת התבנית כפי שהוצגה בתקופה
הפרהיסטורית, היא לאפשר גישה לאוספים (רשימות, מערכים, עצים)  של אובייקטים מבלי לחשוף את המבנה הפנימי או את
כל מה שהאובייקט מכיל, למעשה שימוש ב”איטרטור” הוא חלק מתהליך
האינקפסולציה.

ממשק איטרציות אינו
תלוי במימוש כזה או אחר, אלא מהווה דרך משותפת למעבר על רשימות בצורה
“מוגנת”בדוט נט לרוב ניתן  לומר
ש
Iteraror Pattern
== IEnumerable
 וזה קיים גם בסביבות פיתוח מקבילות בJava, C++.

כשאני
מגדיר על אובייקט מסויים שהוא מימוש של
IEnumerable זה נותן לי את היכולת
לעבור עליו באיטרציות של
ForEach. היחודיות של ForEach זה כמובן היכולת “לגלות לבד” מהם גבולות האוסף הנתון
ובהתאם לו לבצע איטרציות. מה שמסתדר מצוין עם הגדרת התבנית שזה סוג של אינקפסולציה
למבנה הכולל אוסף ואני רוצה להגן עליו.

 נתבונן רגע בדוגמא הבסיסית הבאה:

 public class Item : IEnumerable

    {

        private List<string> data;

        public Item()

        {

            data = new List<string>() 

            {

                “TT”“YY”

            };

        }

 

        public IEnumerable<string> GetData

        {

            get

            {

                foreach (var item in data)

                    yield return item;

            }

        }

 

 

        IEnumerator IEnumerable.GetEnumerator()

        {

            foreach (var item in data)

            {

                yield return item;

            }

        }

    }

 

    class Program

    {

        static void Main(string[] args)

        {

            Item item = new Item();

 

            foreach (var t in item.GetData)

            {

                Console.WriteLine(t);

            }

        }

    }

מה קורה בפונקציית הMain שלי?? אני מבצע forEach על… על… אובייקט
כלשהו שכולל מבנה נתונים מוגן..

אגב אפשר לדון איך מי
שמשתמש במבנה שלי יידע שיש לי יכולת של איטרטור, 
נניח אבל שבצורה הבאה אפשר להתעלם מהשאלה.

if (item is IEnumerable)
            {
                foreach (var t in item.GetData)
                {
                    Console.WriteLine(t);
                }
            }

 

דבר נוסף, איטרטור כתבנית
אמנם נראה כמו פרופרטי שמגן על גישה למאגר נתונים אבל לא להתבלבל. בשביל מטרה כזו
הייתי משתמש פשוט בפופרטי עם
Private Set , ולמהדרין  הייתי ממליץ לקרוא על ReadOnlyCollection .

בכל מקרה מדובר
בתבנית בסיסית מאוד שמתחברת מצויין לרעיון עיצוב תכנה בסביבה מונחית עצמים ומבוססת
אינקפסולציה.

 

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *

2 תגובות

  1. requin tn pas cher8 בMay 2013 ב 22:21

    Have a passion for might well known consideration for a life-style and then the growth of what a number of us take pleasure in. requin tn pas cher http://Niketnpascher029.fr/

    Reply