Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Разработка Интернет-магазина (Обзор и Анализ предметной области)

Содержание:

Введение

Технология программирования представляет собой совокупность средств и методов, необходимых для разработки программного обеспечения. Решающее значение для специалиста в области информационных технологий и программирования имеет выбор парадигмы программирования, определяющей успешность реализации программного продукта, и соответствующего ей языка программирования. За последние 50 лет появились сотни языков, поддерживающих различные парадигмы, причем некоторые из них используют несколько парадигм (такие языки называют мультипарадигменными). Однако, несмотря на большое количество языков программирования, существует несколько действительно важных концепций программирования, и не так много языков, которые были бы актуальны на протяжении более десяти лет. Именно парадигмы программирования определяют общий способ проектирования прикладных программ. Парадигмой программирования называют используемый различными языками подход к программированию, то есть, проще говоря, набор идей и понятий, определяющих стиль написания программ. Среди основных парадигм программирования выделяют объектно-ориентированную, императивную, декларативную, структурную, функциональную и логическую. Большинство языков программирования, активно используемых в современной разработке прикладных программ, являются мультипарадигменными [5]. Таким образом, проектирование прикладных программ на современных языках программирования является актуальной задачей.

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

Цель данной курсовой работы – реализация интерактивной информационно-справочной системы «Интернет-магазин» на языке программирования высокого уровня C#. Для достижения цели в курсовой работе были поставлены следующие задачи:

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

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

Структурное программирование

Структурное программирование можно рассматривать как синтез таких идей, как модульность программы и нисходящее проектирование наряду с их конкретным представлением на уровне кодирования. Это способ организации программ, который облегчает их понимание, упрощает тестирование и делает более доступным изменение. Результаты показали, что использование структурного подхода вместе с другими улучшенными технологиями программирования может привести к увеличению производительности программиста и, соответственно, к снижению частоты появления ошибок в результирующем коде [10]. Методология структурного программирования пытается решить проблемы, связанные с безусловными переходами (то есть переходами в заданную точку программы без проверки выполнения любых условий), чтобы позволить программистам следовать логике программ [6].

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

Концепции структурного программирования препятствуют использованию операторов «goto» и поощряют блочность и модульность программ, нисходящий подход и возможность многократного использования кода. Программы, написанные с использованием структурного подхода, более читабельны и более надежны. Кроме того, затраты и время на разработку программного обеспечения меньше, когда применяется структурное программирование, поскольку меньшие блоки программ могут быть написаны независимо (иногда разными, отдельными программистами или группами) и затем объединены для достижения желаемого конечного результата. Программы могут быть легко изменены и обновлены в соответствии с внешними обстоятельствами. В структурированных программах любая функция может выполняться с использованием одной или нескольких базовых алгоритмических конструкций: следование, цикл или ветвление, как показано на рисунке 1.

Рисунок 1 – Основные алгоритмические конструкции

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

Одним из мотивов модульности программы в методы является подход «разделяй и властвуй», который делает разработку программ более управляемой за счет создания независимым программ из небольших простых частей. Другой мотив – повторное использование кода – использование существующих методов в качестве строительных блоков для создания новых программ. Создавать программы из готовых методов приходится чаще, чем создавать собственный код [8]. Третья причина – избежание повторения кода. Разделение программы на осмысленные методы облегчает отладку и сопровождение программы [7].

При разработке новой программы общая стратегия должна быть полностью спланирована до начала непосредственного написания кода. Это позволяет целиком сосредоточиться логике программы, не заботясь о синтаксических деталях отдельных инструкций. Как только общая программная стратегия четко определена, можно рассмотреть детали, связанные с отдельными программными операциями. Этот подход обычно называют «нисходящим» проектированием программы. В больших программах весь этот процесс может повторяться несколько раз с добавлением дополнительных деталей на каждом этапе [11].

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

Рисунок 2 – Функциональная структура программы, спроектированной с использованием нисходящего подхода

Как следует из рисунка 2, основная программа находится на уровне цели 1. Эта основная программа делится на два модуля (подцели 11 и 1S) по мере роста требований. Это главное преимущество модульного программирования. Нисходящая методология проектирования часто использует процесс, называемый поэтапным усовершенствованием, или «разделяй и властвуй», посредством которого ситуация постепенно улучшается до достижения самого низкого уровня в структурной схеме. Этот процесс также очень часто применяется к спецификации процедур более низкого уровня. Нисходящий подход часто называют другими именами – структурированный подход, составной подход, программирование с поэтапным усовершенствованием и так далее. Хотя имена различаются, в целом образуется единый подход: сначала определяется основная функция, которая должна быть выполнена, затем определяются ее подфункции, затем подфункции этих функций и т.д. Нисходящее проектирование состоит из серии шагов, определяющих функции, необходимые для решения задачи, с точки зрения самой задачи [13].

