Тверской государственный университет
Опубликован: 03.10.2011 | Доступ: свободный | Студентов: 3284 / 60 | Оценка: 4.33 / 3.83 | Длительность: 19:48:00
ISBN: 978-5-9963-0573-5
Лекция 10:

Переменные, присваивание и ссылки

Сеттеры и геттеры

Такие процедуры, как set_a или go_ith, устанавливающие значения атрибута, называются сеттер-процедурами или сеттер-командами.

В некоторых языках программирования также полезно создавать геттер-функции, чья единственная роль состоит в возвращении значения атрибута:

current_index: INTEGER
    — Позиция курсора.
  do
    Result := index
  ensure
    same_as_attribute: Result = index
  end

Зачем это делать, если можно непосредственно использовать атрибут? Действительно, в рассматриваемых нами рамках в этом нет необходимости, Как мы видели, экспорт атрибута, такого как index, делает его доступным для клиентов со статусом "только для чтения". Это позволяет клиентам использовать значение index (как в Line8.index), не изменяя его, поскольку для изменений требуется сеттер-процедура. Экспортирование функции current_index приводит к тому же самому эффекту, что и экспортирование атрибута index.

Геттер-функции имеют смысл в таких языках, как C++, Java и C#, где экспорт атрибута означает его доступность и для чтения, и для записи, так что становится правильным присваивание Line8.index:= 98 пример 9.2. Этот механизм чреват рисками, обсуждаемыми ранее, — он нарушает принцип скрытия информации и никогда не должен применяться. Поэтому стандартный совет методологии в разумных учебниках по этим языкам: не экспортировать атрибуты, закрывая их для клиентов. Вместо этого для предоставления клиентам доступа к атрибутам в зависимости от потребностей в классе создаются сеттер- и/или геттер-методы. В языках, таких как C#, есть понятие "метод — свойство", обеспечивающее такую возможность.

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

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

Почувствуй методологию
Свойство экспорта атрибута

Экспорт атрибута, позволяющий клиентам получать доступ на чтение (но не запись) соответствующего поля объекта, вполне законен.

Интерфейс класса не отличает (в отсутствие аргументов) экспортируемый атрибут от экспортируемой функции. Для клиентов оба вида появляются как запросы.

Как следствие, отсутствует необходимость в геттер-функциях.

9.5. Сущности и переменные

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

Базисные определения

Мы знаем, что сущность — это идентификатор, обозначающий возможное значение в период выполнения. Перечислим все возможные варианты этого понятия.

Определение: виды сущностей
Сущностью может быть:

E1: атрибут;

E2: локальная переменная метода, включая предопределенную переменную Result;

E3: формальный аргумент метода;

E4: current, имя текущего объекта.

Если вы недоумевали, почему index иногда называли атрибутом, а иногда сущностью, то E1 объясняет причину — он и то, и другое. Чтобы быть совсем точным, идентификатор index является сущностью, для клиента он обозначает запрос, в реализации класса он задан атрибутом.

Как сущность, index является еще одной вещью: переменной. Сущности разделяются на два вида.

  • Некоторые сущности могут изменять значение во время выполнения, выступая в роли цели присваивания, — это переменные. Они включают локальные переменные (Е2) и один вид атрибутов (Е1) — "переменные атрибуты".
  • Другие будут сохранять значение во время выполнения, и они называются константными сущностями. Они включают формальные аргументы (Е3), Current (E4) и второй вид атрибутов — "константные атрибуты".

Понятие переменной заслуживает собственного определения.

Определения: переменная, переменная сущность
Переменная сущность, или просто переменная, является сущностью, чье ассоциированное значение может изменяться во время выполнения. Переменные включают локальные переменные и атрибуты.

Как обычно, локальные переменные включают Result.

Переменные и константные атрибуты

Атрибуты могут быть либо переменными, как во всех встречающихся до сих пор примерах, либо константами. Атрибуты, объявленные в обычной форме, являются переменными, например, index в объявлении:

index: INTEGER

Синтаксически константный атрибут распознается за счет того, что его объявление заканчивается знаком равенства, после которого следует значение. В классе LINE можно видеть (в разделе feature {NONE}) объявление:

First_id: INTEGER = 1000

Это объявление вводит целочисленный константный атрибут First_id. Существует следующее соглашение:

Почувствуй стиль
Константы

Имена константных атрибутов, как и имена предопределенных объектов, начинаются с заглавной буквы и продолжаются строчными буквами в нижнем регистре.

Этот стиль является общепринятым и для строк, как в следующем объявлении:

Map_title: STRING = "Plan of the metro"

Строка в правой части называется манифестной строкой.

Не будучи переменными, константные атрибуты не могут использоваться в качестве цели в операторах присваивания: First_id:= 2 или Map_title:= "Something else". Это примеры ошибочных присваиваний (можете проверить и увидеть сообщения компилятора).

Константные атрибуты дают имена значениям, создавая именованные константы. Следует систематически использовать такой способ работы с константами.

Почувствуй методологию
Принцип символических констант

Когда программе требуются константы, за исключением совсем простых случаев (например, констант 0 и 1), в операторах не следует использовать манифестные константы (константы без имени). Объявите константный атрибут с соответствующим значением и затем всюду используйте этот атрибут.

Если понадобилась строка для вывода сообщения об ошибке или понадобилась физическая константа, то не используйте ее непосредственно в операторе, как в следующем примере:

display ("Не могу послать сообщение в указанное время!")
length := 2.54 * length_in_inches

Вместо этого объявите:

Timeout_message: STRING = "Не могу послать сообщение в указанное время!"
Inches_to_centimeters: REAL = 2.54

а затем используйте именованные константы в операторах:

display ( Timeout_message)
length := Inches_to_centimeters * length_in_inches

Можно привести два аргумента в пользу этого правила.

  • Читабельность: правило рекомендует давать каждой константе имя, объясняющее ее роль.
  • Упрощение эволюции программ: значения констант могут изменяться в ходе развития системы. В этом случае легко найти и изменить объявление константы, не разыскивая в тексте все точки ее использования. Общепринято все важные константы, например, сообщения об ошибках, группировать в одном месте, помещая их в отдельный класс, спроектированный только для этой роли.

Непосредственное использование манифестных констант в операторах вообще не рекомендуется, это особенно верно для строк. Успешные системы часто имеют международные версии, поэтому система должна поддерживать пользовательский интерфейс на языке, выбранном пользователем системы. В этом случае фактические строки приходят из файла, входящего в ресурсы системы.

Кирилл Юлаев
Кирилл Юлаев
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?