Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Технологии программирования. Компонентный подход

Покупка
Артикул: 837477.01.99
Доступ онлайн
1 000 ₽
В корзину
Курс посвящен технологическим проблемам разработки крупномасштабных программных систем и методам решения этих проблем. В нем рассказывается о современных способах организации разработки таких систем на основе компонентных технологий на примере Web-приложений с использованием технологий Java и .NET, а также дается введение в эти технологии. Студенты получат хорошее представление о методах разработки сложного программного обеспечения, об использовании современных подходов к промышленной разработке программ и о способах построения качественных и гибких программ в условиях жестких ограничений на проекты разработки. Они также познакомятся с элементами технологий создания распределенных приложений на платформах J2EE и .NET.

Компонентный подход в программировании: разработка сложных систем

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

Проблемы разработки сложных программных систем

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

  • Управление ресурсами: Затраты на разработку, включая зарплаты разработчиков, оборудование, лицензии, исследования и маркетинг.
  • Удобство использования: Необходимость удобства использования, включая документацию, производительность и взаимодействие с другими системами.
  • Качество программного обеспечения: Надежность, удобство использования, гибкость и удобство внесения изменений.

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

Принципы работы со сложными системами

Для решения проблем разработки сложных программных систем предлагается использовать следующие принципы:

  • Абстракция и уточнение: Рассмотрение сложных систем на разных уровнях абстракции, отвлекаясь от несущественных деталей.
  • Модульность: Организация сложной системы в виде набора более простых систем — модулей, взаимодействующих друг с другом через четко определенные интерфейсы.
  • Выделение интерфейсов и сокрытие информации: Модули должны взаимодействовать друг с другом через четко определенные интерфейсы и скрывать друг от друга внутреннюю информацию.
  • Адекватность, полнота, минимальность и простота интерфейсов: Хорошо спроектированные интерфейсы должны быть адекватными, полными, минимальными и простыми.
  • Разделение ответственности: Создание отдельных модулей под каждую задачу, решаемую системой.
  • Переиспользование: Избегать повторений описаний одних и тех же знаний в разных частях системы.

Жизненный цикл и процессы разработки ПО

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

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

Унифицированный процесс Rational и экстремальное программирование

В книге подробно рассматриваются два процесса разработки:

  • Унифицированный процесс Rational (RUP): Детально проработанная итеративная модель жизненного цикла ПО, основанная на трех ключевых идеях: ориентация на варианты использования, архитектура как основа разработки и итеративный подход.
  • Экстремальное программирование (XP): "Живой" (agile) метод разработки, делающий упор на использовании хороших разработчиков и гибкость в каждом конкретном проекте.

Анализ предметной области и требования к ПО

Для разработки полезного ПО необходимо понимать потребности пользователей и заказчиков. Анализ предметной области включает в себя:

  • Анализ деятельности организации.
  • Выделение потребностей пользователей.
  • Формулировку функций будущей системы.
  • Формулировку требований к ПО.

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

Качество ПО и методы его контроля

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

Методы контроля качества включают:

  • Тестирование.
  • Проверку на моделях.
  • Методы и техники, нацеленные на выявление нарушений формализованных правил построения исходного кода.
  • Методы и техники обычного или формализованного анализа проектной документации и исходного кода для выявления их свойств.

Архитектура программного обеспечения

Архитектура ПО определяет набор внутренних структур ПО, которые видны с различных точек зрения и состоят из компонентов, их связей и возможных взаимодействий между компонентами. Выбор архитектуры определяет большинство характеристик качества ПО.

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

Образцы проектирования

Образцы проектирования (design patterns) представляют собой шаблоны решения типовых задач. Выделяют следующие виды образцов:

  • Образцы анализа.
  • Архитектурные образцы.
  • Образцы проектирования в узком смысле.
  • Идиомы.
  • Образцы организации работ.

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

Принципы создания удобного пользовательского интерфейса

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

  • Адекватность интерфейса.
  • Производительность работы пользователей.
  • Скорость обучения новых пользователей.
  • Эффективность предотвращения и преодоления ошибок пользователей.
  • Субъективное удовлетворение пользователей.

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

Основные конструкции языков Java и C

В книге рассматриваются базовые элементы технологий Java и .NET и основные конструкции языков Java и С#.

Компонентные технологии и разработка распределенного ПО

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

421

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