Эта методика может быть полезной для программ, использующих независимые программные модули (то есть определяемые пользователем процедуры и функции). Восходящий подход предполагает детальную разработку этих программных модулей на ранних этапах общего процесса проектирования. Общая разработка программы основывается на известных характеристиках этих отдельных модулей [12]. Восходящий подход противоположен нисходящему – он включает в себя написание модульной программы от частного к общему. То есть модули строятся от своего «скелета» в сторону увеличения кода, пока не будет получено общее решение. Это не очень приемлемая методология в модульном программировании, но, тем не менее, это полезный метод проектирования, когда в задачу входит только модификация и обновление уже существующей программы для получения необходимого результата.

Таким образом, структурное программирование позволяет разделить алгоритм на небольшие блоки. Эта стратегия была очень популярной в начале 1980-х годов. Однако с ростом сложности задач структурное программирование приводило к снижению качества кода, вследствие чего разработчикам требовалось писать все больше функций, которые очень редко могли использоваться в других программах. Многие программисты увидели в объектно-ориентированном программировании потенциальное решение возникшей проблемы. С одной стороны, Smalltalk использовали почти все более-менее сложные системы. С другой – использование виртуальных машин повышало требования к ресурсам. Smalltalk был первым широко распространенным объектно-ориентированным языком программирования. Здесь понятие класса стало основообразующей идеей для всех остальных конструкций языка (то есть класс в Смолтоке является примитивом, посредством которого описаны более сложные конструкции).

В 1983-м году появились сразу два языка, на которые повлияли языки Си и Smalltalk, а также структурный подход. Это были Objective-C и C++, которые пытались избавиться от необходимости повторного использования кода [14, 16]. Оба языка активно задействовали новую, объектно-ориентированную парадигму [15], быстро ставшую популярной.

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

Выбор методологии для создания программы до появления языков четвертого поколения учитывал размеры программ, которые обычно были небольшими. В небольших программах наиболее распространенным оператором обычно является оператор присваивания. Однако в больших программах (более 10000 строк) наиболее распространенным оператором обычно является вызов процедуры подпрограммы. Обеспечение правильной передачи параметров в правильную подпрограмму становится серьезной проблемой. Концепция объектно-ориентированного проектирования заключалась в определении всех классов (и связанных с ними отношений и поведения), которые имеют отношение к решаемой проблеме.

Несмотря на то что структурирование программы и использование иерархической модели может помочь в проектировании некоторого программного обеспечения, для ряда больших программ объективно-ориентированный подход, как оказалось, является более гибким, поскольку разделяет программу на набор модулей, каждый из которых управляет своими собственными данными, алгоритмами или устройствами, но доступ к ним возможен только при первом указании именованного доступа к объекту класса модуля. Вместо того, чтобы полагаться на схему иерархии структурного программирования, объектно-ориентированному программированию необходим набор ссылок, чтобы проследить, какие модули или классы доступны из других мест [9].

Состояние объекта в объектно-ориентированном языке является в основном внутренним или локальным для самого объекта. То есть состояние объекта представлено локальными переменными, объявленными как часть объекта и недоступными вне самого объекта. Каждый объект включает в себя набор функций и процедур, с помощью которых можно получить доступ и изменить локальное состояние. Они называются методами, но похожи на обычные процедуры и функции, за исключением того, что они могут автоматически получать доступ к данным объекта (в отличие от «внешнего мира») и, следовательно, могут рассматриваться как содержащие неявный параметр, представляющий сам объект.

Объекты могут быть объявлены путем создания шаблона для локального состояния и методов. Этот шаблон называется классом, и по сути он похож на тип данных. Действительно, во многих объектно-ориентированных языках класс является типом и включается в систему типов языка более или менее стандартными способами. Затем объявляются объекты определенного класса точно так же, как переменные определенного типа объявляются в языке, таком как Си или Паскаль. Говорят, что объект является экземпляром класса.

Центральным понятием объектно-ориентированного программирования является объект, который становится своего рода модулем, содержащим данные и подпрограмму. Объект – это самодостаточная сущность, которая имеет внутреннее состояние (содержащиеся в нем данные) и может отвечать на сообщения (обращения к его методам). Например, объект записей студента имеет состояние, состоящее из сведений обо всех зарегистрированных студентах. Если ему отправляется сообщение, в котором говорится о добавлении сведений о новом ученике, он отвечает, изменяя свое состояние. Если будет отправлено сообщение о том, что оно должно быть напечатано, оно ответит распечаткой списка сведений обо всех зарегистрированных студентах.

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

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

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

Наследование – это возможность определения для базового класса (предка) иерархии производных классов (наследников), в каждом из которых доступны элементы базового класса (их описание становится частью описания производного класса). Иначе говоря, наследование – механизм, посредством которого класс может наследовать элементы другого класса и добавлять к ним свои элементы. Как правило, базовый класс является общим, производные – более специальными, конкретными. Естественно, у класса-наследника обычно больше полей и методов, чем у класса-предка, так как при наследовании обычно добавляются новые элементы. Если имеется иерархия классов, то можно рассматривать защищенные (protected) элементы класса, которые доступны для методов своего класса и его наследников. Одиночное наследование – это случай, когда каждый производный класс может наследовать только от одного базового класса, тогда как множественное наследование – это случай, когда класс может наследовать от двух или более базовых классов. В современных объектно-ориентированных языках, таких как Java и C++, предусмотрено множественное наследование.

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

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

