Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Solidity — язык программирования самовыполняющихся контрактов для Ethereum. основы

Лекция



Привет, Вы узнаете о том , что такое solidity, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое solidity, самовыполняющийся контракт , настоятельно рекомендую прочитать все из категории Объектно-ориентированное программирование ООП.

Solidity — объектно-ориентированный, предметно-ориентированный язык программирования самовыполняющихся контрактов для платформы Ethereum.

Смарт-контракт (англ. Smart contract — умный контракт) — компьютерный алгоритм, предназначенный для формирования, контроля и предоставления информации о владении чем-либо. Чаще всего речь идет о применении технологии блокчейна. В более узком смысле под смарт-контрактом понимается набор функций и данных (текущее состояние), находящихся по определенному адресу в блокчейне .

Смарт-контракты Ethereum разрабатываются на одном из языков, спроектированных для трансляции в байт-код виртуальной машины Ethereum — Solidity (похож на Си или JavaScript), Vyper и Serpent (похожи на Python), LLL (низкоуровневая версия Лисп), Mutan (основан на Go) .

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

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Схема архитектуры узла Эфириум

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

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

  1. Использование широко распространенных методов электронной подписи на основе публичных и приватных ключей (асимметричное шифрование).
  2. Существование открытых, децентрализованных и доверительных сторонам контракта баз данных для исполняемых транзакций, работа которых полностью исключает человеческий фактор. Как пример: блокчейн в Bitcoin.
  3. Децентрализация среды исполнения умного контракта. Как пример: Ethereum, Codius, Counterparty (англ.)рус..
  4. Достоверность источника цифровых данных. Как пример: корневые центры сертификации SSL в базах современных интернет-браузеров[10].

Объекты умного контракта

  • Подписанты — стороны умного контракта, принимающие или отказывающиеся от условий с использованием электронных подписей. Прямым аналогом является подпись отправителя средств в сети Bitcoin, которая подтверждает внесение транзакции в цепочку блоков.
  • Предмет договора. Предметом договора может являться только объект, находящийся внутри среды существования самого умного контракта, или же должен обеспечиваться беспрепятственный, прямой доступ умного контракта к предмету договора без участия человека.
  • Условия. Условия умного контракта должны иметь полное математическое описание, которое возможно запрограммировать в среде существования умного контракта. Именно в условиях описывается логика исполнения пунктов предмета договора.
  • Децентрализованная платформа. Для распределенного хранения смарт-контракта необходима его запись в блокчейне этой платформы[11].

История

Язык был предложен в августе 2014 года Гэйвином Вудом (Gavin Wood ). В дальнейшем разработка языка была выполнена под руководством Кристиана Райтвизнера (Christian Reitwiessner) командой Solidity в рамках проекта Ethereum. Это один из четырех языков (среди Serpent, LLL и Mutan), спроектированных для трансляции в байт код виртуальной машины Ethereum. Получил широкое распространение с появлением технологий блокчейна, в частности стека технологий на основе Ethereum, для создания программного обеспечения умных контрактов.

Код контракта

Ethereum не только хранит данные транзакции в цепочке, но и может хранить код договора в цепочке.

На уровне базы данных роль блокчейна заключается в хранении данных транзакций. Так в чем же логика голосования за кандидатов или получения результатов голосования? В мире Ethereum вы можете использовать язык Solidity для написания бизнес-логики / кода приложения (то есть contract: Contract), затем скомпилировать код контракта в байт-код Ethereum и развернуть байт-код в блокчейне. :

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Для написания кода контракта могут использоваться другие языки, но Solidity - безусловно, самый популярный выбор.

Виртуальная машина Ethereum

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

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

Блокчейн Ethereum не только хранит данные и код, каждый узел также содержит виртуальную машину (EVM: Ethereum Virtual Machine) для выполнения кода контракта - он звучит как операционная система компьютера.

Фактически, это ключевой момент, который отличает Ethereum от Биткойна: существование виртуальной машины привело к появлению блокчейна в эпоху 2.0, а также сделало блокчейн первой удобной для разработчиков платформой для разработчиков. ,

Описание

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

