Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


ћетод объектно-ориентированного программировани€.

ћетодологи€ и технологи€ программировани€.

 

ѕриведем основные определени€.

ѕрограмма Ч завершенный продукт, пригодный дл€ запуска своим автором на системе, на которой он был разработан.

ѕрограммный продукт Ч программа, которую любой человек может запускать, тестировать, исправл€ть и развивать. “ака€ программа должна быть написана в обобщенном стиле, тщательно оттестирована и сопровождена подробной документацией. (— учетом модной в насто€щее врем€ концепции авторских прав, здесь необходимо уточнить Ц любой человек, имеющий разрешение работать с исходными текстами программ)

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

∆изненный цикл программного обеспечени€ Ц это весь период его разработки и эксплуатации, начина€ с момента возникновени€ замысла и заканчива€ прекращением ее использовани€.

ћетодологи€ программировани€ Ц совокупность методов, применимых в жизненном цикле программного обеспечени€ и объединенных общим философским подходом.

—уществует четыре широко известных в насто€щее врем€ методологии программировани€ Ц императивного, объектно-ориентированного, логического, функционального.

“ехнологи€ программировани€ изучает технологические процессы и пор€док их прохождени€ Ц стадии (с использованием знаний, методов и средств).

ѕроцесс Ч совокупность взаимосв€занных действий, преобразующих некоторые входные данные в выходные. ѕроцессы состо€т из набора действий, а каждое действие из набора задач. ¬ертикальное измерение отражает статические аспекты процессов и оперирует такими пон€ти€ми, как рабочие процессы, действи€, задачи, результаты де€тельности и исполнители.

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

“ехнологический подход определ€етс€ спецификой комбинации стадий и процессов, ориентированной на разные классы программного обеспечени€ и на особенности коллектива разработчиков.

 

»мперативное программирование.

»мперативное программирование Ч это исторически перва€ методологи€ программировани€, которой пользовалс€ каждый программист, программирующий на любом из Ђмассовыхї €зыков программировани€ Ц Basic, Pascal, C.

ќна ориентирована на классическую фон Ќеймановскую модель, остававшуюс€ долгое врем€ единственной аппаратной архитектурой. ћетодологи€ императивного программировани€ характеризуетс€ принципом последовательного изменени€ состо€ни€ вычислител€ пошаговым образом. ѕри этом управление изменени€ми полностью определено и полностью контролируемо.

ћетоды и концепции.

  • ћетод изменени€ состо€ний Ч заключаетс€ в последовательном изменении состо€ний. ћетод поддерживаетс€ концепцией алгоритма.
  • ћетод управлени€ потоком исполнени€ Ч заключаетс€ в пошаговом контроле управлени€. ћетод поддерживаетс€ концепцией потока исполнени€.

 

¬ычислительна€ модель. ≈сли под вычислителем понимать современный компьютер, то его состо€нием будут значени€ всех €чеек пам€ти, состо€ние процессора (в том числе Ч указатель текущей команды) и всех сопр€женных устройств. ≈динственна€ структура данных Ч последовательность €чеек (пар Ђадресї - Ђзначениеї) с линейно упор€доченными адресами.

¬ качестве математической модели императивное программирование использует машину “ьюринга-ѕоста Ч абстрактное вычислительное устройство, предложенное на заре компьютерной эры дл€ описани€ алгоритмов.

—интаксис и семантика. языки, поддерживающие данную вычислительную модель, €вл€ютс€ как бы средством описани€ функции переходов между состо€ни€ми вычислител€. ќсновным их синтаксическим пон€тием €вл€етс€ оператор. ѕерва€ группа Ч простые операторы, у которых никака€ их часть не €вл€етс€ самосто€тельным оператором (например, оператор присваивани€, оператор безусловного перехода, вызова процедуры и т. п.). ¬тора€ группа Ч структурные операторы, объедин€ющие другие операторы в новый, более крупный оператор (например, составной оператор, операторы выбора, цикла и т. п.).

“радиционное средство структурировани€ Ч подпрограмма (процедура или функци€). ѕодпрограммы имеют параметры и локальные определени€ и могут быть вызваны рекурсивно. ‘ункции возвращают значени€ как результат своей работы.

≈сли в данной методологии требуетс€ решить некоторую задачу дл€ того, чтобы использовать ее результаты при решении следующей задачи, то типичный подход будет таким. —начала исполн€етс€ алгоритм, решающий первую задачу. –езультаты его работы сохран€ютс€ в специальном месте пам€ти, которое известно следующему алгоритму, и используютс€ им.

»мперативные €зыки программировани€. »мперативные €зыки программировани€ манипулируют данными в пошаговом режиме, использу€ последовательные инструкции и примен€€ их к разнообразным данным. —читаетс€, что первым алгоритмическим €зыком программировани€ был €зык Plankalkuel (от plan calculus), разработанный в 1945Ч1946 годах  онрадом ÷узе (Konrad Zuse).