Анализ предметной области

Информационно-справочная система (ИСС) – это интегрированный набор компонентов для сбора, хранения и обработки данных, а также для предоставления информации, знаний и цифровых продуктов. Как правило, в информационно-справочных системах нет сложных алгоритмов обработки данных, а целью системы является поиск и выдача информации в удобном виде. Коммерческие фирмы и другие организации полагаются на информационно-справочные системы для осуществления и управления своей деятельностью, взаимодействия со своими клиентами и поставщиками, а также для конкуренции на рынке. Информационно-справочные системы используются для управления цепочками поставок и электронными рынками. Например, корпорации используют информационно-справочные системы для обработки финансовых счетов, управления своими человеческими ресурсами и привлечения потенциальных клиентов с помощью онлайн-акций. Многие крупные компании построены исключительно вокруг информационно-справочных систем. К ним относится Google, компания поисковых систем, которая получает большую часть своего дохода от рекламы по некоторым ключевым словам с помощью поисковых запросов в Интернете. Цифровые товары, такие как электронные книги, видеопродукция и программное обеспечение, а также онлайн-сервисы, такие как игры и социальные сети, поставляются с информационно-справочными системами. Люди полагаются на информационно-справочные системы, обычно использующие Интернет, для ведения большей части своей личной жизни: для общения, учебы, покупок, банковских операций и развлечений.

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

Приложение было разработано на языке программирования C# [4] в виде оконного приложения, состоящего из трех экранных форм [3]. На главной форме реализованы функции просмотра ассортимента товаров, описания, добавления и удаления из корзины, вывода корзины на печать (с подсчетом общей суммы платежа). Две другие формы – просмотр изображения товара и вывод справочных сведений об авторе.

В разрабатываемом приложении пользователю необходимо:

  1. Выбрать набор необходимых товаров и добавить их в корзину;
  2. Распечатать содержимое корзины для формирования платежной квитанции;
  3. Для окончания работы приложения выбрать соответствующий пункт меню.

Описание программы

    1. Требования к программе

Наименование программы: Программное средство (ПС) для автоматизации работы интернет-магазина.

Область применения: Автоматизация учета действий покупателя в интернет-магазине хозяйственных товаров.

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

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

ПС должно быть разработано в интегрированной среде программирования Visual Studio 2019 Community на языке программирования C#.

ПС должно функционировать под управлением ОС семейства Windows.

    1. Требования к функциональным характеристикам

ПС «Интернет-магазин» должно обеспечивать следующие функциональные возможности:

  1. Добавление и удаление имеющихся товаров в корзину с указанием их количества и стоимости;
  2. Просмотр сведений об авторе программы;
  3. Формирование и печать чеков – подсчет общей стоимости всех товаров в корзине и вывод на печать с указанием названия товара, его стоимости и количества.

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

    1. Требования к надежности и информационной защищенности

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

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

Для обеспечения надежности необходимо:

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

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

    1. Требования к условиям эксплуатации

ПС «Интернет-магазин» предназначено для работы пользователей, которые должны обладать минимальными навыками работы на ПК и со стандартными приложениями Windows, на локальных компьютерах.

При необходимости модернизации ПС или его усовершенствования, необходимо, чтобы на компьютере программиста был установлен полный пакет среды программирования Visual Studio 2019 Community.

Программное средство должно эксплуатироваться в условиях, принятых для эксплуатации технических средств, а именно:

  • температура окружающей среды (не более 30°С);
  • относительная влажность (не более 65%);
  • атмосферное давление (от 80 до 106,7 кПа);
  • расстояние между компьютерами (около 3 м);
  • запыленность воздуха не более 0,75 мг/

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

    1. Требования к эргономике и технической эстетике

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

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

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

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

    1. Требования к составу и параметрам технических средств

Программа должна работать на IBM-совместимых персональных компьютерах. Минимальная конфигурация:

  • процессор: Intel Pentium, AMD, Intel Celeron с тактовой частотой от 2.4 GHz и выше;
  • оперативная память не ниже 1 ГБ;
  • стандартная мышь;
  • объем свободного места на жестком диске не ниже 2 МБ;
  • клавиатура;
  • монитор.

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

    1. Описание входных и выходных данных

Входными данными являются объекты типа «Товар», содержащие следующие поля:

  • фирма-производитель товара;
  • модель товара;
  • складской номер товара;
  • название товара;
  • стоимость товара;
  • изображение товара;
  • описание товара.

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

    1. Описание архитектуры программы

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

Рисунок 3 – Структурная схема программы

Работа с программным средством осуществляется посредством недетерминированного набора вызовов событий [2]. Как правило, в такой набор событий входят основные действия, привязанные к соответствующим блокам в структурной схеме программы (рисунок 3). В блок-схеме алгоритма работы программы наборы вызовов событий могут быть описаны символами типа «Предопределенный процесс». Блок-схема укрупненного алгоритма работы с ПС представлена на рисунке 4.

