Книги Українською Мовою » 💛 Інше » Занурення в патерни проектування, Олександр Швець 📚 - Українською

Читати книгу - "Занурення в патерни проектування, Олександр Швець"

В нашій бібліотеці можна безкоштовно в повній версії читати книгу онлайн українською мовою "Занурення в патерни проектування" автора Олександр Швець. Жанр книги: 💛 Інше. Наш веб сайт ReadUkrainianBooks.com дає можливість читати повні версії улюблених книг на Вашому гаджеті (IPhone, Android) або комп’ютері абсолютно безкоштовно, без реєстрації та СМС. Також маєте можливість завантажити книги на свій гаджет у форматі PDF, EPUB, FB2. Файли електронних книг - це цифрові файли, які призначені для перегляду на спеціальних пристроях, що відомі як читальні пристрої для електронних книг.

Шрифт:

-
+

Інтервал:

-
+

Добавити в закладку:

Добавити
1 ... 41 42 43 ... 58
Перейти на сторінку:
що поля­гає в ефе­кти­вно­му збе­рі­га­нні даних. Деякі алго­ри­тми можу­ть бути аж зана­дто «зато­че­ні» під певну про­гра­му, а тому вигля­да­ти­му­ть непри­ро­дно в зага­льно­му класі колекції. Ріше­ння

Ідея пате­рна Іте­ра­тор поля­гає в тому, щоб вине­сти пове­ді­нку обхо­ду коле­кції з самої коле­кції в окре­мий об’єкт.

Іте­ра­то­ри містя­ть код обхо­ду коле­кції. Одну коле­кцію можу­ть обхо­ди­ти від­ра­зу декі­лька ітераторів.

Об’єкт-іте­ра­тор від­сте­жу­ва­ти­ме стан обхо­ду, пото­чну пози­цію в коле­кції та кількі­сть еле­ме­нтів, які ще зали­ши­ло­ся обі­йти. Одну і ту саму коле­кцію змо­жу­ть одно­ча­сно обхо­ди­ти різні іте­ра­то­ри, а сама коле­кція наві­ть не зна­ти­ме про це.

До того ж, якщо вам потрі­бно буде дода­ти новий спо­сіб обхо­ду, ви змо­же­те ство­ри­те окре­мий клас іте­ра­то­ра, не змі­нюю­чи існую­чо­го коду колекції.

Ана­ло­гія з життя

Варіа­нти про­гу­ля­нок Римом.

Ви пла­нує­те поле­ті­ти до Риму та обі­йти всі визна­чні пам’ятки за кілька днів. Але по при­їзді ви може­те довго блу­ка­ти вузьки­ми вули­чка­ми, нама­гаю­чи­сь зна­йти один тільки Колізей.

Якщо у вас обме­же­ний бюджет, ви може­те ско­ри­ста­ти­ся віртуа­льним гідом, вста­нов­ле­ним у сма­ртфо­ні, який дозво­ли­ть від­філь­тру­ва­ти тільки ціка­ві вам об’єкти. А може­те плю­ну­ти на все та найня­ти місце­во­го гіда, який хоч і обі­йде­ться в копіє­чку, але знає все місто, як свої п’ять пальців, і зможе «зану­ри­ти» вас в усі міські легенди.

Таким чином, Рим висту­пає коле­кцією пам’яток, а ваш мозок, наві­га­тор чи гід — іте­ра­то­ром коле­кції. Ви як кліє­нтський код може­те вибра­ти одно­го з іте­ра­то­рів, від­штов­хую­чи­сь від вирі­шу­ва­но­го зав­да­ння та досту­пних ресурсів.

Стру­кту­ра

Іте­ра­тор опи­сує інте­рфе­йс для досту­пу та обхо­ду еле­ме­нтів колекцій.

Конкре­тний іте­ра­тор реа­лі­зує алго­ри­тм обхо­ду якої­сь конкре­тної коле­кції. Об’єкт іте­ра­то­ра пови­нен сам від­сте­жу­ва­ти пото­чну пози­цію при обхо­ді коле­кції, щоб окре­мі іте­ра­то­ри могли обхо­ди­ти одну і ту саму коле­кцію незалежно.

Коле­кція опи­сує інте­рфе­йс отри­ма­ння іте­ра­то­ра з коле­кції. Як ми вже гово­ри­ли, коле­кції не завжди є спи­ском. Це може бути і база даних, і від­да­ле­не API, і наві­ть дере­во Компо­ну­ва­льни­ка. Тому сама коле­кція може ство­рю­ва­ти іте­ра­то­ри, оскі­льки вона знає, які саме іте­ра­то­ри зда­тні з нею працювати.

Конкре­тна коле­кція пове­ртає новий екзе­мпляр певно­го конкре­тно­го іте­ра­то­ра, зв’яза­вши його з пото­чним об’єктом коле­кції. Зве­рні­ть увагу на те, що сигна­ту­ра мето­ду пове­ртає інте­рфе­йс іте­ра­то­ра. Це дозво­ляє кліє­нто­ві не зале­жа­ти від конкре­тних кла­сів ітераторів.