Ѕольшинствои из наиболее известных и распространенных императивных €зыков программировани€ было создано в конце 50-х Ч середине 70-х годов XX века. Ёто период 80-х и 90-х годов соответствует увлечени€м новыми парадигмами, и императивных €зыков в это врем€ практически не по€вл€лось.

 ласс задач. »мперативное программирование наиболее пригодно дл€ решени€ задач, в которых последовательное исполнение каких-либо команд €вл€етс€ естественным. ѕримером здесь может служить управление современными аппаратными средствами. ѕоскольку практически все современные компьютеры императивны, эта методологи€ позвол€ет порождать достаточно эффективный исполн€емый код. — ростом сложности задачи императивные программы станов€тс€ все менее и менее читаемыми.

ѕрограммирование и отладка действительно больших программ (например, компил€торов), написанных исключительно на основе методологии императивного программировани€, может зат€нутьс€ на долгие годы.

–екомендации по литературе. ќсобенности императивного программировани€ изложены в огромном количестве книг. Ќаиболее систематично они приведены в работе "”ниверсальные €зыки программировани€. —емантический подход" [ алинин, ћацкевич 1991].

 

2.1. ћодульное программирование.

 

ћодульное программирование Ч это такой способ программировани€, при котором вс€ программа разбиваетс€ на группу компонентов, называемых модул€ми, причем каждый из них имеет свой контролируемый размер, четкое назначение и детально проработанный интерфейс с внешней средой. ≈динственна€ альтернатива модульности Ч монолитна€ программа, что, конечно, неудобно. “аким образом, наиболее интересный вопрос при изучении модульности Ч определение критери€ разбиени€ на модули.

 онцепции модульного программировани€. ¬ основе модульного программировани€ лежат три основных концепции:

ѕринцип утаивани€ информации ѕарнаса. ¬с€кий компонент утаивает единственное проектное решение, т. е. модуль служит дл€ утаивани€ информации. ѕодход к разработке программ заключаетс€ в том, что сначала формируетс€ список проектных решений, которые особенно трудно прин€ть или которые, скорее всего, будут мен€тьс€. «атем определ€ютс€ отдельные модули, каждый из которых реализует одно из указанных решений.

јксиома модульности  оуэна. ћодуль Ч независима€ программна€ единица, служаща€ дл€ выполнени€ некоторой определенной функции программы и дл€ св€зи с остальной частью программы. ѕрограммна€ единица должна удовлетвор€ть следующим услови€м:

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

—борочное программирование ÷ейтина. ћодули Ч это программные кирпичи, из которых строитс€ программа. —уществуют три основные предпосылки к модульному программированию:

  • стремление к выделению независимой единицы программного знани€. ¬ идеальном случае вс€ка€ иде€ (алгоритм) должна быть оформлена в виде модул€;
  • потребность организационного расчленени€ крупных разработок;
  • возможность параллельного исполнени€ модулей (в контексте параллельного программировани€).

 

ќпределени€ модул€ и его примеры. ѕриведем несколько дополнительных определений модул€.

  • ћодуль Ч это совокупность команд, к которым можно обратитьс€ по имени.
  • ћодуль Ч это совокупность операторов программы, имеюща€ граничные элементы и идентификатор (возможно агрегатный).

‘ункциональна€ спецификаци€ модул€ должна включать:

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

–азновидности модулей. —уществуют три основные разновидности модулей:

1) "ћаленькие" (функциональные) модули, реализующие, как правило, одну какую-либо определенную функцию. ќсновным и простейшим модулем практически во всех €зыках программировани€ €вл€етс€ процедура или функци€.

2) "—редние" (информационные) модули, реализующие, как правило, несколько операций или функций над одной и той же структурой данных (информационным объектом), котора€ считаетс€ неизвестной вне этого модул€. ѕримеры "средних" модулей в €зыках программировани€:

a)задачи в €зыке программировани€ Ada;

b)кластер в €зыке программировани€ CLU;

c)классы в €зыках программировани€ C++ и Java.

3) "ЅольшиеФ (логические) модули, объедин€ющие набор "средних" или "маленьких" модулей. ѕримеры "больших" модулей в €зыках программировани€:

a)модуль в €зыке программировани€ Modula-2;

b)пакеты в €зыках программировани€ Ada и Java.

Ќабор характеристик модул€ предложен ћайерсом. ќн состоит из следующих конструктивных характеристик:

1) размера модул€;

¬ модуле должно быть 7 (+/-2) конструкций (например, операторов дл€ функций или функций дл€ пакета). Ёто число беретс€ на основе представлений психологов о среднем оперативном буфере пам€ти человека. —имвольные образы в человеческом мозгу объедин€ютс€ в "чанки" Ч наборы фактов и св€зей между ними, запоминаемые и извлекаемые как единое целое. ¬ каждый момент времени человек может обрабатывать не более 7 чанков.

