Главная страница
Навигация по странице:

  • Классы, методы и сообщения

  • Наследование и повторное использование кода

  • Более подробно о наследовании.

  • Разработка программного обеспечения.

  • Как получить исходные тексты

  • Что требуется знать для чтения книги

  • Глава 1 : Объектно- ориентированное мышление

  • 1.1. Почему ООП так популярно

  • 1.2.2.Пример из области программирования

  • 1.2.3. Принцип Чёрча и гипотеза Ворфа

  • Объектно-ориентированное программирование. Объектно-ориентированное программирование в действии. Объектноориентированное программирование


    Скачать 5.29 Mb.
    НазваниеОбъектноориентированное программирование
    АнкорОбъектно-ориентированное программирование
    Дата05.09.2022
    Размер5.29 Mb.
    Формат файлаpdf
    Имя файлаОбъектно-ориентированное программирование в действии.pdf
    ТипДокументы
    #662573
    страница1 из 23
      1   2   3   4   5   6   7   8   9   ...   23


    Т. Бадд.
    Объектно-ориентированное
    программирование
    PDF created with pdfFactory Pro trial version www.pdffactory.com

    Введение
    .
    I.
    Введение и общий замысел. Глава 1 дает неформальное определение базовых концепций объектно-ориентированного программирования. Глава 2 вводит принцип разработки на основе обязанностей. Эти две главы являются фундаментальными, и их следует изучить подробно. В частности, я настоятельно рекомендую выполнить по крайней мере одно упражнение с CRC-карточками из главы 2. Техника CRC-карточек, по моему мнению, является одной из лучших для определения функциональности, ответственности и инкапсуляции при базовой разработке проекта.
    II.
    Классы, методы и сообщения Главы 3 и 4 определяют синтаксис, используемый в языках Smalltalk, C++, Java, Objective-C и Object Pascal для задания классов, методов и посылки сообщений. Глава 3 заостряет внимание на статических свойствах (классах и методах), в то время как глава 4 описывает динамические аспекты (создание объектов и пересылку сообщений). Главы 5 и 6 развивают эти идеи. Здесь же начинаются обучающие примеры — образцы программ, разработанных в объектно-ориентированной манере и иллюстрирующих различные черты объектной техники.
    III.
    Наследование и повторное использование кода Главы 7, 8 и 9 вводят концепцию наследования и объясняют ее применение для обеспечения повторного использования кода. Пример из главы 8, написанный на языке Java, иллюстрирует также применение стандартного прикладного программного интерфейса (API — application program interface). В главе 9 противопоставляются наследование и композиция в качестве альтернативных техник обеспечения повторного использования кода.
    IV.
    Более подробно о наследовании. В главах с 10 по 13 концепция наследования анализируется более детально. Введение наследования оказывает влияние на почти все аспекты языка программирования, которое зачастую не сразу очевидно для начинающего. В главе 10 обсуждается поиск методов и их связывание с сообщениями. Там же иллюстрируется тот факт, что подклассы и подтипы — это не одно и то же. В главе 11 обсуждается семантика переопределения методов и отмечаются две совершенно различные интерпретации этого понятия. В главе 12 продолжается тема переопределения и исследуются некоторые следствия наследования применительно к механизмам управления памятью, присваивания и сравнения. Наконец, в главе 13 изучается множественное наследование.
    V.
    Полиморфизм. В значительной степени мощь объектно-ориентированного программирования проистекает из применения различных форм полиморфизма. В главе 14 читатель знакомится с основными механизмами полиморфизма в объектно-ориентированных языках и двумя показательными обучающими примерами. Первый пример в главе 15 рассматривает создание библиотек общего назначения. Конкретная библиотека, а именно недавно разработанная стандартная библиотека шаблонов (STL — Standard Template Library) для языка С++, обсуждается в главе 16.
    VI.
    Разработка программного обеспечения. В главе 17 обсуждается ряд стандартных тем компьютерной инженерии в контексте объектно-ориентированного программирования. Глава 18 знакомит с несколькими относительно новыми концепциями — средой разработки приложений и шаблонами разработки. Оба подхода основаны на использовании наборов классов. Наконец, в главе 19 приводится конкретный пример среды разработки.
    VII.
    Продвинутое изучение.Концепция классов при внимательном рассмотрении не столь проста, как нас пытались убедить в главе 3. В главе 20 рассмотрены более глубокие аспекты объектно-ориентированного программирования. Там же
    PDF created with pdfFactory Pro trial version www.pdffactory.com
    обсуждаются делегирование (являющееся примером объектно-ориентированного программирования без классов) и понятие метакласса (на уровне собственно языка программирования). В главе 21 в общих чертах описаны разнообразные техники реализации, применяющиеся при создании объектно-ориентированных языков.
    В десятинедельном курсе, который я читаю в университете штата Орегон, приблизительно одну неделю я посвящаю каждому из основных направлений, описанных выше. В то же самое время студенты работают над не слишком большим проектом. Конкретный объектно-ориентированный язык разработки они выбирают сами. Семестр заканчивается представлением дизайна проекта и его реализацией.
    Первое издание книги я закончил главой «Дополнительная информация». К сожалению, объектно-ориентированное программирование развивается так быстро, что любая дополнительная информация почти сразу устаревает. Поэтому я не включил во второе издание главу с таким названием. Вместо этого я попытаюсь поддерживать страничку Web с последними сведениями.
    Как получить исходные тексты
    Исходные тексты обучающих примеров, представленных в книге, можно получить анонимно, обратившись через ftp по адресу ftp.cs.orst.edu
    , каталог
    /pub/budd/oopintro
    . В том же каталоге можно будет найти дополнительную информацию, например список ошибок, обнаруженных в книге, упражнения, копии «прозрачек», которые я использую в своем курсе. Все это можно также увидеть через World Wide Web на моих личных домашних страницах по адресу http://www.cs.orst.edu/

    budd/oopintro
    . Вопросы вы можете посылать электронной почтой по адресу budd@cs.orst.edu или обычной почтой: Professor
    Timothy A. Budd, Department of Computer Science, Oregon State University, Corvallis,
    Oregon, 97331.
    Что требуется знать для чтения книги
    Я предполагаю, что читатель знаком хотя бы с одним традиционным языком программирования, например Pascal или С. Мои курсы были вполне успешно восприняты студентами последнего года undegraduate level и первого graduate level. В некоторых случаях (особенно в последней четверти книги) более глубокие знания окажутся полезны, но они не являются обязательными. Например, студент, который специализируется на разработке программного обеспечения, легче воспримет материал главы 17, а обучающийся построению компиляторов сочтет главу 21 вполне понятной. Тематику обеих глав можно упростить при необходимости.
    Глава 1 : Объектно- ориентированное мышление
    Объектно-ориентированное программирование (ООП) стало чрезвычайно популярно в последние несколько лет. Производители программного обеспечения бросаются создавать объектно-ориентированные версии своих продуктов. Появилось несчетное количество книг и специальных выпусков академических (и не только) журналов, посвященных этому предмету. Студенты стремятся к записи «компетентен в объектно-ориентированном программировании» в своих характеристиках. Чтобы оценить эту безумную активность, отметим, что объектно-ориентированное программирование приветствуется с б’ольшим энтузиазмом, чем тот, который мы видели ранее при провозглашении таких революционных идей, как «структурное программирование» или «экспертные системы».
    PDF created with pdfFactory Pro trial version www.pdffactory.com

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

    ООП — это революционная идея, совершенно непохожая на что-либо выдвигавшееся в программировании.

    ООП — это эволюционный шаг, естественным образом вытекающий из предшествующей истории.
    1.1. Почему ООП так популярно?
    Я перечислю некоторые (на мой взгляд — самые главные) причины огромной популярности объектно-ориентированного программирования в последнее десятилетие:

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

    желание перейти от существующих языков программирования к новой технологии;

    вдохновляющее сходство с идеями, родившимися в других областях.
    Объектно-ориентированное программирование является лишь последним звеном в длинной цепи решений, которые были предложены для разрешения «кризиса программного обеспечения». Положа руку на сердце: кризис программного обеспечения просто означает, что наше воображение и те задачи, которые мы хотим решить с помощью компьютеров, почти всегда опережают наши возможности.
    Несмотря на то что объектно-ориентированное программирование действительно помогает при создании сложных программных систем, важно помнить, что ООП не является «серебряной пулей» (термин, ставший популярным благодаря Фреду Бруксу
    [Brooks 1987]), которая запросто справляется с чудовищем. Программирование по- прежнему является одной из наиболее трудных задач, взваливаемых на себя человеком.
    Чтобы стать профессионалом в программировании, необходимы талант, способность к творчеству, интеллект, знания, логика, умение строить и использовать абстракции и, самое главное, опыт — даже в том случае, когда используются лучшие средства разработки.
    Я подозреваю, что есть и другая причина особой популярности таких языков программирования, как C++ и Object Pascal (по контрасту со Smalltalk и Beta). Она состоит в том, что и администрация и разработчики надеются, что программист на языках C или
    Pascal может перейти на C++ или Object Pascal с той же легкостью, с которой происходит добавление нескольких букв на титульный лист сертификата о специальности. К сожалению, так происходит не всегда. Объектно-ориентированное программирование является новым пониманием того, что собственно называется вычислениями, а также того, как мы можем структурировать информацию внутри компьютера. Чтобы стать профессионалом в технике ООП, требуется полная переоценка привычных методов разработки программ.
    1.2. Язык и мышление
    Человеческие существа не общаются непосредственно с объективным миром и с
    обществом в том смысле, как это обычно понимается. Они в значительной мере зависят
    от того конкретного языка, который стал их средой общения. Это совершенная
    PDF created with pdfFactory Pro trial version www.pdffactory.com

    иллюзия — полагать, что кто-то может согласовать себя с сущностью реальности без
    использования языка и что язык — всего лишь случайное средство решения конкретных
    задач общения или мышления. Суть вопроса в том, что «реальный мир» в значительной
    степени неосознанно строится на языковых привычках группы людей... Мы видим,
    слышим и испытываем остальные ощущения так, как мы это делаем, в значительной
    степени потому, что языковые обычаи нашего общества предрасполагают к
    определенному выбору способа интерпретации.
    Эдвард Сапир (цитировано по [Whorf 1956]).
    Цитата подчеркивает тот факт, что язык, на котором мы говорим, непосредственно влияет на способ восприятия мира. Это справедливо не только для естественных языков, подобных тем, что изучались в начале двадцатого века американскими лингвистами
    Эдвардом Сапиром и Ли Ворфом, но также и для искусственных языков, наподобие тех, что мы используем в программировании.
    1.2.1. Эскимосы и снег
    Примером, почти повсеместно цитируемым (хотя зачастую ошибочно — см.
    [Pillum 1991]) в качестве иллюстрации того, как язык влияет на мышление, является тот
    «факт», что в эскимосских (или юитских) языках имеется множество слов для описания различных типов снежного покрова — мокрого, плотного, подмерзшего и т. д. Это-то как раз не является удивительным. Любое сообщество с общими интересами естественным образом разрабатывает специализированный словарь необходимых понятий.
    Что действительно важно — не слишком абсолютизировать вывод, который мы можем сделать из этого простого наблюдения. Главное не в том, что глаз эскимосов в каком-то существенном аспекте отличается от моего собственного или что эскимосы могут видеть вещи, которые я не способен различать. С течением времени, с помощью тренировки, я бы стал ничуть не хуже различать разнообразные типы снежного покрова. Однако язык, на котором я говорю (а именно английский), не вынуждает меня заниматься этим, и тем самым указанные способности не являются для меня естественными.
    Таким образом, различные языки (например, эвенкийский) могут привести (но не обязательно требуют этого) к тому, чтобы смотреть на мир с разных сторон.
    Чтобы эффективно использовать ООП, требуется глядеть на мир иным способом. Само по себе применение объектно-ориентированного языка программирования (такого, как C++) не вынуждает стать объектно-ориентированным программистом. Использование объектно-ориентированного языка упрощает разработку объектно-ориентированных приложений, но, как было остроумно замечено, «программа фортрановского типа может быть написана на любом языке».
    1.2.2.Пример из области программирования
    Связь между языком и мышлением для естественных языков, о которой мы говорили, является еще более заметной для искусственных компьютерных языков. Язык программирования, в терминах которого разработчик думает о проблеме, вносит особые оттенки и, вообще говоря, изменяет даже сам алгоритм.
    Приведем пример, иллюстрирующий связь между компьютерным языком и способом решения задачи. Некоторое время назад один студент, работающий в области
    PDF created with pdfFactory Pro trial version www.pdffactory.com
    генетических исследований, столкнулся с необходимостью анализа последовательностей
    ДНК. Проблема могла быть сведена к относительно простой задаче. Молекула ДНК представляется в виде вектора из N целочисленных значений, где N очень велико (порядка десятков тысяч). Нужно было проверить, не является ли какой-либо участок длины M
    (M — фиксированная константа порядка 5–10) повторяющимся в последовательности
    ДНК.
    ACTCGGATCTTGCATTTCGGCAATTGGACCCTGACTTGGCCA...
    Программист, не долго думая, написал простую и прямолинейную программу на
    Fortran — нечто вроде
    DO 10 I = 1, N-M
    DO 10 J = 1, N-M
    FOUND=.TRUE.
    DO 20 K = 1, M
    20
    IF (X(I+K-1).NE.X(J+K-1)) FOUND=.FALSE.
    IF (FOUND) ...
    10
    CONTINUE
    Он был неприятно разочарован, когда пробные запуски программы показали, что она потребует многих часов для завершения работы. Студент обсудил эту проблему со студенткой, которая оказалась профессионалом в программировании на языке APL. Она сказала, что могла бы попробовать написать программу для решения этой задачи. Студент был в сомнении: Fortran известен как один из наиболее «эффективных» компилируемых языков, а APL реализовывался с помощью интерпретатора. Таким образом, тот факт, что
    APL-программист способен составить алгоритм, который требует для работы минуты, а не часы, был воспринят с определенной дозой недоверия.
    APL-программистка переформулировала задачу. Вместо того чтобы работать с вектором из N элементов, она представила данные в виде матрицы, имеющей приблизительно N строк и M столбцов:
    A C T C G G позиции 1 — M
    C T C G G A позиции 2 — M+1
    T C G G A T позиции 3 — M+2
    C G G A T T позиции 4 — M+3
    G G A T T C позиции 5 — M+4
    G A T T C T позиции 6 — M+5
    T G G A C C
    G G A C C C
    Затем студентка отсортировала матрицу по строкам. Если какой-то фрагмент оказывается повторяющимся, то в отсортированной матрице две соседние строки должны оказаться идентичными.
    T
    G
    G
    A
    C
    C
    T
    G
    G
    A
    C
    C
    Проверка этого условия оказывается тривиальной задачей. Причина, по которой APL- программа оказалась быстрее, не имела ничего общего со скоростью работы APL по сравнению с Fortran. Главным было то, что программа на Fortran использовала алгоритм со сложностью O(M ґ N 2), в то время как алгоритм сортировки APL-программы требовал примерно O(M ґ N log N) операций.
    PDF created with pdfFactory Pro trial version www.pdffactory.com

    Ключевой момент этой истории не в том, что APL является лучшим языком программирования, чем Fortran, но в том, что APL-программист естественным образом пришел к более удачному решению. В частности, из-за того, что на языке APL очень неудобно организовывать циклы, а сортировка является тривиальной операцией — ей соответствует встроенный оператор языка. Таким образом, раз уж сортировку можно столь легко использовать, хороший APL-программист всегда старается найти для нее новое применение. В этом смысле язык программирования, на котором записывается решение задачи, напрямую влияет на ход мыслей программиста, заставляя его рассматривать задачу под определенным углом.
    1.2.3. Принцип Чёрча и гипотеза Ворфа
    Легко поверить в утверждение, что язык, на котором высказывается идея, направляет мышление. Однако есть более сильное утверждение, известное среди лингвистов как гипотеза Сапира–Ворфа. Она идет еще дальше, хотя и является спорной [Pullum 1991].
    Гипотеза Сапира–Ворфа утверждает, что индивидуум, использующий некоторый язык, в состоянии вообразить или придумать нечто, не могущее быть переведенным или даже понятым индивидуумами из другой языковой среды. Такое происходит, если в языке второго индивидуума нет эквивалентных слов и отсутствуют концепции или категории для идей, вовлеченных в рассматриваемую мысль. Интересно сравнить данную идею с прямо противоположной концепцией в информатике — а именно принципом Чёрча.
    В 30-х годах у математиков пробудился большой интерес к различным формализмам, которые могут быть использованы при вычислениях. Эти идеи получили развитие в 40–
    50-х годах, когда они привлекли внимание молодого сообщества специалистов по информатике. Примерами таких систем являются модели, предложенные Чёрчем
    [Church 1936], Постом [Post 1936], Марковым [Markov 1951], Тьюрингом [Turing 1936],
    Клини [Kleene 1936] и другими. В одно время приводилось множество аргументов, доказывающих, что каждая из этих систем может быть использована для моделирования остальных. Часто такие доводы были двухсторонними, показывая, что обе модели эквивалентны с некой общей точки зрения. Все это привело логику Алонзо Чёрча к гипотезе, которая теперь связана с его именем.
    Принцип Чёрча: Любое вычисление, для которого существует эффективная процедура, может быть реализовано на машине Тьюринга.
    По самой своей природе это утверждение недоказуемо, поскольку мы не имеем строгого определения термина «эффективная процедура». Тем не менее до сих пор не было найдено контрпримера, и убедительность очевидности, по-видимому, благоприятствует принятию этого утверждения
    1 1
    Создание математического формализма вычислимости было связано с необходимостью определить понятие алгоритма. Пока исследования в этой области шли успешно, каждая новая формализованная последовательность вычислений получала имя «алгоритм» просто по определению. Когда же математики столкнулись с задачами, для которых пришлось доказывать отсутствие алгоритма, потребовалось формальное определение. В настоящий момент принято считать, что алгоритмом является последовательность действий, которая может быть сведена к программе, выполняемой с помощью машины
    Тьюринга. Или, в эквивалентной форме: последовательность действий, которая может быть сведена к программе для машины Поста, или конечного автомата Маркова, или же к последовательности рекурсивных функций Клини и Чёрча, является алгоритмом. Доказано, что все эти формальные системы вычислимости являются эквивалентными. Тем самым принцип Чёрча является аксиомой, не требующей доказательства, которая формализует понятие алгоритма («эффективной процедуры») и в силу статуса аксиомы опровергающего контрпримера иметь не может. — Примеч. перев.
    PDF created with pdfFactory Pro trial version www.pdffactory.com

    Признание принципа Чёрча имеет важное и глубокое следствие для языков программирования. Машины Тьюринга являются изумительно простыми механизмами.
    От языка программирования требуется немного, чтобы смоделировать такое устройство.
    В 1960-х годах, к примеру, было показано, что машина Тьюринга может быть смоделирована на любом языке программирования, в котором содержатся условные операторы и операторы цикла [Bohm 1966]. Этот не совсем правильно понимаемый результат был одним из основных доводов в защиту утверждения о том, что знаменитый оператор goto является ненужным.
    Если мы признаем принцип Чёрча, то любой язык, на котором можно смоделировать машину Тьюринга, является достаточно мощным, чтобы осуществить любой реализуемый алгоритм. Для решения проблемы надо построить машину Тьюринга, которая выдаст желаемый результат, — согласно принципу Чёрча такая машина должна существовать для каждого алгоритма. Затем остается только смоделировать машину Тьюринга на вашем любимом языке программирования. Тем самым споры об относительной «мощности» языков программирования — если под мощностью мы понимаем «способность решать задачи», — оказываются бессмысленными. Позднее Алан Перлис ввел удачный термин для подобных аргументов, назвав их «тьюринговская пропасть», поскольку из них так сложно выбраться, в то время как сами они столь фундаментально бесполезны.
    Заметим, что принцип Чёрча является в определенном смысле точной противоположностью гипотезы Сапира–Ворфа. Принцип Чёрча утверждает, что по своей сути все языки программирования идентичны. Любая идея, которая выражается на одном языке, может (согласно теории) быть реализована на другом. Гипотеза же Сапира–Ворфа, как вы помните, утверждает, что существуют идеи, не согласующиеся с этим принципом.
    Многие лингвисты отвергают гипотезу Сапира–Ворфа и вместо этого принимают
    «тьюринговский эквивалент» для естественных языков: любая идея в принципе может быть выражена на любом языке. Например, несмотря на то что язык людей, живущих в жарком климате, не содержит готовых понятий для типов снежного покрова, в принципе южане тоже могут стать специалистами в области гляциологии. Аналогично объектно- ориентированная техника не снабжает (в теории) вас новой вычислительной мощностью, которая позволила бы решить проблемы, недоступные для других средств. Но объектно- ориентированный подход делает задачу проще и приводит ее к более естественной форме.
    Это позволяет обращаться с проблемой таким образом, который благоприятствует управлению большими программными системами.
    Итак, как для компьютерных, так и для естественных языков справедливо: язык направляет мысли, но не предписывает их.
      1   2   3   4   5   6   7   8   9   ...   23


    написать администратору сайта