Використання поліморфізму і композиції – Android

&nbsp

При розробці для Android, як і в інших обєктно-орієнтованих середовищах, застосовуються поліморфізм і композиція – чудові інструменти, що доповнюють середовище розробки У попередньому прикладі були продемонстровані як поліморфізм, так і композиція Давайте ненадовго зупинимося, загострити увагу на цих концепціях і заново розглянемо їх цінність – тепер в контексті цілей розробки

Анонімний примірник TextWatcher, переданий addTextChangedListener в якості обєкта зворотного виклику, використовує композицію для реалізації такої поведінки Примірник сам по собі не реалізує ніяких поводжень Замість цього він делегує завдання реалізації методу handleTextChange, що належить до моделі MyModel, воліючи реалізацію відносини has-a реалізації самого необхідного поводження Таким чином, функції ясно і чітко розділяються Якщо MyModel потрібно розширити ще сильніше, наприклад, для застосування тексту, одержуваного з іншого джерела, то нове джерело також використовуватиме handleTextChange Чи не доведеться відстежувати код відразу в декількох окремих анонімних класах

На даному прикладі також демонструється використання поліморфізму Примірник, переданий методу addTextChangedListener, володіє сильною статичної типізацією Це анонімний підтип TextWatcher Дана конкретна реалізація – у нашому випадку делегування завдання handleTextChange в MyModel-практично напевно не буде походити ні на одну іншу реалізацію даного інтерфейсу Проте, оскільки це реалізація інтерфейсу TextWatcher, він матиме статичну типізацію, незалежно від того, як саме він виконує своє завдання Компілятор може гарантувати, що методом addTextChangedListener в EditText передаються тільки такі обєкти, які як мінімум призначені для виконання поставленого завдання Реалізація не застрахована від помилок, але як мінімум addTextChangedListener ніколи не отримає обєкт, призначений для обробки мережевих подій У цьому і є суть поліморфізму

У даному контексті слід згадати про один антіпаттерне, так як він зустрічається дуже часто Багато розробники вважають анонімні класи занадто розлогим і незграбним способом передачі покажчика до функції Щоб обійтися без анонімних класів, такі розробники взагалі опускають обєкт-міс-Сенджер ось так:

У деяких ситуаціях такий підхід виправданий Якщо клієнт зворотного виклику (в даному випадку модель MyModel) малий, простий і використовується всього в двох контекстах, код вийде ясним і доречним

З іншого боку (про це підказує назва MyModelкласс буде широко використовуватися при досить різних обставинах, а в цьому випадку спроба обійтися без класів-месенджерів порушує инкапсуляцию і обмежує можливості розширення коду Очевидно, якщо таку реалізацію доведеться розширити для обробки введення, одержуваного з другого TextBox, і задіяти при цьому інша поведінка, код вийде плутаним

Але практично так само порочна і ситуація, іноді звана забрудненням інтерфейсу (interface pollution) Вона виникає, коли описана вище ідея виражається надмірно сильно Виходить щось подібне:

Подібний код в певному сенсі здається заманливо-елегантним, такий код зустрічається досить часто Але, на жаль, тепер MyModel занадто тісно повязана з усіма оброблюваними нею подіями

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

Джерело: Android Програмування на Java для нового покоління мобільних пристроїв

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*