ћодуль (функци€) не должен превышать 60 строк. ¬ результате его можно поместить на одну страницу распечатки или легко просмотреть на экране монитора.

2) прочности (св€зности) модул€;

—уществует гипотеза о глобальных данных, утверждающа€, что глобальные данные вредны и опасны. »де€ глобальных данных дискредитирует себ€ так же, как и иде€ оператора безусловного перехода goto. Ћокальность данных дает возможность легко читать и понимать модули, а также легко удал€ть их из программы.

—в€зность (прочность) модул€ (cohesion) Ч мера независимости его частей. „ем выше св€зность модул€ Ч тем лучше, тем больше св€зей по отношению к оставшейс€ части программы он упр€тывает в себе. ћожно выделить типы св€зности, приведенные ниже.

‘ункциональна€ св€зность. ћодуль с функциональной св€зностью реализует одну какую-либо определенную функцию и не может быть разбит на 2 модул€ с теми же типами св€зностей.

ѕоследовательна€ св€зность. ћодуль с такой св€зностью может быть разбит на последовательные части, выполн€ющие независимые функции, но совместно реализующие единственную функцию. Ќапример, один и тот же модуль может быть использован сначала дл€ оценки, а затем дл€ обработки данных.

»нформационна€ (коммуникативна€) св€зность. ћодуль с информационной св€зностью Ч это модуль, который выполн€ет несколько операций или функций над одной и той же структурой данных (информационным объектом), котора€ считаетс€ неизвестной вне этого модул€. Ёта информационна€ св€зность примен€етс€ дл€ реализации абстрактных типов данных.

ќбратим внимание на то, что средства дл€ задани€ информационно прочных модулей отсутствовали в ранних €зыках программировани€ (например, FORTRAN и даже в оригинальной версии €зыка Pascal). » только позже, в €зыке программировани€ Ada, по€вилс€ пакет Ч средство задани€ информационно прочного модул€.

3) сцеплени€ модул€ с другими модул€ми;

—цепление (coupling) Ч мера относительной независимости модул€ от других модулей. Ќезависимые модули могут быть модифицированы без переделки других модулей. „ем слабее сцепление модул€, тем лучше. –ассмотрим различные типы сцеплени€.

Ќезависимые модули Ч это идеальный случай. ћодули ничего не знают друг о друге. ќрганизовать взаимодействие таких модулей можно, зна€ их интерфейс и соответствующим образом перенаправив выходные данные одного модул€ на вход другого. ƒостичь такого сцеплени€ сложно, да и не нужно, поскольку сцепление по данным (параметрическое сцепление) €вл€етс€ достаточно хорошим.

—цепление по данным (параметрическое) Ч это сцепление, когда данные передаютс€ модулю, как значени€ его параметров, либо как результат его обращени€ к другому модулю дл€ вычислени€ некоторой функции. Ётот вид сцеплени€ реализуетс€ в €зыках программировани€ при обращении к функци€м (процедурам). ƒве разновидности этого сцеплени€ определ€ютс€ характером данным.

Ј —цепление по простым элементам данных.

Ј —цепление по структуре данных. ¬ этом случае оба модул€ должны знать о внутренней структуре данных.

4) рутинности (идемпотентность, независимость от предыдущих обращений) модул€.

–утинность Ч это независимость модул€ от предыдущих обращений к нему (от предыстории). Ѕудем называть модуль рутинным, если результат его работы зависит только от количества переданных параметров (а не от количества обращений).

ћодуль должен быть рутинным в большинстве случаев, но есть и случаи, когда модуль должен сохран€ть историю. ¬ выборе степени рутинности модул€ пользуютс€ трем€ рекомендаци€ми.

  • ¬ большинстве случаев делаем модуль рутинным, т. е. независимым от предыдущих обращений.
  • «авис€щие от предыстории модули следует использовать только в тех случа€х, когда это необходимо дл€ сцеплени€ по данным.
  • ¬ спецификации завис€щего от предыстории модул€ должна быть четко сформулирована эта зависимость, чтобы пользователи имели возможность прогнозировать поведение такого модул€.

 

2.2. —труктурное программирование.

 

—труктурное программирование (—ѕ) возникло как вариант решени€ проблемы уменьшени€ —Ћќ∆Ќќ—“» разработки программного обеспечени€.

¬ начале эры программировани€ работа программиста ничем не регламентировалась. –ешаемые задачи не отличались размахом и масштабностью, использовались в основном машинно-ориентированные €зыки и близкие к ним €зык типа јссемблера, разрабатываемые программы редко достигали значительных размеров, не ставились жесткие ограничени€ на врем€ их разработки.

ѕо мере развити€ программировани€ по€вились задачи, дл€ решени€ которых определ€лись ограниченные сроки все более сложных задач с привлечением групп программистов. » как следствие, разработчики столкнулись с тем, что методы, пригодные дл€ разработки небольших задач, не могут быть использованы при разработке больших проектов в силу сложности последних.