Рисунок 4 – Блок-схема укрупненного алгоритма работы программы

Проектирование программного средства

    1. Назначение и условия применения программы

В процессе курсовой работы в соответствии с техническим заданием было разработано программное средство «Интернет-магазин», которое направлено на автоматизацию и повышение эффективности работы интернет-магазина. Исходный код основных модулей ПС приведен в приложении.

    1. Характеристики программы

Для работы с исходным кодом данного программного обеспечения необходим компьютер с установленным на нем средством разработки MS Visual Studio 2019. В программе могут обрабатываться данные, введенные пользователем при помощи клавиатуры или мыши (заранее созданные данные об ассортименте товаров загружаются в программу при запуске). Программное средство также может выгружать сформированную для печати информацию (чек) в pdf-документ и выводить на печать.

Разработанное приложение поддерживается на большинстве операционных систем, среди которых Windows XP, Windows Vista, Windows 7, 8, 10.

Помимо этого, программа корректно работает как на 32-разрядных системах, так и на 64-разрядных системах.

Для положительной работы программы необходимо всего 2 Мб свободной памяти на жестком диске компьютера и 128 Мб оперативной памяти. Исходя расчетных данных, каждый пользователь современного ПК может позволить себе использование разработанного программного продукта.

    1. Обращение к программе

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

Установка приложения не требуется; для запуска необходимо запустить исполняемый файл «ShoppingCart.exe» двойным щелчком мыши.

    1. Входные и выходные данные

Входными данными являются объекты типа «Товар», содержащие следующие поля:

  • фирма-производитель товара;
  • модель товара;
  • складской номер товара;
  • название товара;
  • стоимость товара;
  • изображение товара;
  • описание товара.

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

    1. Руководство пользователя и тестирование программы

Результатом тестирования приложения является набор тестов, на которых была проверена работа спроектированной программы, в виде входных текстов, предъявленных программе, и текстов ее ответных реакций. Для демонстрации программы необходимо подготовить тестовый набор данных. Объем этих данных должен быть достаточным для демонстрации всех функций разработанной программы с учетом проверок и обработки исключительных ситуаций [1]. В общем виде необходим набор тестов (ручное тестирование), на которых была проверена работа спроектированной программы. В данной работе тестирование приводится в виде набора снимков экрана с комментариями.

Для тестирования программы необходимо запустить файл «ShoppingCart.exe». На экране появится окно приложения, в котором выполнена загрузка списка товаров (рисунок 5).

Рисунок 5 – Главная форма интернет-магазина

При выборе одного из товаров в левой части экрана будет выведены его характеристики (см. 2.6, 3.4), как показано на рисунке 6.

На рисунке 7 проиллюстрирован вид корзины после добавления товара. Теперь доступна кнопка удаления товара.

Рисунок 6 – Выбор товара из списка

Рисунок 7 – Вид корзины после добавления товара

Вид корзины после добавления еще нескольких товаров приведен на рисунке 8. Рисунок 9 иллюстрирует вид корзины после удаления одного из товаров.

Рисунок 8 – Вид корзины после добавления нескольких товаров из списка

Рисунок 9 – Вид корзины после удаления цементной плитки

Вид корзины после печати чека приведен на рисунке 10. Рисунок 11 иллюстрирует вид формы с информацией о программе.

Рисунок 10 – Вид окна с чеком

Рисунок 11 – Вид окна с информацией о программе

Заключение

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

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

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

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

В процессе разработки курсовой работы ПС «Интернет-магазин» самостоятельно были изучены функции и возможности интегрированной среды разработки Microsoft Visual Studio. При разработке были закреплены навыки создания приложений в среде программирования Visual Studio на языке C#.

Разработка программного средства «Интернет-магазин» способствовала систематизации, закреплению и расширению знаний, полученных при изучении курса.

Закрепление теоретического материала происходило в ходе решения поставленной задачи – разработки алгоритма, перевода его на машинный язык и исправления появившихся во время решения ошибок.

Завершением курсового проектирования явилось написание пояснительной записки, при выполнении которой, также были закреплены основные знания по написанию отчетов в соответствии с ЕСПД.

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