Кулямин, В. В. Технологии программирования. Компонентный подход : краткий курс / В. В. Кулямин. - Москва : ИНТУИТ, 2016. - 421 с. - ISBN 5-9556-0067-1. - Текст : электронный. - URL: https://znanium.ru/catalog/product/2161059 (дата обращения: 22.04.2025). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов

                                    
Компонентный подход в программировании

2-е издание, исправленное

Кулямин В.В.

Национальный Открытый Университет “ИНТУИТ”
2016

2

УДК 004.42(076.6)
ББК 18
К90
Технологии программирования. Компонентный подход / Кулямин В.В. - M.: Национальный
Открытый Университет “ИНТУИТ”, 2016 (Основы информационных технологий)
ISBN 5-9556-0067-1

Курс посвящен технологическим проблемам разработки крупномасштабных программных систем и
методам решения этих проблем.
В нем рассказывается о современных способах организации разработки таких систем на основе
компонентных технологий на примере Web-приложений с использованием технологий Java и .NET, а
также дается введение в эти технологии. Студенты получат хорошее представление о методах
разработки сложного программного обеспечения, об использовании современных подходов к
промышленной разработке программ и о способах построения качественных и гибких программ в
условиях жестких ограничений на проекты разработки. Они также познакомятся с элементами
технологий создания распределенных приложений на платформах J2EE и .NET.

(c) ООО “ИНТУИТ.РУ”, 2006-2016
(c) Кулямин В.В., 2006-2016

3

Проблемы разработки сложных программных систем

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

Программы “большие” и “маленькие”

Основная тема данного курса — методы разработки “больших” и сложных программ.

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

Примером может служить программа, вычисляющая достаточно много (но не
слишком, не больше 30000) знаков числа .

Воспользуемся следующими формулами:

Соответсвующая программа на языке Java может выглядеть примерно так:

public class PiCalculator
{
  //Позволяет при вычислениях с повышенной точностью умножать и делить на числа
  //  <= 42949 = ( 2^32 mod CLUSTER_SIZE )
  //Эта константа должна быть степенью 10 для простоты представления чисел.
  private final static long CLUSTER_SIZE = 100000;
  
  //Определенное значение этого поля позволяет сосчитать
  //  numberOfClusters * lg( CLUSTER_SIZE )
  //точных цифр.
  private static int numberOfClusters;  

  private static void print(long a[])
  {
    for(int i = 0; i < numberOfClusters + 1; i++)
    {
      if (i == 0) System.out.print("" + a[i] + '.');
      else
      {
        StringBuffer s = new StringBuffer();
        long z = CLUSTER_SIZE/10;

4

        while(z > 0)
        {
          if (z > a[i]) { s.append(0); z /= 10; }
          else          break;
        }
        if (z != 0) s.append(a[i]);
        System.out.print(s);
      }
    }
    System.out.println();
  }

  private static void lndiv(long a[], int n)
  {
    for(int i = 0; i < numberOfClusters + 1; i++)
    {
      if (i != numberOfClusters)
      {
        a[i+1] += (a[i]%n)*CLUSTER_SIZE;
        a[i] /= n;
      }
      else a[i] /= n;
    }
  }

  private static void lnadd(long a[], long b[])
  {
    for(int i = numberOfClusters; i >= 0; i--)
    {
      if (i != 0) 
      {
        a[i-1] += (a[i] + b[i])/CLUSTER_SIZE;
        a[i] = (a[i] + b[i])%CLUSTER_SIZE;
      }
      else 
        a[i] = (a[i] + b[i])%CLUSTER_SIZE;
    }
  }

  private static void lnsub(long a[], long b[])
  {
    for(int i = numberOfClusters; i >= 0; i--)
    {
      if (i != 0)
      {
        if (a[i] < b[i]) { b[i-1]++; a[i] += CLUSTER_SIZE; }
        a[i] -= b[i];

5

      }
      else 
        a[i] -= b[i];
    }
  }