“аким образом, цель структурного программировани€ - повышение надежности программ, обеспечение сопровождени€ и модификации, облегчение и ускорение разработки.

 

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

ѕодход базируетс€ на двух основных принципах:

  • ѕоследовательна€ декомпозици€ алгоритма решени€ задачи сверху вниз.
  • »спользование структурного кодировани€.

Ќапомним, что данна€ методологи€ €вл€етс€ важнейшим развитием императивной методологии.

ѕроисхождение, истори€ и эволюци€. —оздателем структурного подхода считаетс€ Ёдсгер ƒейкстра. ≈му также принадлежит попытка (к сожалению, совершенно неприменима€ дл€ массового программировани€) соединить структурное программирование с методами доказательства правильности создаваемых программ. ¬ его разработке участвовали такие известные ученые как ’. ћилс, ƒ.Ё.  нут, —. ’оор.

 

ћетоды и концепции, лежащие в основе структурного программировани€. »х три

ћетод алгоритмической декомпозиции сверху вниз Ч заключаетс€ в пошаговой детализации постановки задачи, начина€ с наиболее общей задачи. ƒанный метод обеспечивает хорошую структурированность. ћетод поддерживаетс€ концепцией алгоритма.

ћетод модульной организации частей программы Ч заключаетс€ в разбиении программы на специальные компоненты, называемые модул€ми. ћетод поддерживаетс€ концепцией модул€.

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

—труктурные €зыки программировани€. ќсновное отличие от классической методологии императивного программировани€ заключаетс€ в отказе (точнее, той или иной степени отказа) от оператора безусловного перехода.

[ѕратт “., 1979] "¬ажным дл€ программиста свойством синтаксиса €вл€етс€ возможность отразить в структуре программы структуру лежащего в ее основе алгоритма. ѕри использовании дл€ построени€ программы метода, известного под названием структурное программирование, программа конструируетс€ иерархически - сверху вниз (от главной программы к подпрограммам самого нижнего уровн€), с употреблением на каждом уровне только ограниченного набора управл€ющих структур: простых последовательностей инструкций, циклов и некоторых видов условных разветвлений. ѕри последовательном проведении этого метода структуру результирующих алгоритмов легко понимать, отлаживать и модифицировать. ¬ идеале у нас должна по€витьс€ возможность перевести построенную таким образом схему программы пр€мо в соответствующие программные инструкции, отражающие структуру алгоритма."

“еорема о структурировании (ЅЄма-ƒжакопини (Boem-Jacopini)): ¬с€кую правильную программу (т.е. программу с одним входом и одним выходом без зацикливаний и недостижимых веток) можно записать с использованием следующих логических структур - последовательность, выбора и повторение цикла

 

—ледствие 1: ¬с€кую программу можно привести к форме без оператора goto.

—ледствие 2: Ћюбой алгоритм можно реализовать в €зыке, основанном на трех управл€ющих конструкци€х -последовательность, цикл, повторение.

—ледствие 3: —ложность структурированных программ ограничена, даже в случае их неограниченного размера.

 

—труктурное программирование- это не самоцель. ≈го основное назначение- это получение хорошей ("правильной") программы, однако даже в самой хорошей программе операторы перехода goto иногда нужны: например - выход из множества вложенных циклов.

 

ѕрактически на всех €зыках, поддерживающих императивную методологию, можно разрабатывать программы и по данной методологии. ¬ р€де €зыков введены специальные заменители оператора goto, позвол€ющие облегчить управление циклами (например, Break и Continue в €зыке C).

 ласс задач.  ласс задач дл€ данной методологии соответствует классу задач дл€ императивной методологии. «аметим, что при этом удаетс€ разрабатывать более сложные программы, поскольку их легко воспринимать и анализировать.

–екомендации по литературе. ќдной из наиболее известных работ в этой области €вл€етс€ стать€ "«аметки по структурному программированию" [ƒейкстра 1975]. ћетоды структурного программировани€ подробно рассмотрены в книге "“еори€ и практика структурного прграммировани€" [Ћингер, ћиллс, ”итт 1982]. ѕрактику структурного программировани€ можно изучать по книге "јлгоритмы + структуры данных = программы" [¬ирт 1985]. ‘илософи€ визуального структурного программировани€ подробно изложена в работе [ѕаронджанов 1999].

 

ћетод объектно-ориентированного программировани€.

 

ћетод структурного программировани€ оказалс€ эффективен при написании программ Ђограниченной сложностиї. ќднако с возрастанием сложности реализуемых программных проектов и, соответственно, объема кода создаваемых программ, возможности метода структурного программировани€ оказались недостаточными.

ќсновной причиной возникших проблем можно считать то, что в программе не отражалась непосредственно структура €влений и пон€тий реального мира и св€зей межу ними. ѕри попытке анализа и модификации текста программы программист вынужден был оперировать искусственными категори€ми.