Список использованных источников

  1. Евсеева О. Н., Шамшев А. Б. «Работа с базами данных на языке C#», 2009. – 170 с.
  2. Стиллмен Э., Грин Дж. «Изучаем C#», 2012. – 696 с.
  3. Троелсен Э. «Язык программирования C# 5.0 и платформа .NET 4.5», Вильямс, 2013. – 1312 с.
  4. Шилдт Г. «C# 4.0. Полное руководство», 2010. – 1056 с.
  5. Abott, R. Program Design by Informal English Descriptions, CACM, 1993, Vol. 26 No. 11, pp. 892 - 894.
  6. Biddle, R. L., Tempero, E. D., Teaching C++ Experience at Victoria University of Wellington, 1994, In Proceedings of Software Education Conference, Dunedin, New Zealand, pp. 274 - 281.
  7. Champeaux, D. D., Panel: Structured Analysis and Object-Oriented Analysis, ECOOP/OOPSLA ’90 Proceedings, pp. 135 - 139.
  8. Deitel, P. J., Deitel, H. M., Java How to Program, USA, Pearson Inc., 7th Ed., 2007, pp. 421 - 423.
  9. Hubbard, J. R., Programming with C++ Schaum’s Outlines, New York, 2005, McGraw-Hill Companies, Inc., pp. 273 – 299
  10. Istatkova, G. Algebra of Algorithms in Procedural and Object-Oriented, structured Programming, Automatica & Informatics, 2001, Vol.3, No. 4, pp. 56 - 62.
  11. Louden, K. C., Programming Languages: Principles and Practice, Boston, 1993, PWS Publishing Company, pp. 300 - 345.
  12. Owolabi, O., Ndeekor, C. B. Structured Programming with Pascal, Aba, 2005, Granite Ventures Nig. Ltd, pp. 19 - 21.
  13. Pressman, R. S., Software Engineering: A Practitioner’s Approach, New York, 2005, McGrawHill International 6th Ed., pp. 217 - 218.
  14. Страуструп Б. Язык программирования C++: специальное издание / Б. Страуструп; пер.: С. Анисимов, М. Кононов; ред.: Ф. Андреев, А. Ушаков. - [Б. м.]: Бином-Пресс, 2008. - 1098 с.
  15. Advantages and Disadvantages of C++ [Электронный ресурс] / Режим доступа: https://data-flair.training/blogs/advantages-and-disadvantages-of-cpp/ (дата обращения: 12.08.2020)
  16. Objective-C [Электронный ресурс] / Режим доступа: http://www.fact-index.com/o/ob/objective_c.html (дата обращения: 10.08.2020)

Приложение

Листинг А1. Исходный код модуля FrmHandySupply.cs

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Windows.Forms;

namespace burakAydemirFinalProject