Использование синтаксиса ECMAScript по замыслу Вуда должно помочь принятию языка действительными веб-разработчиками. Однако, в отличие от ECMAScript, язык получил статическую типизацию переменных и динамические типы возвращаемых значений. По сравнению с компилируемыми в такой же байт код языками Serpent и Mutan язык имеет важные отличия. Поддерживаются комплексные переменные контрактов, включая произвольные иерархические отображения (mappings) и структуры. Контракты поддерживают наследование, включая множественное и C3-линеаризацию. Поддерживается бинарный интерфейс программирования (ABI), имеющий множество типобезопасных функций в каждом контракте (впоследствии появился также и в Serpent). Специфицирована система документирования кода для пользовательского пояснения последовательности вызовов, получившая название «Спецификации на естественном языке Ethereum» (Ethereum Natural Specification Format) В Solidity вместо привычных классов объявляются контракты (contract). Существуют библиотеки для написания смарт-контрактов такие как: Open Zeppelin, Truffle. Библиотеки позволяют создать свою монету (токен) на основе готовых шаблонов, со всеми спецификациями (ERC20) и проверками на безопасность (библиотека safemath).

Контракты в solidity могут наследоваться друг на друга. Это значит что функции и переменные контракта от которого мы наследуемся будут доступны в контракте который наследует. В solidity как и в C++ есть множественное (ромбовидное) наследование.

 Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Пример программы на языке Solidity :

 Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Архитектура DAPP

На следующем рисунке показана децентрализованная архитектура приложения на основе Ethereum:

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Диаграмма архитектуры DAPP

Каждый клиент (браузер) взаимодействует с соответствующим экземпляром приложения узла, а не запрашивает услуги у централизованного сервера.

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

Тем не менее, мы не живем в утопии. Об этом говорит сайт https://intellect.icu . Нереально ожидать, что каждый пользователь запустит полный узел перед использованием вашего приложения. Но основная идея децентрализации заключается в том, что она не зависит от централизованного сервера. Поэтому в сообществе блокчейнов появились некоторые решения, такие как Infura, которая предоставляет общедоступные узлы блокчейна, и Metamask, плагин для браузера. Благодаря этим решениям вам не нужно тратить много жесткого диска, памяти и времени на загрузку и запуск полного узла блокчейна, а также вы можете воспользоваться преимуществами децентрализации.

Основы языка Solidity

все контракты Solidity содержат следующие элементы:

  • Директивы Pragma
  • Переменные состояния
  • Функции
  • События

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

Поняв эти принципы, вы сможете начать создавать собственные смарт-контракты для самых разных целей!

Директивы Pragma

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

В определение контракта необходимо всегда включать последнюю версию Solidity. Сведения о текущей версии можно получить на веб-сайте Solidity. В исходном файле необходимо использовать самую последнюю версию.

Определяющая версию директива Pragma выглядит следующим образом:

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

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

Переменные состояния

Переменные состояния являются основными элементами любого исходного файла Solidity. Значения переменных состояния навсегда сохраняются в хранилище контрактов.

 

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Примечание

В начале исходного файла контракта всегда указывается определение contract ContractName.

В этом примере используется переменная состояния price с типом uint. Целочисленный тип uint указывает, что эта переменная может содержать целое 256-разрядное число без знака. Таким образом, в ней могут храниться положительные числа в диапазоне от 0 до 2256–1.

В определении любой переменной необходимо указывать ее тип и имя.

Кроме того, вы можете задать видимость переменной состояния следующим образом:

  • public — элемент интерфейса контрактов, доступный из других контрактов.
  • internal — элемент, доступный только из текущего контракта.
  • private — элемент, доступный только в том контракте, в котором он определен.

Функции

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

Ниже приводится простой пример определения функции:

 

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

В этом коде показана функция с именем buy, которая имеет уровень видимости public и, таким образом, доступна из других контрактов. Поддерживаются следующие описатели видимости функций: public, private, internal и external.

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

Ниже приведен пример функции, которая принимает целочисленный параметр price и возвращает целое число:

 

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Модификаторы функций

С помощью модификаторов можно изменять поведение функций. Если задан модификатор, перед выполнением функции проверяется соответствующее условие. Например, таким образом функция может проверять наличие прав продавца у пользователя, прежде чем выставить какой-либо товар на продажу.

  Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

В этом примере используются следующие элементы:

  • Переменная с типом address, в которой будет храниться 20-байтовый Ethereum-адрес пользователя с правами продавца. С этими переменными вы ознакомитесь более подробно далее в рамках этого модуля.
  • Модификатор с именем onlySeller, который описывает, что только продавец может выставлять товар на продажу.
  • Специальный символ _;, который указывает место вставки тела функции.
  • Определение функции, в котором используется модификатор onlySeller.