„тобы писать все более сложные программы, необходим был новый подход к программированию. ¬ итоге были разработаны принципы ќбъектно-ќриентированного ѕрограммировани€. OOP аккумулирует лучшие идеи, воплощЄнные в структурном программировании, и сочетает их с мощными новыми концепци€ми, которые позвол€ют по-новому организовывать ваши программы.

Ќадо сказать, что теоретические основы ќќѕ были заложены еще в 70-х годах прошлого века, но практическое их воплощение стало возможно лишь в середине 80-х, с по€влением соответствующих технических средств.

ћетодологи€ ќќѕ использует метод объектной декомпозиции, согласно которому структура системы (статическа€ составл€юща€) описываетс€ в терминах объектов и св€зей между ними, а поведение системы (динамическа€ составл€юща€) - в терминах обмена сообщени€ми между объектами. —ообщени€ могут быть как реакцией на событи€, вызываемые как внешними факторами, так и порождаемые самими объектами.

ќбъектно-ориентированные программы называют Ђпрограммами, управл€емыми от событийї, в отличие от традиционных программ, называемых Ђпрограммам, управл€емыми от данныхї.

 

ќсновные методы и концепции ќќѕ

  • ћетод объектно-ориентированной декомпозиции Ц заключаетс€ в выделении объектов и св€зей между ними. ћетод поддерживаетс€ концепци€ми инкапсул€ции, наследовани€ и полиморфизма.
  • ћетод абстрактных типов данных Ц метод, лежащий в основе инкапсул€ции. ѕоддерживаетс€ концепцией абстрактных типов данных.
  • ћетод пересылки сообщений Ц заключаетс€ в описании поведени€ системы в терминах обмена сообщени€ми между объектами. ѕоддерживаетс€ концепцией сообщени€.

 

¬ычислительна€ модель чистого ќќѕ поддерживает только одну операцию Ц посылку сообщени€ объекту. —ообщени€ могут иметь параметры, €вл€ющиес€ объектами. —амо сообщение тоже €вл€етс€ объектом.

ќбъект имеет набор обработчиков сообщений (набор методов). ” объекта есть пол€ Ц персональные переменные данного объекта, значени€ми которых €вл€ютс€ ссылки на другие объекты. ¬ одном из полей объекта хранитс€ ссылка на объект-предок, которому переадресуютс€ все сообщени€, не обработанные данным объектом. —труктуры, описывающие обработку и переадресацию сообщений, обычно выдел€ютс€ в отдельный объект, называемый классом данного объекта. —ам объект называетс€ экземпл€ром указанного класса.

 

—интаксис и семантика

¬ синтаксисе чистых объектно-ориентированных €зыков все может быть записано в форме посылки сообщений объектам.  ласс в объектно-ориентированных €зыках описывает структуру и функционирование множества объектов с подобными характеристиками, атрибутами и поведением. ќбъект принадлежит к некоторому классу и обладает своим собственным внутренним состо€нием. ћетоды Ч функциональные свойства, которые можно активизировать.

¬ объектно-ориентированном программировании определ€ют три основных свойства:

»нкапсул€ци€. Ёто сокрытие информации и комбинирование данных и функций (методов) внутри объекта.

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

Ѕольшинство окружающих нас объектов относитс€ к категори€м, рассмотренным в книге [Ўлеер, ћеллор 1993]:

  • –еальные объекты Ц абстракции предметов, существующих в физическом мире;
  • –оли Ц абстракции цели или назначени€ человека, части оборудовани€ или организации;
  • »нциденты Ц абстракции чего-то произошедшего или случившегос€;
  • ¬заимодействи€ Ц объекты, получающиес€ из отношени€ между другими объектами.

ѕолиморфизм (полиморфизм включени€) Ч присваивание действию одного имени, которое затем раздел€етс€ вверх и вниз по иерархии объектов, причем каждый объект иерархии выполн€ет это действие способом, подход€щим именно ему.

” каждого объекта есть ссылка на класс, к которому он относитс€. ѕри приеме сообщени€ объект обращаетс€ к классу дл€ обработки данного сообщени€. —ообщение может быть передано вверх по иерархии наследовани€, если сам класс не располагает методом дл€ его обработки. ≈сли обработчик событий дл€ сообщени€ выбираетс€ динамически, то методы, реализующие обработчиков событий, прин€то называть виртуальными.

≈стественным средством структурировани€ в данной методологии €вл€ютс€ классы.  лассы определ€ют, какие пол€ и методы экземпл€ра доступны извне, как обрабатывать отдельные сообщени€ и т. п. ¬ чистых объектно-ориентированных €зыках извне доступны только методы, а доступ к данным объекта возможен только через его методы.

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