{

public partial class frmHandySupply : Form

{

Product[] inventory = new Product[17];

List<decimal> decBuy = new List<decimal>();

List<Image> cartItem = new List<Image>();

int cartCount = 0;

public frmHandySupply()

{

InitializeComponent();

}

private void frmHandySupply_Load(object sender, EventArgs e)

{

// перемещние lblCartCount в начало btnCart, чтобы счетчик был виден, а не скрыт за кнопкой

lblCartCount.BringToFront();

// отображение количества товаров в корзине (0 на момент загрузки формы)

lblCartCount.Text = cartCount.ToString();

// добавить категории в список категорий

lstCategory.Items.Add("Аккум.дрель");

lstCategory.Items.Add("Пиломатериалы");

lstCategory.Items.Add("Винты");

lstCategory.Items.Add("Цементная плитка");

lstCategory.Items.Add("Клей для плитки");

lstCategory.Items.Add("Изолента");

lstCategory.Items.Add("Гидронасос");

lstCategory.Items.Add("Фонарный столб");

lstCategory.Items.Add("Угольный гриль");

lstCategory.Items.Add("Газонокосилка");

lstCategory.Items.Add("Садовый шланг");

lstCategory.Items.Add("Валики для краски");

lstCategory.Items.Add("Кисти");

lstCategory.Items.Add("Гаражный ключ");

lstCategory.Items.Add("Ящик (инструменты)");

lstCategory.Items.Add("Венок");

lstCategory.Items.Add("Рождеств. декор");

// добавить товары с описанием (взято с Amazon)

inventory[0] = new Product("Dewalt", "DCD771C2", "1000014677", "20-Volt Max Lithium-Ion Cordless Drill/Driver Kit", 99.00M, Image.FromFile("dewalt.jpg"), "Compact design fits into tight areas.\nTransmission offers 2-speed options.\nHighly rated high-powered motor");

inventory[1] = new Product("Lumber Supply", "161640", "161640", "2 in. x 4 in. x 96 in. Premium Kiln-Dried Whitewood Stud", 2.72M, Image.FromFile("stud.jpg"), "Use for framing, houses, barns, sheds, and other structures.\nUse for any other small projects.\nInterior or Exterior Use");

inventory[2] = new Product("Rock-On", "23320", "353046", "#9 x 2-1/4 in. Phillips High Low Threaded Wafer-Head Cement Board Screws", 8.33M, Image.FromFile("screws.jpg"), "(100-Pack)\nUse Rock-On screws for a variety of projects including bathtubs, showers, countertops and flooring applications.\nIdeal for attaching durock and wonderboard to wood and light gauge steel.");

inventory[3] = new Product("Durock", "172965", "917647", "Next Gen 1/2 in. x 3 ft. x 5 ft. Cement Board", 9.78M, Image.FromFile("durock.jpg"), "Backerboard for ceramic tile and exterior finish systems.\nLightweight cement board.\nWater-durable, mold-resistant substrate for high-moisture areas.");

inventory[4] = new Product("Custom Building Products", "FBG25", "731136", "FlexBond Gray 25 lb. Crack Prevention Mortar", 17.97M, Image.FromFile("thinset.jpg"), "For use with ceramic, metal and porcelain tile.\nFlexes up to 1/16 in. to prevent cracks.\nGreat bond strength.\nDries in as little as 24 hours.\nQualifies for a lifetime system warranty.");

inventory[5] = new Product("FibaTape", "FDW8248-U", "483689", "300 ft. White Self-Adhesive Mesh Drywall Joint Tape", 6.45M, Image.FromFile("tape.jpg"), "Made of fiberglass mesh for strong drywall joints. It can also be used for repairing small holes. It resists cracking and accommodates a range of temperature- and humidity levels. It is easy to apply and will not blister or bubble.");

inventory[6] = new Product("Basement Watchdog", "BW4000", "618637", "1/2 HP Big Combination Sump Pump System", 397.00M, Image.FromFile("sump.jpg"), "The primary system pumps 4,400 GPH at 0 ft. of lift and 3,200 GPH at 10 ft. of lift.\nThe backup system pumps 2,500 GPH at 0 ft. of lift and 1,730 GPH at 10 ft. of lift.");

inventory[7] = new Product("Malibu", "8422-4110-01", "1000022987", "1-Light Dark Brown LED Jelly Jar Pathway Light", 29.97M, Image.FromFile("pathlight.jpg"), "The light is constructed of durable metal with a bronze finish. It features a modern maritime design, making it an attractive way to increase security. It can be used on a flat surface, strung throughout your garden, or hung from the included shepherd's hook.");

inventory[8] = new Product("Weber", "14402001", "14402001", "Original Kettle Premium 22 in. Charcoal Grill in Copper", 149.00M, Image.FromFile("weber.jpg"), "Featuring 363 sq. in. of cooking space, the Weber One-Touch Gold 22-1/2 in. Charcoal Kettle Grill consists of heavy-gauge porcelain-enameled lid and bowl for durability and long grill life.");

inventory[9] = new Product("Yard Machines", "11A-B9BG729", "204686138", "21 in. 190 cc Walk-Behind Gas Lawn Mower", 239.00M, Image.FromFile("mower.jpg"), "The powerful Briggs && Stratton engine delivers solid, efficient power to tackle the yard. This 21 in. Push Mower offers 6 cutting positions to cut grass down to size, with high rear wheels makes it ideal for use on uneven terrain.");

inventory[10] = new Product("Goodyear Products", "20258074", "457712", "Premium 5/8 in. x 50 ft. Commercial Grade Black Rubber Water Hose", 29.97M, Image.FromFile("hose.jpg"), "The Goodyear 5/8 in. x 50 ft. Premium Commercial-Grade Rubber Water Hose is heavy-duty, kink-resistant and durable. It resists abrasion and won't degrade in sun or frost, making it ideal for any small to medium-sized landscape job. Reinforced for high burst strength.");

inventory[11] = new Product("Linzer", "RS 1013", "716937", "9 in. x 3/8 in. White Woven Roller Covers (3-Pack)", 10.54M, Image.FromFile("rollers.jpg"), "Great value 3-pack of 9 in. professional quality woven rollers leave an ultra smooth finish. Recommended for use with all premium paints on drywall or plaster. 9 in. woven roller covers are ideal for larger projects such as painting your dining room, kitchen or porch.");

inventory[12] = new Product("Linzer", "A1170-4", "703728", "All Paints Brush Set (4-Piece)", 16.76M, Image.FromFile("brushes.jpg"), "All Paints 4-Piece Brush Set feature wooden handles and plugs with polyester filaments. They feature rust and solvent-resistant ferrules. These brushes are great for most flat and satin paints and stains.");

inventory[13] = new Product("Chamberlain", "HD520EV", "1000053031", "1/2 HP Belt Drive Garage Door Opener with MyQ Technology", 188.00M, Image.FromFile("opener.jpg"), "Chamberlain's Premium MyQ 1/2 HP Belt Drive Garage Door Opener is an all-purpose garage door opener. It has a steel reinforced belt for quiet, long-lasting performance. It includes two visor remotes and a keypad - perfect for the family on the go.");

inventory[14] = new Product("Husky", "HOTC4609B1QBD", "763089", "46 in. 9-Drawer Mobile Workbench with Solid Wood Top", 239.00M, Image.FromFile("workbench.jpg"), "Steel construction with an industrial powder coated finish.\nSolid par wood top with protective coating.\nFull extension 75 lbs. rated ball bearing drawer slides on the top drawer, 50 lbs. rated ball bearing drawer slides on the other drawers.");

inventory[15] = new Product("Holiday Decor", "10015", "1001189057", "28 in. Fraser Fir Decorated Wreath", 29.98M, Image.FromFile("wreath.jpg"), "Fraser Fir wreaths are a classic traditional wreath. Fresh and fragrant with Bluish green needles and natural cones. The needles have a silver white underside.");

inventory[16] = new Product("Hallmark", "HPSRTH-2014", "HPSRTH-2014", "The Sorting Hat - Harry Potter - 2014 Hallmark Keepsake Ornament", 47.95M, Image.FromFile("harry.jpg"), "Hallmark 2014 The Sorting Hat Harry Potter Ornament will play dialogue from this scene when button is pushed.");

}

private void pbItem_Click(object sender, EventArgs e)

{

// увеличить изображение товара по клику

Image i = ((PictureBox)sender).Image;

frmItemImage frm = new frmItemImage(i);

frm.ShowDialog();

}

private void lstCategory_SelectedIndexChanged(object sender, EventArgs e)

{

try

{

// Заполнить поля элемента, выбранного из списка категорий (товаров)

pbItem.Image = inventory[lstCategory.SelectedIndex].Item;

lblMake.Text = inventory[lstCategory.SelectedIndex].Make;

lblModelDisplay.Text = inventory[lstCategory.SelectedIndex].Model;

lblSKUDisplay.Text = inventory[lstCategory.SelectedIndex].SKU;

lblDetail.Text = inventory[lstCategory.SelectedIndex].Type;

lblPrice.Text = inventory[lstCategory.SelectedIndex].Price.ToString("C");

lblDescription.Text = inventory[lstCategory.SelectedIndex].Description;

// Показать товар и информацию о нем, когда он выбирается из списка товаров

lblModel.Visible = true;

lblSKU.Visible = true;

lblEach.Visible = true;

grpDescription.Visible = true;

btnAdd.Visible = true;

btnDelete.Visible = true;

// Скрывать корзину в момент выбора товара из списка

lblCart.Visible = false;

lstCart.Visible = false;

lblSubtotal.Visible = false;

lblSubtotalDisplay.Visible = false;

btnCloseCart.Visible = false;

btnCheckout.Visible = false;

btnDelete.Visible = false;

}

catch (IndexOutOfRangeException)

{

MessageBox.Show("Выход за пределы диапазона!", "Ошибка");

}

}

private void btnAdd_Click(object sender, EventArgs e)

{

// Сопоставить товары, выбранные из списка, с их стоимостью, добавить в список покупок

lstCart.Items.Add(lstCategory.SelectedItem + " " + inventory[lstCategory.SelectedIndex].Price.ToString("C"));

decimal sum = 0.0M;

int y = 7;

// Посчитать число товаров и общую стоимость корзины

cartItem.Add(inventory[lstCategory.SelectedIndex].Item);

decBuy.Add(inventory[lstCategory.SelectedIndex].Price);

cartCount++;

// Отобразить количество товаров в корзине

lblCartCount.Text = cartCount.ToString();

for (int i = 0; i < decBuy.Count; i++)

sum += decBuy[i];

lblSubtotalDisplay.Text = sum.ToString("C");

// Отключить кнопку добавления, когда корзина заполнена (7 товаров), показать сообщение

if (lstCart.Items.Count == y)

{

btnAdd.Enabled = false;

MessageBox.Show("Вы добавили 7 товаров.", "Корзина заполнена!");

}

}

private void btnCart_Click(object sender, EventArgs e)

{

// Отобразить корзину покупок

lblCart.Visible = true;

lstCart.Visible = true;

lblSubtotal.Visible = true;

lblSubtotalDisplay.Visible = true;

btnCloseCart.Visible = true;

btnCheckout.Visible = true;

btnDelete.Visible = true;

}

private void btnCloseCart_Click(object sender, EventArgs e)

{

// Скрыть корзину покупок

lblCart.Visible = false;

lstCart.Visible = false;

lblSubtotal.Visible = false;

lblSubtotalDisplay.Visible = false;

btnCloseCart.Visible = false;

btnCheckout.Visible = false;

}

private void Checkout()

{

// Убедиться, что какие-то товары есть в корзине. Если есть, показать предварительный вывод на печать

if (lstCart.Items.Count == 0)

{

MessageBox.Show("В вашей корзине нет товаров.", "Корзина пуста!");

}

else

{

printPreviewDialog1.Document = printDocument1;

printPreviewDialog1.ShowDialog();

}

}

private void btnCheckout_Click(object sender, EventArgs e)

{

Checkout();

}

private void printPreviewToolStripMenuItem_Click(object sender, EventArgs e)

{

Checkout();

}

private void exitToolStripMenuItem_Click(object sender, EventArgs e)

{

// Закрытие формы

this.Close();

}

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)

{

// Переменные для подсчета общей стоимости

const decimal taxRate = .08M;

decimal sum = 0.0M;

decimal taxTotal = 0.0M;

decimal grandTotal = 0.0M;

// Проход по корзине покупок и подсчет общей стоимости

for (int i = 0; i < decBuy.Count; i++)

{

sum += decBuy[i];

}

// Расчет общей стоимости с НДС

taxTotal = sum * taxRate;

grandTotal = sum + taxTotal;

// Настройка параметров печати

Font headingFont = new Font("Calibri", 20);

Font generalFont = new Font("Calibri", 15);

Font listFont = new Font("Arial", 12);

Bitmap bmp = new Bitmap("logo.png");

Bitmap thumb;

float x = e.MarginBounds.Left;

float y = e.MarginBounds.Top;

// Вывод логотипа

e.Graphics.DrawImage(bmp, 275, 10);

x += 200;

// Показать слоган

e.Graphics.DrawString("''Мы пригодимся''", headingFont, Brushes.Black, x, 160);

y += headingFont.Height + 100;

// Отрисовка красной линии на счете

Pen redPen = new Pen(Color.Firebrick, 3);

Point point1 = new Point(40, 200);

Point point2 = new Point(800, 200);

e.Graphics.DrawLine(redPen, point1, point2);

// Соединить строку "Дата счета: " с текущей датой формирования чека

e.Graphics.DrawString("Дата счета: " + DateTime.Today.ToShortDateString(), generalFont, Brushes.Black, 40, 205);

// Просмотр корзины и добавление данных

for (int i = 0; i < lstCart.Items.Count; i++)

{

x = e.MarginBounds.Left;

y += 30;

thumb = new Bitmap(cartItem[i], 70, 70);

e.Graphics.DrawImage(thumb, x, y);

x += thumb.Width + 10;

y += 30;

e.Graphics.DrawString(lstCart.Items[i].ToString(), listFont, Brushes.Black, x, y);

y += listFont.Height + 20;

}

// Переменные для вывода информации платежа

string subTotal = "Промежуточный итог: " + sum.ToString("C");

string tax = "Ставка НДС: " + taxRate.ToString("P");

string totalTax = "Величина НДС: " + taxTotal.ToString("C");

string total = "Всего: " + grandTotal.ToString("C");

string message = "Спасибо за покупку в нашем интернет-магазине!";

x = 550;

y += generalFont.Height;

// Разбиение на строки всех значений

e.Graphics.DrawString(subTotal + "\n" + tax + "\n" + totalTax + "\n" + total, generalFont, Brushes.Black, x, y);

y += generalFont.Height;

// Вывод сообщения с благодарностью

e.Graphics.DrawString(message, generalFont, Brushes.Firebrick, e.MarginBounds.Left, y);

}

private void aboutToolStripMenuItem_Click(object sender, EventArgs e)

{

// отображение формы "Об авторе"

frmAbout aboutForm = new frmAbout();

aboutForm.ShowDialog();

}

private void btnDelete_Click(object sender, EventArgs e)

{

int j = lstCart.SelectedIndex;

if (j >= 0)

{

// Посчитать число товаров и общую стоимость корзины

decimal sum = 0.0M;

decBuy.RemoveAt(j);

cartItem.RemoveAt(j);

for (int i = 0; i < decBuy.Count; i++)

sum += decBuy[i];

cartCount--;

// Отобразить количество товаров в корзине

lblCartCount.Text = cartCount.ToString();

lblSubtotalDisplay.Text = sum.ToString("C");

lstCart.Items.RemoveAt(j);

}

else

{

MessageBox.Show("Не выбран номер товара для удаления. . . ", "Ошибка!");

return;

}

}

}

}

