Мегаобучалка Главная | О нас | Обратная связь


Обеспечение инкапсуляции



2019-07-03 242 Обсуждений (0)
Обеспечение инкапсуляции 0.00 из 5.00 0 оценок




Для обеспечения инкапсуляции класс должен предотвращать непосредственный доступ к своим данным. Если переменная в классе объявлена как открытая, то другие части программы смогут напрямую изменять и считывать данные из нее. Если позднее представление данных изменится, то любые части программы, которые непосредственно взаимодействуют с данными, также должны будут измениться. При этом теряется преимущество инкапсуляции.

Чтобы обеспечить доступ к данным, класс должен использовать процедуры для работы со свойствами. Например, следующие процедуры позволяют другим частям программы просматривать и изменять значение DegreesF объекта Temperature.

 

Private m_DegreesF As Single ' Градусы Фаренгейта.

 

Public Property Get DegreesF() As Single

DegreesF = m_DegreesF

End Property

 

Public Property Let DegreesF(new_DegreesF As Single)

m_DegreesF = new_DegreesF

End Property

 

Различия между этими процедурами и определением m_DegreesF как открытой переменной пока невелики. Тем не менее, использование этих процедур позволяет легко изменять класс в дальнейшем. Например, предположим, что вы решите измерять температуру в градусах Кельвина, а не Фаренгейта. При этом можно изменить класс, не затрагивая остальных частей программы, в которых используются процедуры свойства DegreesF. Можно также добавить код для проверки ошибок, чтобы убедиться, что программа не попытается передать объекту недопустимые значения.

 

Private m_DegreesK As Single ' Градусы Кельвина.

 

Public Property Get DegreesF() As Single

DegreesF = (m_DegreesK - 273.15) * 1.8

End Property

 

Public Property Let DegreesF(ByVal new_DegreesF As Single)

Dim new_value As Single

 

new_value = (new_DegreesF / 1.8) + 273.15

If new_value < 0 Then

   ' Сообщить об ошибке ‑ недопустимое значении.

   Error.Raise 380, "Temperature", _

   "Температура должна быть неотрицательной."

Else

   m_DegreesK = new_value

End If

End Property

 

 

======357

 

Программы, описанные в этом материале, безобразно нарушают принцип инкапсуляции, используя в классах открытые переменные. Это не слишком хороший стиль программирования, но так сделано по трем причинами.

Во‑первых, непосредственное изменение значений данных выполняется быстрее, чем вызов процедур свойств. Большинство программ уже и так несколько теряют в производительности из‑за использования ссылок на объекты вместо применения более сложного метода псевдоуказателей. Применения процедур свойств еще сильнее замедлит их работу.

Во‑вторых, многие программы демонстрируют методы работы со структурами данных. Например, сетевые алгоритмы, описанные в 12 главе, непосредственно используют данные объекта. Указатели, которые связывают узлы в сети друг с другом, составляют неотъемлемую часть алгоритмов. Было бы бессмысленно менять способ хранения этих указателей.

И, наконец, благодаря использованию открытых значений данных, код становится проще. Это позволяет вам сконцентрироваться на алгоритмах, и этому не мешают лишние процедуры работы со свойствами.

Полиморфизм

Второе преимущество объектно‑ориентированного программирования — это полиморфизм (polymorphism), что означает «имеющий множество форм». В Visual Basic это означает, что один объект может иметь различный формы в зависимости от ситуации. Например, следующий код представляет собой подпрограмму, которая может принимать в качестве параметра любой объект. Объект obj может быть формой, элементом управления, или объектом определенного вами класса.

 

Private Sub ShowName(obj As Object)

MsgBox TypeName(obj)

End Sub

 

Полиморфизм позволяет создавать процедуры, которые могут работать буквально со всеми типами объектов. Но за эту гибкость приходится платить. Если определить обобщенный (generic) объект, как в этом примере, то Visual Basic не сможет определить, какие типы действий сможет выполнять объект, до запуска программы.

 

========357

 

Если Visual Basic заранее знает, с объектом какого типа он будет иметь дело, он может выполнить предварительные действия для того, чтобы более эффективно использовать объект. Если используется обобщенный (generic) объект, то программа не может выполнить подготовки, и в результате этого потеряет в производительности.

Программа Generic демонстрирует разницу в производительности между объявлением объектов как принадлежащих к определенному типу или как обобщенных объектов. Тест выполняется одинаково, за исключением того, что в одном из случаев объект определяется, как имеющий тип Object, а не тип SpecificClass. При этом установка значения данных объекта с использованием обобщенного объекта выполняется в 200 раз медленнее.

 

Private Sub TestSpecific()

Const REPS = 1000000 ' Выполнить миллион повторений.

 

Dim obj As SpecificClass

Dim i As Long

Dim start_time As Single

Dim stop_time As Single

 

Set obj = New SpecificClass

start_time = Timer

For i = 1 To REPS

   obj.Value = I

Next i

stop_time = Timer

SpecificLabel.Caption = _

   Format$(1000 * (stop_time - start_time) / REPS, "0.0000")

End Sub

 



2019-07-03 242 Обсуждений (0)
Обеспечение инкапсуляции 0.00 из 5.00 0 оценок









Обсуждение в статье: Обеспечение инкапсуляции

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (242)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.005 сек.)