ѕример описани€ в некотором абстрактном Pascal-подобном объектно-ориентированном €зыке класса Ђточкаї, €вл€ющегос€ наследником класса Ђкоординатыї может выгл€деть так:

Type TCoordinates = class (TObject)

x, y: integer;

Constructor Init (_x, _y: integer);

Function GetX: integer;

Function GetY: integer;

Procedure SetX (_x: integer);

Procedure SetY (_y: integer);

Procedure Move (dx, dy: integer);

Destructor Done; virtual;

Constructor Init();

x:= _x; y:= _y

end;

Function GetX: integer;

begin

GetX:= x

end;

.............

End;

TPoint = class (TCoordinates)

Color: integer;

Constructor Init (_x, _y, _Color: integer);

Function SetColor (_Color: integer);

Function GetColor: integer;

Constructor Init(_x, _y, _Color: integer);

Inherited Init(_x, _y);

Color:= _Color

end;

.............

End;

≈сли мы в дальнейшем хотим использовать экземпл€ры класса TPoint, их необходимо будет создать, вызвав метод-конструктор.

Var P1: Point;

P1.Init (0,0, 14); P1.Move (+2, -2);

ƒл€ поддержки концепции ќќ– были разработаны специальные объектно-ориентирован-ные €зыки программировани€. ¬се €зыки OOP можно разделить на три группы.

„истые €зыки, в наиболее классическом виде поддерживающие объектно-ориентированную методологию. “акие €зыки содержат небольшую €зыковую часть и существенную библиотеку, а также набор средств поддержки времени выполнени€.

√ибридные €зыки, которые по€вились в результате внедрени€ объектно-ориентированных конструкций в попул€рные императивные €зыки программировани€.

”резанные €зыки, которые по€вились в результате удалени€ из гибридных €зыков наиболее опасных и ненужных с позиций ќќѕ конструкций.

4. Ћогическое программирование.

¬ 70-х годах возникла ветвь €зыков декларативного программировани€, св€занна€ с проектами в области искусственного интеллекта, а именно €зыки логического программировани€.

—огласно логическому подходу к программированию, программа представл€ет собой совокупность правил или логических высказываний.  роме того, в программе допустимы логические причинно-следственные св€зи, в частности, на основе операции импликации.

“аким образом, €зыки логического программировани€ базируютс€ на классической логике и применимы дл€ систем логического вывода, в частности, дл€ так называемых экспертных систем. Ќа €зыках логического программировани€ естественно формализуетс€ логика поведени€, и они применимы дл€ описаний правил прин€ти€ решений, например, в системах, ориентированных на поддержку бизнеса.

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

ќдним из недостатков логического подхода в концептуальном плане €вл€етс€ специфичность класса решаемых задач.

ƒругой недостаток практического характера состоит в сложности эффективной реализации дл€ прин€ти€ решений в реальном времени, скажем, дл€ систем жизнеобеспечени€.

Ќелинейность структуры программы €вл€етс€ особенностью декларативного подхода и, строго говор€, представл€ет собой оригинальную особенность, а не объективный недостаток.

в качестве примеров €зыков логического программировани€ можно привести Prolog (название возникло от слов PROgramming in LOGic) и Mercury.

5. ‘ункциональное программирование.

‘ункциональный подход к программированию по€вилс€ в результате проведени€ фундаментальных математических исследований.

¬рем€ по€влени€ теоретических работ, обосновывающих функциональный подход, относитс€ к 20-м Ц 30-м годам XX столети€.  ак мы убедимс€ впоследствии, теори€ часто значительно опережает практику программировани€, и важнейшие работы, которые сформировали математическую основу подхода, были написаны задолго до по€влени€ компьютеров и €зыков программировани€, которые потенциально могли бы реализовать эту теорию.

„то касаетс€ первой реализации, то она по€вилась в 50-х годах XX столети€ в форме €зыка LISP, о котором речь пойдет далее.

¬ажнейшей характеристикой функционального подхода €вл€етс€ то обсто€тельство, что вс€ка€ программа, разработанна€ на €зыке функционального программировани€, может рассматриватьс€ как функци€, аргументы которой, возможно, также €вл€ютс€ функци€ми.

‘ункциональный подход породил целое семейство €зыков, родоначальником которых, как уже отмечалось, стал €зык программировани€ LISP. ѕозднее, в 70-х годах, был разработан первоначальный вариант €зыка ML, который впоследствии развилс€, в частности, в SML, а также р€д других €зыков. »з них, пожалуй, самым Ђмолодымї €вл€етс€ созданный уже совсем недавно, в 90-х годах, €зык Haskell.

¬ажным преимуществом реализации €зыков функционального программировани€ €вл€етс€ автоматизированное динамическое распределение пам€ти компьютера дл€ хранени€ данных. ѕри этом программист избавл€етс€ от необходимости контролировать данные, а если потребуетс€, может запустить функцию Ђсборки мусораї Ц очистки пам€ти от тех данных, которые больше не понадоб€тс€ программе.