Листинг А2. Исходный код модуля FrmAbout.cs

using System;

using System.Reflection;

using System.Windows.Forms;

namespace burakAydemirFinalProject

{

partial class frmAbout : Form

{

public frmAbout()

{

InitializeComponent();

this.Text = String.Format("О приложении {0}", "Интернет-магазин");

this.labelProductName.Text = "Handy Supply";

this.labelVersion.Text = String.Format("Версия {0}", AssemblyVersion);

this.labelCopyright.Text = "Иван\u00a9 2020";

this.labelCompanyName.Text = "МОИ";

this.textBoxDescription.Text = "Выполнено летом 2020-го года на языке программирования C#.\r\n\r\n" +

"Среда разработки: Microsoft Visual Studio 2019 Community\r\n\r\n" +

"Благодарим за использование!";

}

#region Атрибуты сборки

public string AssemblyTitle

{

get

{

object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);

if (attributes.Length > 0)

{

AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];

if (titleAttribute.Title != "")

{

return titleAttribute.Title;

}

}

return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);

}

}

public string AssemblyVersion

{

get

{

return Assembly.GetExecutingAssembly().GetName().Version.ToString();

}

}

public string AssemblyDescription

{

get

{

object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);

if (attributes.Length == 0)

{

return "";

}

return ((AssemblyDescriptionAttribute)attributes[0]).Description;

}

}

public string AssemblyProduct

{

get

{

object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);

if (attributes.Length == 0)

{

return "";

}

return ((AssemblyProductAttribute)attributes[0]).Product;

}

}

public string AssemblyCopyright

{

get

{

object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);

if (attributes.Length == 0)

{

return "";

}

return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;

}

}

public string AssemblyCompany

{

get

{

object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);

if (attributes.Length == 0)

{

return "";

}

return ((AssemblyCompanyAttribute)attributes[0]).Company;

}

}

#endregion

}

}