Перфолента.NET. ООП. Атрибуты элементов программы — различия между версиями

Материал из ТХАБ.РФ
Перейти к: навигация, поиск
м
м (Применение атрибутов)
 
(не показано 5 промежуточных версий 2 участников)
Строка 1: Строка 1:
 
В языке [[Перфолента.Net]] можно привязать к элементам программы (модулям, полям, функциям) дополнительную информацию, которая придаст им дополнительный смысл, особое назначение или особые правила использования. У атрибута нет логики, он просто хранит несколько значений, что бы их можно было прочитать в будущем. Практический смысл создавать атрибуты есть тогда, когда есть необходимость из другой программы анализировать элементы текущей.  
 
В языке [[Перфолента.Net]] можно привязать к элементам программы (модулям, полям, функциям) дополнительную информацию, которая придаст им дополнительный смысл, особое назначение или особые правила использования. У атрибута нет логики, он просто хранит несколько значений, что бы их можно было прочитать в будущем. Практический смысл создавать атрибуты есть тогда, когда есть необходимость из другой программы анализировать элементы текущей.  
  
Фактически Атрибут - это метка которую можно прикрепить к полю, функции, методу, самой программе (сборке) или модулю программы (DLL) значение которой сможет прочитать другой компонент этой или другой программы:
+
Фактически '''Атрибут - это метка''' которую можно прикрепить к полю, функции, методу, самой программе (сборке) или модулю программы (DLL) значение которой сможет прочитать другой компонент этой или другой программы:
  
 
  Значение присвоенное атрибуту '''ИмяАтрибута''' процедуры '''ИмяПроцедуры''' сможет прочитать любая программа, которая обратится к программе содержащей процедуру '''ИмяПроцедуры''' т.е. внешняя программа прочитав значение атрибута ИмяАтрибута у процедуры ИмяПроцедуры получит значение "ЗачениеАтрибута" которое сможет использовать по своему усмотрению.
 
  Значение присвоенное атрибуту '''ИмяАтрибута''' процедуры '''ИмяПроцедуры''' сможет прочитать любая программа, которая обратится к программе содержащей процедуру '''ИмяПроцедуры''' т.е. внешняя программа прочитав значение атрибута ИмяАтрибута у процедуры ИмяПроцедуры получит значение "ЗачениеАтрибута" которое сможет использовать по своему усмотрению.
 +
 +
• [[Перфолента.NET. ООП. Как написать свой атрибут|Как написать свой атрибут]]
  
 
В языке Перфолента, как и в других .Net языках, атрибуты элементов программы используются:
 
В языке Перфолента, как и в других .Net языках, атрибуты элементов программы используются:
Строка 10: Строка 12:
 
Это значит, что как компилятор может внести изменения в генерируемый машинный код основываясь на атрибутах, так и выполняющаяся программа может менять своё поведение в зависимости от атрибутов выполняемого кода.
 
Это значит, что как компилятор может внести изменения в генерируемый машинный код основываясь на атрибутах, так и выполняющаяся программа может менять своё поведение в зависимости от атрибутов выполняемого кода.
  
Процесс получения атрибутов сборки и других элементов программы называется рефлексией (reflection).
+
Процесс '''получения''' атрибутов сборки и других элементов программы называется рефлексией (reflection).
  
 
== Виды атрибутов ==
 
== Виды атрибутов ==
Строка 17: Строка 19:
 
* выполнение кода программы
 
* выполнение кода программы
  
Атрибуты могут быть определены:
+
Атрибуты определены:
 
* в библиотеке Net Framework и могут использоваться компиляторами любых .Net языков
 
* в библиотеке Net Framework и могут использоваться компиляторами любых .Net языков
 
* в стандартной библиотеке Перфоленты и могут использоваться компилятором Перфоленты и программами, использующими эту библиотеку  
 
* в стандартной библиотеке Перфоленты и могут использоваться компилятором Перфоленты и программами, использующими эту библиотеку  
Строка 31: Строка 33:
  
 
== Применение атрибутов ==
 
== Применение атрибутов ==
=== Для  указания области видимости полей ===
+
Наиболее популярные и простые в использовании атрибуты:
* &ВидноВсем - к переменной, полю, функции, методу - могут обращаться другие объекты
+
 
* ОбщийДляКласса - [[Поле]] существует в 1-м экземпляре, для всех объектов данного типа (Класса)
+
* [[&ВидноВсем]] - атрибуты видимости классов и их членов, к полю, функции, методу, объекту - могут обращаться другие объекты
 +
* [[&ОбщийДляКласса]] - [[Поле]] существует в 1-м экземпляре, для всех объектов данного типа (Класса)
 +
* [[&ТолькоЧтение]], [[&ТолькоЗапись]] - атрибуты ограничения доступа к полям и свойствам объекта
 +