—ложные программы при функциональном подходе стро€тс€ посредством агрегировани€ функций. ѕри этом текст программы представл€ет собой функцию, некоторые аргументы которой можно также рассматривать как функции. “аким образом, повторное использование кода сводитс€ к вызову ранее описанной функции, структура которой, в отличие от процедуры императивного €зыка, математически прозрачна.

ѕоскольку функци€ €вл€етс€ естественным формализмом дл€ €зыков функционального программировани€, реализаци€ различных аспектов программировани€, св€занных с функци€ми, существенно упрощаетс€. »нтуитивно прозрачным становитс€ написание рекурсивных функций, т.е. функций, вызывающих самих себ€ в качестве аргумента. ≈стественной становитс€ и реализаци€ обработки рекурсивных структур данных.

Ѕлагодар€ реализации механизма сопоставлени€ с образцом, такие €зыки функционального программировани€ как ML и Haskell хорошо использовать дл€ символьной обработки.

≈стественно, €зыки функционального программировани€ не лишены и некоторых недостатков.

„асто к ним относ€т нелинейную структуру программы и относительно невысокую эффективность реализации. ќднако первый недостаток достаточно субъективен, а второй успешно преодолен современными реализаци€ми, в частности, р€дом последних трансл€торов €зыка SML, включа€ и компил€тор дл€ среды Microsoft.NET.

ƒл€ профессиональной разработки программного обеспечени€ на €зыках функционального программировани€ необходимо глубоко понимать природу функции.

«аметим, что под термином Ђфункци€ї в математической формализации и программной реализации имеютс€ в виду различные пон€ти€.

“ак, математической функцией f с областью определени€ A и областью значений B называетс€ множество упор€доченных пар

(a,b) A? B,

таких, что если

(a,b1) f и (a,b2) f,

то

b1 = b2.

¬ свою очередь, функцией в €зыке программировани€ называетс€ конструкци€ этого €зыка, описывающа€ правила преобразовани€ аргумента (так называемого фактического параметра) в результат.

ƒл€ формализации пон€ти€ Ђфункци€ї была построена математическа€ теори€, известна€ под названием ламбда-исчислени€. Ѕолее точно это исчисление следует именовать исчислением ламбда-конверсий.

ѕод конверсией понимаетс€ преобразование объектов исчислени€ (а в программировании Ц функций и данных) из одной формы в другую. »сходной задачей в математике было стремление к упрощению формы выражений. ¬ программировании именно эта задача не €вл€етс€ столь существенной, хот€, как мы увидим в дальнейшем, использование ламбда-исчислени€ как исходной формализации может способствовать упрощению вида программы, т.е. вести к оптимизации программного кода.

 роме того, конверсии обеспечивают переход к вновь введенным обозначени€м и, таким образом, позвол€ют представл€ть предметную область в более компактном либо более детальном виде, или, говор€ математическим €зыком, измен€ть уровень абстракции по отношению к предметной области. Ёту возможность широко используют также €зыки объектно-ориентированного и структурно-модульного программировани€ в иерархии объектов, фрагментов программ и структур данных. Ќа этом же принципе основано взаимодействие компонентов приложени€ в.NET. »менно в этом смысле переход к новым обозначени€м €вл€етс€ одним из важнейших элементов программировани€ в целом, и именно ламбда-исчисление (в отличие от многих других разделов математики) представл€ет собой адекватный способ формализации переобозначений.

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

–ассмотрим эволюцию €зыков программировани€, развивающихс€ в рамках функционального подхода.

–анние €зыки функционального программировани€, которые берут свое начало от классического €зыка LISP (LISt Processing), были предназначены, дл€ обработки списков, т.е. символьной информации. ѕри этом основными типами были атомарный элемент и список из атомарных элементов, а основной акцент делалс€ на анализе содержимого списка.

–азвитием ранних €зыков программировани€ стали €зыки функционального программировани€ с сильной типизацией, характерным примером здесь €вл€етс€ классический ML, и его пр€мой потомок SML. ¬ €зыках с сильной типизацией кажда€ конструкци€ (или выражение) должна иметь тип.

ѕри этом в более поздних €зыках функционального программировани€ нет необходимости в €вном приписывании типа, и типы изначально неопределенных выражений, как в SML, могут выводитьс€ (до запуска программы), исход€ из типов св€занных с ними выражений.

—ледующим шагом в развитии €зыков функционального программировани€ стала поддержка полиморфных функций, т.е. функций с параметрическими аргументами (аналогами математической функции с параметрами). ¬ частности, полиморфизм поддерживаетс€ в €зыках SML, Miranda и Haskell.

Ќа современном этапе развити€ возникли €зыки функционального программировани€ Ђнового поколени€ї со следующими расширенными возможност€ми: сопоставление с образцом (Scheme, SML, Miranda, Haskell), параметрический полиморфизм (SML) и так называемые Ђленивыеї (по мере необходимости) вычислени€ (Haskell, Miranda, SML).

