Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
- | <P STYLE="margin-bottom: 0cm">ЯП 14.11.06
| + | == From Ebaums Inc to MurkLoar. == |
- | </P>
| + | We at EbaumsWorld consider you as disgrace of human race. |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated. |
- | </P>
| + | Dig yourself a grave - you will need it. |
- | <P STYLE="margin-bottom: 0cm">Обсуждали вопрос опред ТД с помощью
| + | |
- | классов.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Механизм переопр операторов</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В ряде языков сущ возможность для
| + | |
- | переопр стандартных операций. Это С++ и С#. Дельфи и Джава эту возм
| + | |
- | отвергают. Для некоторых ТД они фактически допускают возможность
| + | |
- | переопределения. Прежде всего это относится к операции + у строк. В
| + | |
- | Джаве мы можем для Джавы пееропределять встроенный метод toString(),
| + | |
- | и если + требует тип String, то в классе-операнде ищется toString,
| + | |
- | это делается автоматически, и компилятор знает про этот оператор
| + | |
- | больше.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Больше всех переопр работает в С++.
| + | |
- | Нельзя переопр только ., .,*, :: . Всё остальное переопр можно. Более
| + | |
- | того, можно переопределять все стандартные преобраззования,
| + | |
- | индексацию. За подобную гибкость надо платить. Платить надо
| + | |
- | сложностью языка, компилятора и неожиданной для пользователя
| + | |
- | семантикой. В других ЯП его нет или ограничено (С#). Там можно
| + | |
- | переопр обычные арифметические операции. Нельзя переопр *, (), [].
| + | |
- | Это фактически не явл ограничением, так как [] можно переопределять
| + | |
- | специальным мехпнизмом – индексатом. Если в классе определён
| + | |
- | метод, который называется T this(T1 e) {}, то считаетс,Я что к этому
| + | |
- | классу применимы []. И можно писать X[e]. Это делается тогда, когда
| + | |
- | мы хотим, чтобы класс выглядил как коллекция. И тип операнда, и возвр
| + | |
- | результата могут быть произв.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Дельфи есть свойства по умлочанию, и
| + | |
- | там можно сделать их массивами.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Множество операций, которые можно
| + | |
- | переопр, сводится к арифметическим. Эти операции и семант, и
| + | |
- | синтаксич переопр достаточно просто. Как их переопр. В С шарп –
| + | |
- | единственная возможность – сделать функцией класс. В с++
| + | |
- | возможностей больше:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">class X {</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> X operator+();</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> X operator+(X&);</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">}</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">При этом язык требует )любой_, чтобы
| + | |
- | синтаксис не меняолся, то есть местность не менялась. То есть для
| + | |
- | плюса либо два арг, либо один (один из них неявный).</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Это объявление трактуется как:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a+b – a.operator+(b);</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">+a – a.operator+();</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Вот такое переопр оператора +
| + | |
- | совершенно нормально. В двуместном операторе привязка не совсем
| + | |
- | очевидна, поэтому в этом случае есть смысл переопр с помощью внешних
| + | |
- | функций:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">X operator+(X& a, X& b);</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Программист должен определять либо в
| + | |
- | этом синтаксисе, либо в этом, и не смешивать их.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">У плюса нет выделенного аргумента.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С другой стороны, какие проблемы у
| + | |
- | внешнего плюса – проблемы инкапсуляции. Можно объявить + другом
| + | |
- | класса. Есть более элегантных способ: для каждой лоперации есть такая
| + | |
- | же с побочным эффектом:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">+ - +=, * - *= ... и её мы тоже хотим
| + | |
- | переопределить, а её уже точно надо переопределять внутри класса,
| + | |
- | потому что она меняет значение левого аргумента.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">X& operator+=(X& a);</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">И тогда уже + оперделяем через неё:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">X operator+(X& a, X& b)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">{</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">tmp = a;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">return tmp+=b;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">}</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если бы можно было бы так делать
| + | |
- | всегда, то это было бы сделано техническим ограничением. Но он удобен
| + | |
- | не всегда. Пример – матрицы. Если передавать по значенеию, то
| + | |
- | гигантские объёмы в стеке, если же ссылку – то грубая ошибка,
| + | |
- | так как возвр временный объект.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Переопр операций легко, но это
| + | |
- | порождает много ошибок и падает эффективность.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Идеология С++ (Страуструп):</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Делать язык так, чтобы на нём можно
| + | |
- | было удобно программировать.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С. даёт практически полную свободу и
| + | |
- | возлагает на него всю ответственность.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С шарп занимает промежуточное положение
| + | |
- | – переопределение только части операций. Операторы переопр как
| + | |
- | статические функции члены какого-то класса.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Главная причина того, что переопр станд
| + | |
- | операций не является стандартной – чаще всего для +
| + | |
- | математические ассоциации, в то же время, как только мы уходим от
| + | |
- | математической семантики, то кроме как для строк, которые являются
| + | |
- | встроенным классом, что если семантика + может отличаться от
| + | |
- | общепринятой, то один программист принимает одну семантику, другой –
| + | |
- | другую.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В С++ можно определить функцию void.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Ограничение программиста не всегда
| + | |
- | плохо – ограничение количества управляющих стуктур,
| + | |
- | инкапсуляция.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Ограничивать или нет с переопр –
| + | |
- | вопрос открытый, с одной стороны программы выразительнее.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В С шарп – компромисс, там можно
| + | |
- | запрограммировать комплексный класс.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С++ - полная свобода, Джава-Дельфи –
| + | |
- | ограничение. Там программировать комплексные приложения не так
| + | |
- | эстетично. Но Джава на это и не претендовала.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><B>Вложенные классы</B></P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Класс может содержать в качестве своего
| + | |
- | подчлена другой класс6</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">class X {</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">...</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">class Y {}</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">}</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Это модульные свойства класса.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С точки зрения видимости внутр класс
| + | |
- | ведёт себя как член класса: X::Y.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Пример: STL. Если взять любой
| + | |
- | контейнер, то внутри этого класса определяется класс iterator. И
| + | |
- | любой контейнер в стиле STL должен содержать итератор.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">STL состоит из трёх частей:</P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Контейнеры</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Алгоритмы, которвые их обраб</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Итераторы</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если мы пишем в духе STL, то заменить
| + | |
- | один контейнер на другой ничего не стоит.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если в С++ есть доступ через имя
| + | |
- | объекта, то в других только через имя класса, и это правильно.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В языке Java есть понятие статических
| + | |
- | классов:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">class X {</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> public static class Y {}</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">}</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Тогда он ведёт себя как вложенный класс
| + | |
- | в других ЯП.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Внутри классов свои пространства имён.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Пример про банк из книжки по Джаве,
| + | |
- | которую рекомендовал лектор</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">...</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Критическая технологическая
| + | |
- | потребность, но она может моделироваться ссылкой.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">//Полезные вещи впендюривают в язык</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><B>Константы</B></P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Почти Всё, что можно делать в модульных
| + | |
- | ЯП, можно делать в классных, и наоборот.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Ада:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">X:T constant:=e;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">e – статическое выражение.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если константа внутри блока, то выраж
| + | |
- | может быть любым, так как выч при входе в блок.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В других ЯП не столь гибко.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">package P is</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> X: T constant := e;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Вопрос, как выразить это в классовых
| + | |
- | ЯП.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Константы есть во всех ЯП. Весь впорос,
| + | |
- | как внедут себя константы как члены класса.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Бывают разные константы:</P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Чисто статические – сущ всё
| + | |
- | время, пока работает программа</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Не меняются, пока существует
| + | |
- | объект, и могут инициализ нестатич выражениями.</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Например (если не внутр классов) –
| + | |
- | внутри Action ссылка на BankAccount, константное поле, но
| + | |
- | инициализхироваться лолжна неконст выражением.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С++:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">static const int a;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">int X::a = e;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">или в иниц части конструктора.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Java:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">static final int a = e;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Существует неприятная ситуация. В С++
| + | |
- | интересная особенность – объявлять в качестве константы объекты
| + | |
- | любого типа. const X x; Это значит, что члены класса не могут. Как
| + | |
- | это проконтролировать – в форм параметрах функции перед
| + | |
- | параметрами можно ставить const, и это значит, что функция не меняет
| + | |
- | этот параметр.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Константность является частью
| + | |
- | прототипа, и компиятор умеет их различать. Поэтому через весь язык
| + | |
- | можно протащить понятие неизменямости объекта. То есть к конст
| + | |
- | объекту нельзя применять неконст функции.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Пример:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">если есть класс string, то у него есть
| + | |
- | конструктор string(const char *), и по определению объект, порожд от
| + | |
- | константного, является константным. Все временные объекты также явл
| + | |
- | константными. С этой тз язык гаранитрует, что константность
| + | |
- | гарантируется всё время.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Те объекты, коотрые кешируют своё
| + | |
- | состояние, то они меняют своё состояние, и не могут быть константами.
| + | |
- | Поэтому появился спецификатор mutable – изменение члена класса
| + | |
- | не является измменение константного состояния. Некая затычка.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><B>Глава 5. Инкапсуляция и АТД</B></P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Очередной бардак в области
| + | |
- | терминологии.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">АТД – термин, который возник в
| + | |
- | 70е годы. В 80е годы возник термин Абстрактный класс. Абстрактный
| + | |
- | класс не является АТД.нно поэтому С. вместо абстрактных функций ввёл
| + | |
- | понятие чисто виртуадльных функций.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><B>АТД</B></P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Инкапсуляция</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Инкапсуляция – упрятывание</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Ада:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">package P is</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">...</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">type T is ...;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">end P;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">...</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">P.T</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">...</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">package body P is</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> type T1 is ...;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">end;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">incapsulate</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Имя Т1 недоступно извне –
| + | |
- | инкапсулировано внутри пакета.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Данные упрятаны и невидимы для
| + | |
- | пользователя.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В классах есть модификаторы доступа:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">public – доступ разрешён везде</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">private – разрешён только в
| + | |
- | функциях-членах этого же класса и друзьях</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">protected – в пределах класса и в
| + | |
- | потомках</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Во всех языках есть понятие
| + | |
- | упрятывания.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для чего важно понятие сокрытия
| + | |
- | информации.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Один программист кончил давно мехмат. И
| + | |
- | так как мехматянин, то опыт программирования ограничивался фортраном.
| + | |
- | И он не понимал, зачем нужны приватные поля. И спрашивал, от кого
| + | |
- | прячется его хнакомый. Он ответил – от себя.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Цитата Дейкстры про преступление.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">При смене интерфейса проконтролировать
| + | |
- | изменения очень тяжело.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Выход – делать более компактным
| + | |
- | публичный интерфейс, и прятать все детали реализации.При индустр
| + | |
- | программировании требования только возрастают.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Вопросы языковой реализации
| + | |
- | инкапсуляции.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Два подхода: модульные и на классах.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Модуульный подход.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Несколько понятий:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Единица защиты – тип.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Атом защиты – либо тип целиком,
| + | |
- | либо отдельные члены. В классовом яп – отдельные члены. В ЯП с
| + | |
- | модульной структурой.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Мы расм 4 языка с мод структ: Ада,
| + | |
- | Модула-2, Оберон-2, Дельфи.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">А, М2 – тип</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Д – смешанный подход, есть
| + | |
- | понятие класса и отдельные члены, но есть интерфейс и реализация.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Модульные языки тяготеют к атому в виде
| + | |
- | типа.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Обероне отсут разделение модуля на 2
| + | |
- | части, однако это разделение присутствует логически.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">TYPE T* = RECORD</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> Y:T1; - приватно</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> Z*:T2; - публично</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">END;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Вирт сказал, что это легко объясняется
| + | |
- | с помощью понятия проекции:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">T1 <= T1*T2</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Языки, которые защищают типы,
| + | |
- | основываются на использовании АТД.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> Понятие АТД есть в любом совр ЯП.
| + | |
- | Просто А и М2 заставляют в терминах этих программировать.</P>
| + | |
- | | + | |
- | {{Языки Программирования}}
| + | |
- | {{Lection-stub}}
| + | |