В определении функции также можно использовать следующие модификаторы:

  • pure — описывает функции, для которых не допускается изменение состояния или доступ к сведениям о нем.
  • view — описывает функции, для которых не допускается изменение состояния.
  • payable — описывает функции, которые могут принимать "эфиры".

События

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

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

 Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

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

Типы значений в языке Solidity

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

использоваться при написании контрактов, можно отнести целочисленные, логические, строковые литералы, адреса и перечисления.

Целые числа

Целочисленные типы используются в любом исходном файле Solidity. Они представляют целые числа и могут быть со знаком или без него. В целочисленных типах может храниться от 8 до 256 разрядов.

  • Типы со знаком: включают отрицательные и положительные числа. Могут быть представлены в качестве значения int.
  • Типы без знака: включают только положительные числа. Могут быть представлены в качестве значения uint.

Если число бит не задано явно, оно равно 256 битам по умолчанию.

К целым числам могут применяться следующие операции:

  • Операторы сравнения: <=, <, ==, !=, >=, >
  • Двоичные операторы: & (and), | (or), ^ (bitwise exclusive), ~ (bitwise negation)
  • Арифметические операторы: + (addition),- (subtraction), * (multiplication), / (division), % (modulo), ** (exponential)

Ниже приведены примеры определения целочисленных значений:

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Boolean

Логические значения определяются с помощью ключевого слова bool. Они всегда имеют значение либо true, либо false.

Ниже показано, как их можно определить:

 

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Логические значения обычно используются в инструкциях сравнения. Пример:

 

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Кроме того, логические значения можно использовать в параметрах функций и типах возвращаемых значений.

 

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Строковые литералы

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

 

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Кроме того, вместе со строковыми литералами можно использовать следующие escape-символы:

  • \ — escape-последовательность для новой строки
  • \n — новая строка
  • \r — возврат каретки
  • \t — табуляция

Адрес

Адрес — это тип с 20-байтовым значением, которое представляет учетную запись пользователя Ethereum. Для определения адреса можно использовать обычный тип address или address payable.

Разница между ними заключается в том, что тип address payable определяет адрес, по которому можно отправлять "эфиры", для чего в нем используются дополнительные члены transfer и send.

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Перечисления

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

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

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Ссылочные типы в Solidity

Для написания контрактов вам также потребуется понимать принципы использования ссылочных типов.

В отличие от типов значений, которые всегда передают независимую копию значения, ссылочные типы указывают на расположение данных для значения. Поддерживаются следующие ссылочные типы: структуры, массивы и сопоставления.

Расположение данных

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

  • memory:
    • Расположение, в котором хранятся аргументы функции.
    • Действует только во время вызова внешней функции.
  • storage:
    • Расположение, в котором хранятся переменные состояния.
    • Действует только во время существования контракта.
  • calldata:
    • Расположение, в котором хранятся аргументы функции.
    • Требуется для параметров внешних функций, но также может использоваться для других переменных.
    • Действует только во время вызова внешней функции.

Ссылочные типы всегда создают независимую копию данных.

Ниже приведен пример использования ссылочного типа:

 

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Массивы

Массивы используются для хранения схожих данных в структуре набора данных. Размер массива может быть фиксирован или задаваться динамически. Индекс массива начинаются с 0.

Чтобы создать массив фиксированного размера k, содержащий элементы типа T, следует использовать выражение T[k]. Массивы динамического размера задаются следующим образом: T[].

Элементы массива могут иметь любой тип. Например, массив может содержать элементы типа uint, memory или byte. Также массивы могут включать сопоставления или структуры.

В следующем примере показано создание массива:

 

Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Члены массива

Для управления массивами и получения сведений о них можно использовать следующие члены:

  • length — получение длины массива
  • push() — добавление элемента в конец массива
  • pop — удаление элемента с конца массива

Ниже приводится несколько примеров.

 Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Структуры

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

Примеры:

 Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Типы сопоставления

Сопоставления представляют собой пары из ключа и значения, которые инкапсулируются или упаковываются вместе. Ближайшими аналогами сопоставлений являются словари или объекты JavaScript. Как правило, сопоставления используются для моделирования реальных объектов и более быстрого поиска данных. Благодаря поддержке различных типов значений, включая такие сложные, как структуры, этот тип является универсальным и удобным для восприятия человеком.

