Файл: История и развитие методологии объектно-ориентированного программирования. Сферы применения (Развитие методологии объектно-ориентированного программирования).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 28.03.2023

Просмотров: 456

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

Объединение категорий с динамической типизацией (Objective-C имеет динамическую типизацию, как и его предшественник Smalltalk) дает синергию, которая приводит к невероятной гибкости, и это стало чем-то новым даже для популярных языков программирования. К примеру, в языке Java просто позволить String добавить метод checkSpelling сам по себе недостаточно, поскольку остальная часть программы не позволит вызывать этот новый метод – все методы должны быть известны во время компиляции как побочный эффект сильной типизации. Вместо этого необходимо использовать вспомогательные объекты, специальные классы или паттерны, и все это увеличивает сложность и громоздкость реализации.

Листинг 5 иллюстрирует пример описания и реализации категории в языке Objective-C.

Листинг 5. Пример описания и реализации категории в Objective-C

#import "ClassName.h"

@interface ClassName ( CategoryName )

methods declarations

@end

#import "CategoryName.h"

@implementation ClassName ( CategoryName )

methods bodies

@end

Преимущества Objective-C [12.]:

  1. Objective-C – очень «практичный» язык. Он использует в качестве среды разработки легковесную систему реального времени, написанную на Си, которая практически не увеличивает размер приложения. И это было значительным преимуществом в годы появления языка, поскольку большинство объектно-ориентированных систем того времени использовали большие виртуальные машины. Программы, написанные на Objective-C, имели тенденцию быть ненамного больше, чем размер их кода и библиотек (которые часто не нужно было включать в дистрибутив программного обеспечения), в отличие от систем Smalltalk, где требовались огромные объемы памяти только для того, чтобы открыть окно.
  2. Точно так же язык был реализован поверх существующих компиляторов Си (сначала как препроцессор, затем как модуль GCC), а не как новый компилятор. Это позволило Objective-C использовать огромную существующую коллекцию кода на Си, библиотек, инструментов и идей. Можно легко обернуть существующие библиотеки C в обертки Objective-C, чтобы придать им ООП-стиль и легко использовать их в своих программах. Иными словами, любая программа, написанная на Си, может быть улучшена с использованием возможностей Objective-C.
  3. Все эти практические изменения снизили барьер для входа, что было, вероятно, самой большой проблемой для широкого распространения Smalltalk в 1980-х годах. В целом Objective-C можно описать как обеспечивающий большую гибкость более поздних систем Smalltalk на языке, который развертывается так же легко, как и C.

Недостатки Objective-C [12.]:

  1. Первые версии Objective-C не поддерживали сборку мусора. В то время это было предметом некоторых дискуссий, и многие разработчики считали, что долгие язык избежал многих проблем Smalltalk, не включив эту функцию. Однако, оглядываясь назад, стоит заметить, что это серьезный недосмотр. Хотя некоторые сторонние реализации добавили эту функцию (особенно GNUStep), она остается вне стандарта.
  2. Другая проблема заключается в том, что Objective-C не включает механизм пространства имен. Вместо этого программисты вынуждены добавлять префиксы к именам классов, и даже в самом лучшем случае это плохое решение. Добавление системы пространств имен было бы простым и естественным в Objective-C (где они довольно четко вписываются в систему библиотек), поэтому несколько удивительно, что этого не произошло.
  3. Objective-C не поддерживает перегрузку операторов (хотя и поддерживает специальный полиморфизм), в отличие от некоторых других объектно-ориентированных языков программирования, таких как C++.
  4. Objective-C позволяет объекту наследовать только от одного класса (запрещая множественное наследование).
  5. Наконец, поскольку язык был основан на компиляторах языка Си, он по-прежнему сильно зависит от заголовочного файла для правильной работы. Это дополнительная сложность, которая больше не нужна и отсутствует в большинстве современных языков, таких как Java или C#.