—емейство €зыков функционального программировани€ довольно многочисленно. ќб этом свидетельствует не столько значительный список €зыков, сколько тот факт, что многие €зыки дали начало целым направлени€м в программировании. Ќапомним, что LISP дал начало целому семейству €зыков: Scheme, InterLisp, COMMON Lisp и др.

Ќе стал исключением и изучаемый нами €зык программировани€ SML, который был создан в форме €зыка ML –. ћилнером (Robin Milner) в MIT (Massachusetts Institute of Technology) и первоначально предназначен дл€ логических выводов, в частности, доказательства теорем. язык отличаетс€ строгой типизацией, в нем отсутствует параметрический полиморфизм.

–азвитием Ђклассическогої ML стали сразу три современных €зыка с практически одинаковыми возможност€ми (параметрический полиморфизм, сопоставление с образцом, Ђленивыеї вычислени€). Ёто €зык SML, разработанный в ¬еликобритании и —Ўј, CaML, созданный группой французских ученых института INRIA, SML/NJ Ц диалект SML из New Jersey, а также российска€ разработка Ц mosml (Ђмосковскийї диалект ML).

 

Ѕлизость к математической формализации и изначальна€ функциональна€ ориентированность послужили причиной следующих преимуществ функционального подхода:

  1. простота тестировани€ и верификации программного кода на основе возможности построени€ строгого математического доказательства корректности программ;
  2. унификаци€ представлени€ программы и данных (данные могут быть инкапсулированы в программу как аргументы функций, означивание или вычисление значени€ функции может производитьс€ по мере необходимости);
  3. безопасна€ типизаци€: недопустимые операции с данными исключены;
  4. динамическа€ типизаци€: возможно обнаружение ошибок типизации во врем€ выполнени€ (отсутствие этого свойства в ранних €зыках функционального программировани€ может приводить к переполнению оперативной пам€ти компьютера);
  5. независимость программной реализации от машинного представлени€ данных и системной архитектуры программы (программист сосредоточен на детал€х реализации, а не на особенност€х машинного представлени€ данных).

ѕо сравнению с другими €зыками программировани€, в том числе с ранними функциональными €зыками, SML обладает р€дом несомненных достоинств.   ним, в первую очередь, относ€тс€:

  1. безопасность программного кода, т.е. гаранти€ отсутстви€ переполнени€ пам€ти (в случае корректно написанной программы) и, соответственно, защиты от потенциальной неустойчивости работы системы посредством искусственного создани€ переполнени€ (такие €зыки программировани€ как Ђклассическийї C и C++ потенциально небезопасны);
  2. статическа€ типизаци€: все ошибки несоответстви€ типов вы€вл€ютс€ уже на стадии контрол€ соответстви€ типов в ходе трансл€ции (а не во врем€ выполнени€ программы, как в LISP и Scheme);
  3. выводимость типов (нет необходимости €вно указывать тип каждого выражени€, при этом результирующий программный код становитс€ более удобочитаемым, его легче хранить и повторно использовать).

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

≈ще одним мощным средством, облегчающим символьную обработку (в частности, декомпозицию и верификацию программ), €вл€етс€ механизм сопоставлени€ с образцом.

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

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

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

¬ случае выбора в качестве программной платформы технологии.NET, практически вне зависимости от аппаратной реализации, программист или руководитель программного проекта дополнительно получает следующие преимущества:

  1. интеграци€ различных €зыков функционального программировани€ (при этом максимально используютс€ преимущества каждого из €зыков, в частности, Scheme предоставл€ет механизм сопоставлени€ с образцом, а SML Ц возможность вычислени€ по мере необходимости);
  2. интеграци€ различных подходов к программированию на основе межъ€зыковой инфраструктуры Common Language Infrastructure, или CLI (в частности, возможно использование C# дл€ обеспечени€ преимуществ объектно-ориентированного подхода и SML Ц функционального, как в насто€щем курсе);
  3. обща€ унифицированна€ система типизации Common Type System, CTS (единообразное и безопасное управление типами данных в программе);
  4. многоступенчата€, гибка€ система обеспечени€ безопасности программного кода (в частности, на основе механизма сборок).

 



<== предыдуща€ лекци€ | следующа€ лекци€ ==>
–озд≥л XIV≥ ƒодатков≥ пенс≥йн≥ гарант≥њ дл€ окремих категор≥й ос≥б | —тать€ 3. ѕравова€ основа де€тельности полиции
ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2016-11-20; ћы поможем в написании ваших работ!; просмотров: 366 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

„тобы получилс€ студенческий борщ, его нужно варить также как и домашний, только без м€са и развести водой 1:10 © Ќеизвестно
==> читать все изречени€...

607 - | 592 -


© 2015-2023 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.132 с.