  public static void main (String[] args)
  {
    int i, j, numberOfDigits = 100, numberOfSteps; 

    if (args.length > 0) numberOfDigits = Integer.parseInt(args[0]);
    
    numberOfSteps = (int)(((numberOfDigits + 1)/(Math.log(5)/Math.log(10)) - 1)/2+1);
    numberOfClusters = (int)(numberOfDigits/(Math.log(CLUSTER_SIZE)/Math.log(10))+1);

    long a1[] = new long[numberOfClusters + 1];
    long b1[] = new long[numberOfClusters + 1];
    long c1[] = new long[numberOfClusters + 1];
    long a2[] = new long[numberOfClusters + 1];
    long b2[] = new long[numberOfClusters + 1];
    long c2[] = new long[numberOfClusters + 1];
    
    a1[0] = 16;
    a2[0] = 4;
    lndiv(a1, 5);
    lndiv(a2, 239);
    
    System.arraycopy(a1, 0, c1, 0, numberOfClusters + 1);
    System.arraycopy(a2, 0, c2, 0, numberOfClusters + 1);

    for(j = 1; j < numberOfSteps; j++)
    {
      lndiv(a1, 25);
      lndiv(a2, 239);
      lndiv(a2, 239);

      System.arraycopy(a1, 0, b1, 0, numberOfClusters + 1);
      System.arraycopy(a2, 0, b2, 0, numberOfClusters + 1);

      lndiv(b1, 2*j+1);
      lndiv(b2, 2*j+1);

      if (j%2 == 0) { lnadd(c1, b1); lnadd(c2, b2); }
      else          { lnsub(c1, b1); lnsub(c2, b2); }
    }

    lndiv(a1, 25);

6

    lndiv(a1, 2*numberOfSteps + 1);

    System.out.println("Оценка точности результата:");
    print(a1);

    lnsub(c1, c2);

    System.out.println("Результат:");
    print(c1);
  }
}

Пример 1.1.

Данная программа — “небольшая”, как по размерам (~150 строк), так и по другим
признакам:

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

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

Обычно сложная программа обладает следующими свойствами:

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

7

для пользователей.
Ее неправильная работа наносит ощутимый ущерб пользователям и другим
организациям и лицам, даже если сбои происходят не слишком часто.
Для выполнения своих задач она должна взаимодействовать с другими
программами и программно-аппаратными системами, работать на разных
платформах.
Пользователи, работающие с ней, приобретают дополнительные выгоды от того,
что программа развивается, в нее вносятся новые функции и устраняются ошибки.
Необходимо наличие проектной документации, позволяющей развивать ее,
возможно, вовсе не тем разработчикам, которые ее создавали, без больших затрат
на обратную разработку (реинжиниринг).
В ее разработку вовлечено значительное количество людей (более 5-ти человек).
“Большую” программу практически невозможно написать с первой попытки, с
небольшими усилиями и в одиночку.
Намного больше количество ее возможных пользователей, и еще больше тех лиц,
деятельность которых будет так или иначе затронута ее работой и результатами.

Примером “большой” программы может служить стандартная библиотека классов Java,
входящая в Java Development Kit [1].

Строго говоря, ни одно из указанных свойств не является обязательным для того,
чтобы программу можно было считать “большой”, но при наличии двух-трех из них
достаточно уверенно можно утверждать, что она “большая”.

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

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

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

8

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

Важно отметить, что практически полезная сложная программная система не
обязательно является “правильной”.

Большинство опытных разработчиков и исследователей считают, что практически
значимые программные системы всегда содержат ошибки. При переходе от
“небольших” программ к “большим” понятие “правильной” программы становится
практически бессмысленным. Говоря о программной системе, (в отличие от
приведенной выше программы вычисления числа?), нельзя утверждать, что она
“правильная”, т.е. всегда правильно решает все поставленные перед ней задачи. Этот
факт связан как с практической невозможностью полного доказательства или проверки
этого, так и с тем, что смысл существования программной системы — удовлетворение
потребностей и запросов большого количества различных заинтересованных лиц. А
эти потребности не только нечетко определены, различны для разных групп
пользователей и иногда противоречивы, но и значительно изменяются с течением
времени.

В связи с этим, вместо рассмотрения “правильных” и “неправильных” программных
систем, в силу практического отсутствия первых, рассматривают “достаточно
качественные” и “недостаточно качественные”.

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

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

9

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

Кроме того, особое внимание в курсе уделяется одному из подходов к разработке
сложного ПО, компонентной разработке, предлагающей строить такие системы
последовательно из отдельных элементов — компонентов, каждый из которых, в свою
очередь, может рассматриваться как отдельная программная система. Курс дает
введение в современные компонентные технологии разработки программных систем
на основе платформ J2EE и .NET.

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

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

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

Протест сообщества разработчиков против подобной бюрократизации разработки
программ и попыток механического использования теоретических рекомендаций
вылился в популярное сейчас движение живой разработки ПО (Agile Software
Development). Одним из примеров “живого” процесса разработки является набор
техник, известный как экстремальное программирование (Extreme Programming, XP).
Некоторые аспекты этих подходов также будут рассмотрены в данном курсе.

10

Похожие

Доступ онлайн
1 000 ₽
В корзину