Различия в реализации объектно-ориентированной парадигмы для языков C++ и Objective-C приведены в таблице 3. Несмотря на ряд трудностей, связанных с реализацией принципов ООП в ранних версиях языка C++, реализация в его более поздних версиях обладает рядом существенных преимуществ, которые делают этот язык (а также более современные си-подобные языки, такие как C#) лучшим выбором для реализации прикладных программ.

Таблица 3

Различия в реализации ООП

C++

Objective-C

Добавляет ООП, метапрограммирование и обобщенное программирование к языку Си

Добавляет к Си только ООП

Имеет встроенную стандартную библиотеку

Зависит от сторонних библиотек

Имеет множество различных применений

В основном используется для создания прикладных пользовательских приложений

Для реализации всех принципов ООП в ранних версиях языка необходимо большое количество кода

Простое управление классами и объектами


В следующем разделе выполняется проектирование и разработка простого программного приложения для демонстрации особенностей применения объектно-ориентированного программирования на примере языка программирования C#.

3. Реализация прикладного программного приложения с использованием объектно-ориентированной методологии

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

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

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

Каждый объект (вклад) имеет следующий набор атрибутов:

  • ФИО клиента банка, который открывает вклад;
  • Срок (количество лет), на который открывается вклад;
  • Сумма вклада (в рублях);
  • Процентная ставка.

В качестве программного средства для реализации приложения был выбран язык программирования C#, который является одним из наиболее востребованных и адаптивных языков программирования, способным выполнить поставленные задачи.

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

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


Рисунок 3 – Калькулятор вкладов на сайте Банки.ру. Доступен выбор валюты

3.2 Проектирование классов программы

Класс в C # определяется ключевым словом class, за которым следует идентификатор (имя) класса и набор элементов данных и методов в отдельном блоке кода. Классы в C# могут содержать следующие элементы:

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

В программе реализовано четыре класса – абстрактный (базовый) класс вклада Deposit и три класса-наследника: DepositYear (вклад с ежегодной капитализацией), DepositMonth (вклад с ежемесячной капитализацией), DepositDay (вклад с ежедневной капитализацией).

Для разработки семейства классов вкладов были выделены следующие сущности:

  1. Класс Deposit. Этот класс является базовым для всех остальных классов семейства вкладов, поэтому от него наследуются все остальные классы. Он содержит в себе следующие свойства:
    1. ФИО клиента банка, который открывает вклад (тип string);
    2. Срок (количество лет), на который открывается вклад (тип int);
    3. Сумма вклада в рублях (тип double);
    4. Процентная ставка по вкладу (тип double).

Для реализации условий по вкладу предусмотрены два статических поля MIN_SUM (тип double) и MIN_YEARS (тип int) для хранения минимальной вносимой суммы и минимального срока вклада соответственно.

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

p – это итоговая сумма, которую получит пользователь;

с – начальная сумма, которую положит пользователь на вклад;

r/n – это процентная ставка, деленная на количество дней начисления денег (n будет меняться в зависимости от того, какое значение выберет пользователь, например, если проценты начисляются ежедневно, то начислять деньги будут каждый день, и n=365, если ежемесячно, то начислять проценты будут раз в месяц, то есть 12 раз, значит n=12);

nt – это количество дней начисления денег, умноженное на количество лет, на которое хочет положить деньги пользователь.


  1. Класс DepositYear. Этот класс наследует свойства класса Deposit и переопределяет метод GetOverall способом, описанным в пункте 1 – проценты по вкладу рассчитываются ежегодно.
  2. Класс DepositMonth. Этот класс наследует свойства класса Deposit и переопределяет метод GetOverall способом, описанным в пункте 1 – проценты по вкладу рассчитываются ежемесячно.
  3. Класс DepositDay. Этот класс наследует свойства класса Deposit и переопределяет метод GetOverall способом, описанным в пункте 1 – проценты по вкладу рассчитываются ежедневно.

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

Классы реализуют интерфейс IComparable для сравнения объектов. Для этого в нем реализованы методы CompareTo и GetHashCode. Сравнение осуществляется по доходности вклада, вычисляемой при помощи GetOverall. Лучшим считается вклад с большей доходностью.

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

Значения статических полей MIN_SUM и MIN_YEARS переопределяются в классах-наследниках для реализации условий соответствующего вклада.

На рисунке 4 представлена диаграмма классов.

Рисунок 4 – Диаграмма классов программы

3.4 Проектирование интерфейса и алгоритмов программы

Окно приложения содержит единственную форму, вид которой приведен на рисунке 5. На форме расположен выпадающий список (ComboBox) для выбора типа вклада, текстовые поля (TextBox) для ввода ФИО пользователя, отображения процентной ставки и вывода информации соответственно. Кроме того, на форме присутствуют два регулятора типа «вверх-вниз» (NumericUpDown) – для ввода суммы вклада и срока хранения, две кнопки (Button) – для расчета дохода по выбранному вкладу за указанный срок с заданной суммой и подбора вклада по заданным параметрам (сроку и сумме). На форме также расположены шесть меток (Label) с необходимыми подписями к вышеуказанным элементам.