В следующем примере кода используется структура Items_Schema и сохраняется словарь со списком элементов, представленных структурой Items_Schema. Таким образом, с помощью сопоставлений можно имитировать базу данных.

 Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы

Примечание

В сигнатуре сопоставления uint256 => Items_Schema указывается, что ключи имеют целочисленный тип без знака, а значения являются структурой Items_Schema.

Пример простого интернет-магазина на Solidity

  Solidity —  язык программирования самовыполняющихся контрактов для  Ethereum. основы    

Рассмотрим основные компоненты этого смарт-контракта более подробно:

  • маршрутов:
    • три переменные состояния: buyer, seller и balances;
    • два события: ListItem и PurchasedItem;
    • одно перечисление с двумя значениями: ItemAvailable и ItemPurchased.
  • Конструктор, который назначает продавцом пользователя msg.sender и устанавливает начальное состояние ItemAvailable. Этот конструктор вызывается при создании контракта.
  • Функция buy, которая принимает три параметра: seller, buyer и price. Перед совершением покупки проверяется наличие у покупателя достаточных средств. Если это так, осуществляется перевод денег от покупателя продавцу, после чего выдается сообщение.

тесты для самопроверки

1. Где выполняются смарт-контракты Solidity:
  • в блокчейне Ethereum - Неправильно. Блокчейн Ethereum — это название платформы, для работы с которой предназначен язык Solidity. Тесты выполняются не в блокчейне Ethereum.
  • виртуальная машина Ethereum -Правильно. Контракты Solidity выполняются на виртуальной машине Ethereum. В этой изолированной среде содержатся все журналы транзакций для контрактов
  • любая виртуальная машина -Неправильно. Виртуальную машину можно использовать для выполнения тестов, но для смарт-контрактов Solidity нужен специальный тип виртуальной машины.
  • любая среда песочницы -Неправильно. Смарт-контракты Solidity выполняются в изолированной среде, однако для этих целей используется среда особого типа.
2. С помощью событий описываются действия, которые выполняются в контракте. В каком из перечисленных вариантов приведен синтаксис определения события?
  • event PurchasedItemEvent -Неправильно. Событие вызывается аналогично функции с использованием набора круглых скобок в конце, например event PurchasedItemEvent(). Все необходимые аргументы указываются внутри круглых скобок.
  • event PurchasedItemEvent(address buyer, uint price); - Правильно. Чтобы определить событие, используйте ключевое слово event. Также нужно присвоить событию имя и при необходимости указать аргументы внутри круглых скобок.
  • emit PurchasedItemEvent(address buyer, uint price); -Неправильно. Этот синтаксис обеспечивает вызов события и создание записи в журнале транзакций.
  • PurchasedItemEvent(address buyer, uint price); -Неправильно. Этот синтаксис обеспечивает вызов ранее определенной функции, а не события.
3. Что из перечисленного является примером определяемого пользователем типа в Solidity?
  • Структуры- Правильно. Структуры относятся к определяемым пользователем типам, поскольку внутри них можно определить коллекцию элементов.
  • Переменные состояния -Неправильно. Переменные состояния имеют стандартный тип (uint, int, bool или address) и служат для хранения значений, которые используются в контрактах.
  • Адреса -Неправильно. Адреса — это типы с 20-байтовым значением, которые представляют учетную запись пользователя Ethereum. Значение задается для указанного типа адреса.
  • Массивы -Неправильно. Массивы используют стандартные типы для хранения коллекции схожих элементов одного типа в структуре данных.
4. Что обычно содержится в первой строке исходного файла смарт-контракта?
  • Определение контракта -Неправильно. Определение контракта является обязательным элементом исходного файла, но оно задается не в первой строке.
  • Директива Pragma- Правильно. Pragma — это ключевое слово, с помощью которого компилятор проверяет соответствие версии Solidity требуемой.
  • Версия Solidity -Неправильно. Версия Solidity указывается в директиве Pragma, однако не включает ключевое слово, которое проверяется компилятором.
  • Событие -Неправильно. События используются в большинстве смарт-контрактов, однако они не являются обязательными и размещаются внутри определения контракта.

Внешняя ссылка

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

создано: 2021-12-11
обновлено: 2024-11-14
23



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Объектно-ориентированное программирование ООП

Термины: Объектно-ориентированное программирование ООП