* [[&ИмпортМетода]] – специальный атрибут метода, указывающий компилятору, что реализация метода находится во внешней библиотеке и имеет указанную сигнатуру
  
 
Примеры использования:
 
Примеры использования:
 
  Класс Лампа  
 
  Класс Лампа  
 
         // Поля класса  
 
         // Поля класса  
         &ВидноВсем Поле Состояние тип Строка = "Выключена" // Переменная  
+
         &ВидноВсем
 +
        Поле Состояние тип Строка = "Выключена" // Переменная имеющая атрибут &ВидноВсем
  
 
     &ВидноВсем
 
     &ВидноВсем
     Функция ИмяФункции  
+
     Функция ИмяФункции // Функция имеющая атрибут &ВидноВсем
 
       ----
 
       ----
 
     КонецФункции
 
     КонецФункции
Строка 49: Строка 55:
 
В язык Перфолента встроены следующие атрибуты:
 
В язык Перфолента встроены следующие атрибуты:
  
* '''ВидноВсем''', '''ВидноСборке''', '''ВидноНаследникам''', '''ВидноНаследникамСборки''' - атрибуты видимости классов и их членов;
+
* '''ВидноВсем''', '''ВидноСборке''', '''ВидноНаследникам''', '''ВидноНаследникамСборки''' - атрибуты видимости классов и их членов
  
* '''ПространствоИмен'''("МоёПространство "), ПространствоИмён("МоёПространство") (синонимы) - атрибут класса, определяющий пространство имен, к которому принадлежит класс;
+
* '''ПространствоИмен'''("МоёПространство "), ПространствоИмён("МоёПространство") (синонимы) - атрибут класса, определяющий пространство имен, к которому принадлежит класс
  
* '''ОднопоточнаяМодель''', '''МногопоточнаяМодель''' - атрибуты метода Старт, определяющие модель взаимодействия для COM объектов;
+
* '''ОднопоточнаяМодель''', '''МногопоточнаяМодель''' - атрибуты метода Старт, определяющие модель взаимодействия для COM объектов
  
* '''ОбщийДляКласса''' - атрибут члена класса (Поля, Метода) делающий его общим для всех созданных экземпляров объектов этого класса;
+
* '''ОбщийДляКласса''' - атрибут члена класса (Поля, Метода) делающий его общим для всех созданных экземпляров объектов этого класса
  
* '''Глобальный''' - атрибут модуля, определяющий доступ всех видимых ко всем видимым членам модуля из всех других методов программы
+
* '''Глобальный''' - атрибут модуля, определяющий доступ всех видимых ко всем видимым членам модуля из всех других методов программы
  
 
* '''Сериализуемый''' – атрибут класса, указывающий компилятору необходимость создать код поддержки сериализации данных класса; ссылка в вики на сериализация класса
 
* '''Сериализуемый''' – атрибут класса, указывающий компилятору необходимость создать код поддержки сериализации данных класса; ссылка в вики на сериализация класса
  
* '''ДолженНаследоваться''', '''МожетНаследоваться''', '''НеМожетНаследоваться''' - атрибуты класса, определяющие возможность или необходимость его наследования;
+
* '''ДолженНаследоваться''', '''МожетНаследоваться''', '''НеМожетНаследоваться''' - атрибуты класса, определяющие возможность или необходимость его наследования
  
* '''ДолженПереопределяться''', '''МожетПереопределяться''', '''НеМожетПереопределяться''' - атрибуты члена класса (Поле, Метод,), определяющие возможность или необходимость его переопределения;
+
* '''ДолженПереопределяться''', '''МожетПереопределяться''', '''НеМожетПереопределяться''' - атрибуты члена класса (Поле, Метод,), определяющие возможность или необходимость его переопределения
  
* '''Переопределение''' - атрибут переопределения метода родителя в классе-наследнике;
+
* '''Переопределение''' - атрибут переопределения метода родителя в классе-наследнике
  
* '''Перекрытие''' - атрибут перекрытия метода родителя в классе-наследнике;
+
* '''Перекрытие''' - атрибут перекрытия метода родителя в классе-наследнике
  
* '''Перегрузка''' - атрибут перегрузки методов с одинаковыми именами;
+
* '''Перегрузка''' - атрибут перегрузки методов с одинаковыми именами
  
* '''ТолькоЧтение''', '''ТолькоЗапись''' - атрибуты ограничения доступа к полям и свойствам;
+
* '''ТолькоЧтение''', '''ТолькоЗапись''' - атрибуты ограничения доступа к полям и свойствам
  
* '''Обработчик'''("МоёСобытие") - атрибут метода класса (процедуры), определяющий, что метод является обработчиком указанного события;
+
* '''Обработчик'''("МоёСобытие") - атрибут метода класса (процедуры), определяющий, что метод является обработчиком указанного события
  