Кліє­нт пра­цює з усіма об’єкта­ми через інте­рфе­йси коле­кції та іте­ра­то­ра. Через це кліє­нтський код не зале­жи­ть від конкре­тних кла­сів, що дозво­ляє засто­со­ву­ва­ти різні іте­ра­то­ри, не змі­нюю­чи існую­чо­го коду програми.

В зага­льно­му випа­дку кліє­нти не ство­рюю­ть об’єкти іте­ра­то­рів, а отри­мую­ть їх з коле­кцій. Тим не менше, якщо кліє­нто­ві потрі­бний спе­ціа­льний іте­ра­тор, він завжди може ство­ри­ти його самостійно.

Псе­вдо­код

У цьому при­кла­ді пате­рн Іте­ра­тор вико­ри­сто­вує­ться для реа­лі­за­ції обхо­ду неста­нда­ртної коле­кції, яка інка­псу­лює доступ до соціа­льно­го графа Facebook. Коле­кція надає декі­лька іте­ра­то­рів, які можу­ть обхо­ди­ти про­фі­лі людей різни­ми способами.

При­клад обхо­ду соціа­льних про­фі­лів через ітератор.

Зокре­ма, іте­ра­тор дру­зів пере­би­рає всіх дру­зів про­фі­лю, а іте­ра­тор колег філь­трує дру­зів згі­дно їхньої при­на­ле­жно­сті до компа­нії про­фі­лю. Всі іте­ра­то­ри реа­лі­зую­ть спі­льний інте­рфе­йс, який дає змогу кліє­нтам пра­цю­ва­ти з про­фі­ля­ми, не загли­блюю­чи­сь у дета­лі робо­ти з соціа­льною мере­жею (напри­клад, авто­ри­за­цію, надси­ла­ння REST запи­тів та інше).

Крім того, Іте­ра­тор позбав­ляє код від прив’язки до конкре­тних кла­сів коле­кцій. Це дозво­ляє дода­ти під­трим­ку іншо­го виду коле­кцій (напри­клад, LinkedIn), не змі­нюю­чи кліє­нтський код, який пра­цює з іте­ра­то­ра­ми та колекціями.

// Загальний інтерфейс колекцій повинен визначити фабричний
// метод для виробництва ітератора. Можна визначити відразу
// кілька методів, щоб дати користувачам різні варіанти обходу
// однієї і тієї самої колекції.
interface SocialNetwork is
  method createFriendsIterator(profileId): ProfileIterator
  method createCoworkersIterator(profileId): ProfileIterator


// Конкретна колекція знає, об'єкти яких ітераторів потрібно
// створювати.
class Facebook implements SocialNetwork is
  // ... Основний код колекції ...

  // Код отримання потрібного ітератора.
  method createFriendsIterator(profileId) is
    return new FacebookIterator(this, profileId, "friends")
  method createCoworkersIterator(profileId) is
    return new FacebookIterator(this, profileId, "coworkers")


// Загальний інтерфейс ітераторів.
interface ProfileIterator is
  method getNext(): Profile
  method hasMore(): bool


// Конкретний ітератор.
class FacebookIterator implements ProfileIterator is
  // Ітератору потрібне посилання на колекцію, яку він
  // обходить.
  private field facebook: Facebook
  private field profileId, type: string

  // Кожен ітератор обходить колекцію, незалежно від інших,
  // тому самостійно відслідковує поточну позицію обходу.
  private field currentPosition
  private field cache: array of Profile

  constructor FacebookIterator(facebook, profileId, type) is
    this.facebook = facebook
    this.profileId = profileId
    this.type = type

  private method lazyInit() is
    if (cache == null)
      cache = facebook.socialGraphRequest(profileId, type)

  // Всі конкретні ітератори реалізують методи загального
  // інтерфейсу по-своєму.
  method getNext() is
    if (hasMore())
      currentPosition++
      return cache[currentPosition]

  method hasMore() is
    lazyInit()
    return currentPosition < cache.length


// Ось іще корисна тактика: ми можемо передавати об'єкт
// ітератора замість колекції до клієнтських класів. При такому
// підході клієнтський код не матиме доступу до колекцій, а
// значить, його не турбуватимуть подробиці їхньої реалізації.
// Йому буде доступний лише загальний інтерфейс ітераторів.
class SocialSpammer is
1 ... 41 42 43 ... 58
Перейти на сторінку:

 Увага!

Сайт зберігає кукі вашого браузера. Ви зможете в будь-який момент зробити закладку та продовжити читання книги «Занурення в патерни проектування, Олександр Швець», після закриття браузера.

Коментарі та відгуки (0) до книги "Занурення в патерни проектування, Олександр Швець"