* '''ИмпортМетода''' – специальный атрибут метода, указывающий компилятору, что реализация метода находится во внешней библиотеке и имеет указанную сигнатуру;
+
* '''ИмпортМетода''' – специальный атрибут метода, указывающий компилятору, что реализация метода находится во внешней библиотеке и имеет указанную сигнатуру
  
 
Назначение и особенности использования встроенных атрибутов подробнее рассматриваются в тех статьях, где описаны сущности языка, к которым  
 
Назначение и особенности использования встроенных атрибутов подробнее рассматриваются в тех статьях, где описаны сущности языка, к которым  

Текущая версия на 19:38, 12 ноября 2020

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

Фактически Атрибут - это метка которую можно прикрепить к полю, функции, методу, самой программе (сборке) или модулю программы (DLL) значение которой сможет прочитать другой компонент этой или другой программы:

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

Как написать свой атрибут

В языке Перфолента, как и в других .Net языках, атрибуты элементов программы используются:

  • на стадии компиляции
  • на стадии выполнения

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

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

Виды атрибутов

Итак, Атрибуты могут влиять на:

  • сборку (компиляцию) программы
  • выполнение кода программы

Атрибуты определены:

  • в библиотеке Net Framework и могут использоваться компиляторами любых .Net языков
  • в стандартной библиотеке Перфоленты и могут использоваться компилятором Перфоленты и программами, использующими эту библиотеку
  • Вами в вашей программе и использовать их будете только Вы

Часть используемых вами атрибутов определена прямо в языке Перфолента (в стандартной библиотеке), это:

  • видимости (ВидноВсем),
  • наследования,
  • переопределения методов
  • и другие (ТолькоДляЧтения).

Важно: в языке 1С, как и в некоторых других языках программирования, атрибуты называют аннотациями. В разных языках синтаксис записи атрибутов (аннотаций) различен, как и способы их использования, но в большинстве современных языков они в том или ином виде есть.

Применение атрибутов

Наиболее популярные и простые в использовании атрибуты:

  • &ВидноВсем - атрибуты видимости классов и их членов, к полю, функции, методу, объекту - могут обращаться другие объекты
  • &ОбщийДляКласса - Поле существует в 1-м экземпляре, для всех объектов данного типа (Класса)
  • &ТолькоЧтение, &ТолькоЗапись - атрибуты ограничения доступа к полям и свойствам объекта
  • &ИмпортМетода – специальный атрибут метода, указывающий компилятору, что реализация метода находится во внешней библиотеке и имеет указанную сигнатуру

Примеры использования:

Класс Лампа 
        // Поля класса 
        &ВидноВсем
        Поле Состояние тип Строка = "Выключена" // Переменная имеющая атрибут &ВидноВсем
   &ВидноВсем
   Функция ИмяФункции // Функция имеющая атрибут &ВидноВсем
     ----
   КонецФункции

Встроенные атрибуты языка Перфолента

В язык Перфолента встроены следующие атрибуты:

  • ВидноВсем, ВидноСборке, ВидноНаследникам, ВидноНаследникамСборки - атрибуты видимости классов и их членов
  • ПространствоИмен("МоёПространство "), ПространствоИмён("МоёПространство") (синонимы) - атрибут класса, определяющий пространство имен, к которому принадлежит класс
  • ОднопоточнаяМодель, МногопоточнаяМодель - атрибуты метода Старт, определяющие модель взаимодействия для COM объектов
  • ОбщийДляКласса - атрибут члена класса (Поля, Метода) делающий его общим для всех созданных экземпляров объектов этого класса
  • Глобальный - атрибут модуля, определяющий доступ всех видимых ко всем видимым членам модуля из всех других методов программы
  • Сериализуемый – атрибут класса, указывающий компилятору необходимость создать код поддержки сериализации данных класса; ссылка в вики на сериализация класса
  • ДолженНаследоваться, МожетНаследоваться, НеМожетНаследоваться - атрибуты класса, определяющие возможность или необходимость его наследования
  • ДолженПереопределяться, МожетПереопределяться, НеМожетПереопределяться - атрибуты члена класса (Поле, Метод,), определяющие возможность или необходимость его переопределения
  • Переопределение - атрибут переопределения метода родителя в классе-наследнике
  • Перекрытие - атрибут перекрытия метода родителя в классе-наследнике
  • Перегрузка - атрибут перегрузки методов с одинаковыми именами
  • ТолькоЧтение, ТолькоЗапись - атрибуты ограничения доступа к полям и свойствам
  • Обработчик("МоёСобытие") - атрибут метода класса (процедуры), определяющий, что метод является обработчиком указанного события
  • ИмпортМетода – специальный атрибут метода, указывающий компилятору, что реализация метода находится во внешней библиотеке и имеет указанную сигнатуру

Назначение и особенности использования встроенных атрибутов подробнее рассматриваются в тех статьях, где описаны сущности языка, к которым применяются конкретные атрибуты

См. также

Ссылки