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

  • Різні визначення

  • Основні моделі програмування

  • Підходи та прийоми

  • Доступ до елементів об ’ єкту

  • Наслідування

  • Абстрактні класи. Абстрактні методи

  • Конструктори класу

  • Специфікатори керування доступом

  • конспект лекцій (ТСПП). Конспект лекцій з дисципліни 07 технологія створення програмних продуктів напряму 050101 Компютерні науки


    Скачать 14.87 Mb.
    НазваниеКонспект лекцій з дисципліни 07 технологія створення програмних продуктів напряму 050101 Компютерні науки
    Анкорконспект лекцій (ТСПП).docx
    Дата15.12.2017
    Размер14.87 Mb.
    Формат файлаdocx
    Имя файлаконспект лекцій (ТСПП).docx
    ТипКонспект
    #11579
    страница17 из 62
    1   ...   13   14   15   16   17   18   19   20   ...   62

    4.3. Парадигми програмування.


    Парадигма програмування - це система ідей і зрозуміти, які визначають стиль написання комп'ютерних програм, а також спосіб мислення програміста . Це спосіб концептуалізації, що визначає організацію обчислень і структурування роботи, виконуваної комп'ютером.

    Важливо відзначити, що парадигма програмування не визначається однозначно мовою програмування; практично всі сучасні мови програмування в тій чи іншій мірі допускають використання різних парадигм ( мультипарадигмальной програмування). Так на мові Сі, який не є об' єктно - орієнтованим, можна працювати відповідно до принципів об' єктно - орієнтованого програмування, хоча це і пов'язане з певними складнощами; функціональне програмування можна застосовувати при роботі на будь-якому імперативний мовою, в якому є функції (для цього достатньо не застосовувати присвоювання ), і т. д.

    Прихильність певної людини якоїсь однієї парадигмі іноді носити настільки сильний характер, що суперечки про переваги і недоліки різних парадигм відносяться в навколокомп' ютерні колах до розряду так званих "релігійних" воєн - холіваров.

    Різні визначення

    Далеко не всі автори, що використовують термін "парадигма програмування", вирішуються дати інтенсіональних визначення даного терміну. Однак і ті визначення, які вдається знайти, серйозно відрізняються один від одного.

    Діомідіс Спінелліс дає наступне визначення:

    Слово "парадигма" використовується в програмуванні для визначення сімейства позначень (нотацій), які поділяють загальний спосіб (методику) реалізацій програм. (У оригіналі: The word paradigm is used in computer science to talk about a family of notations that share a common way for describing program implementations)

    Для порівняння тій же автор наводити визначення з інших робіт. У статті Деніела Боброва парадигма визначається як "стиль програмування як опису намірів програміста". Брюс Шрайвер (Bruce Shriver) визначає парадигму програмування як "модель або підхід до вирішення проблеми", Лінда Фрідман (Linda Friedman) - як "підхід до вирішення проблем програмування".

    Памела Зейв (Pamela Zave) дає визначення парадигми як "способу роздуми про комп'ютерних системах" (у оригіналі "way of thinking about computer systems").

    Пітер Вегнер (Peter Wegner) пропонує інший підхід до визначення терміна парадигми програмування. У його роботі "Concepts and paradigms of object - oriented programming" [8]парадигми визначаються як "правила класифікації мов програмування відповідно з деякими умовами, які можуть бути перевірені".

    Тімоті Бадд пропонує розуміти термін "парадигма" як "спосіб концептуалізації того, що означати" робити обчислення ", і як завдання, що підлягають вирішенню на комп' ютері, повинні бути структуровані й організовані".

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

    Основні моделі програмування

    • Імперативне програмування

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

    • Функціональне програмування

    • Логічне програмування

    • Об' єктно - орієнтоване програмування

      • Програмування, засноване на класах

      • Програмування, засноване на прототипах

      • Суб' єктно - орієнтоване програмування

    Підходи та прийоми

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

    • Процедурне програмування

    • Декларативне програмування

    • Апплікатівное програмування

    • Узагальнене програмування

    • Доказове програмування

    • Породжує програмування

    • Аспектно- орієнтоване програмування

    • Агентно- орієнтоване програмування

    • Рекурсія

    • Автоматні програмування

    • Подієво - орієнтоване програмування

    • Компонентно- орієнтоване програмування

    • Літературне програмування



    4.4. Нові концепції програмування.


    За останні роки у сфері програмного забезпечення відбувся ряд значних змін. У результаті пошуку нових ідей програмування було розроблено три нові концепції програмування:

    • об' єктно - орієнтоване програмування (ТОП);

    • уніфікована мова моделювання (UML);

    • спеціалізовані засоби розробки програмного забезпечення.

    У деру чергу, розвиток об' єктно - орієнтованого методу програмування обумовлений обмеженістю інших методів програмування, розроблених раніше. Для того, щоб зрозуміти й оцінити значення ТОП, необхідно розібратися, в чому полягає ця обмеженість та яким чином вона проявляється в традиційних мовах програмування.

    Потреба нових концепцій створення програмного забезпечення

    З качану 60-х років ХХ століття завдяки появі високопродуктивних компіляторів мов високого рівня розробка програм стає індустрією. Залишається позаду година, коли програми розроблялися вченими з університетів самотужки або в невиликих лабораторіях. З" являються потужні корпорації із випуску програмного забезпечення, в штаті яких тисячі - висококласних програмістів. Для налагодження співпраці між ними при розробці серйозних програмних продуктів виникає потреба у встановленні певних механізмів взаємодії між різними програмними модулями. Така взаємодія може бути досягнута лише при наданні модулям властивості функціональності (тобто здатності поводити собі згідно до обставин та команд).

    З іншої сторони потреба в існуванні певних важелів керування програмними модулями виникає також з бажання використовувати одні і ті ж програмні модулі в різних проектах - при розробці різного програмного забезпечення. Така властивість називається переносимістю програмного коду. Вона має неабияке значення на ринку розробників програмного забезпечення, за яким, віриться, великі перспективи.

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

    Об’єктно - орієнтований підхід традиційно використовується в науці і техніці при розв" язуванні масштабних завдань. Застосування його до програмування отримало назву об" єктно - орієнтованого програмування (ТОП).

    Java як остаточне втілення ТОП

    Далі розглянемо реалізацію головних зрозуміти ТОП на прикладі мови програмування Java.

    Java вибрана тому, що, крім унікальної інтегровності з Internet, вона ще й розроблялася як повністю об" єктно - орієнтована мова програмування (скажімо, З++, Delphi маєть деякі відступи від ТОП у своєму синтаксисі, зумовлені, в деру чергу, прагненням прийнятності синтаксису своїх необ" єктно - орієнтованих попередників). Будь- які типи даних Java -програми починаючи від базових і закінчуючи самою програмою розглядаються з точки зору ТОП. Отже, короткий екскурс в ТОП.

    Означення класу

    Для того, щоб зрозуміти поняття класу, необхідно мати уявлення про ТОП. "ТОП - це більше філософія програмування, ніж набір інструкцій або ключових слів мови Java" [1]. Спробуємо продемонструвати доречність ТОП на практиці медичного працівника. При призначенні пацієнту в ході лікування певного хіміопрепарату лікар враховує такі фактори :

    • протипоказання при певних видах захворювань;

    • застереження для певної категорії пацієнтів (наприклад, вагітність);

    • реакції різних систем людського організму (центральна нервова система, серцево-судинна система, дерматологічні захворювання, ендокринна система, гематологічна система, респіраторна система і інші, зумовлені, наприклад, певними дозуваннями);

    • можливість передозування, токсикологія;

    • взаємодія з іншими хіміопрепаратами;

    • фармакодинаміка та фармакокінетика (тривалість і порядок дії);

    • механізм дії.

    Але з іншої сторони він не враховує наступне (принаймні це його цікавить набагато менше) :

    • торгівельні фірми, які займаються продажем даного хіміопрепарату;

    • технологія промислового виробництва даного хіміопрепарату;

    • ім’я вченого - автора хіміопрепарату.

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

    Тобто людина у своєму житті використовує цілком реальні об" єкти - одиниці, не заглиблюючись у їх внутрішню будову і це набагато простіше.

    Далі наведемо дещо розширене означення класу.

    Означення. Класом називається деяка абстрактна сутність, що задовольняє наступні вимоги:

    • клас повинний володіти добрі продуманим інтерфейсом, тобто способом взаємодії. Інтерфейс повинний надавати споживачу можливість виконати будь-яку операцію, що підтримує клас;

    • клас повинний символізувати концепцію в проблемній області, тобто він повинний грунтуватися на чомусь реальному;

    • клас повинний містити в собі усе, що може вимагатися від нього іншими класами;

    • клас повинний бути винятково надійним. Клас повинний відсіювати некоректні команди. Наприклад, неможливо виконати команду - призначити аспірин для лікування астматичного пацієнта.

    Тепер про ті, як такі міркування ТОП виглядають в Java. Отже, слідуючи ТОП, клас - це єдина можливість створити новий тип даних. Означення типу даних (класу) виглядає таким чином:

    class MyClass

    {

    // тут розміщуються елементи класу

    }

     

    Елементами класу можуть бути: змінні класу та методи.

    Змінні класу

    Змінні класу (називаються ще властивостями, полями, членами) використовуються для опису властивостей класу.

    Розглянемо клас, що описує хіміопрепарат:

    class Drug

    {

    // далі означуються змінні класу

    // назва хіміопрепарату

    String m_sTitle;

    // концентрація хіміопрепарату в плазмі (міліграм/мл)

    double m_dPlasmaDrugConcentration;

    // неперервне введення

    boolean m_bIntravenousInfusion;

    // швидкість неперервного введення

    double m_dInfusionRate;

    // доза при введенні з перервами

    double m_dDose;

    // година між введеннями хіміопрепарату у випадку з перервами

    double m_dDosingInterval;

    }

    Зрозуміло, що назва - важлива характеристика хіміопрепарату, також важливим є порядок дозування.

    Методи класу

    Елементи класу, які є функціями, називаються методами класу. Як показ повного дотримання концепцій ТОП в Java є ті, що усі функції повинні бути методами якогось класу (наприклад, в Delphi такого немає). Розглянемо означення методу на прикладі

    import java.lang.String;

    class Drug

    {

    // далі означуються змінні класу

    // назва хіміопрепарату

    String m_sTitle;

    // концентрація хіміопрепарату в плазмі (міліграм/мл)

    double m_dPlasmaDrugConcentration;

    // неперервне введення

    boolean m_bIntravenousInfusion;

    // швидкість неперервного введення

    double m_dInfusionRate;

    // доза при введенні з перервами

    double m_dDose;

    // година між введеннями хіміопрепарату у випадку з перервами

    double m_dDosingInterval;

    // далі - методи класу

    // призначене дозування (міліграм/хв)

    double DosingRate( )

    {

    if (m_bIntravenousInfusion)

    {

    return m_dInfusionRate;

    }

    else return m_dDose / m_dDosingInterval;

    }

    // AverageDrugConcentration - середня концентрація

    // хіміопрепарату (міліграм/мл)

    double AverageDrugConcentration(double dClearance)

    {

    return DosingRate( ) / dClearance;

    }

    }

    class Patient

    {

    String m_sName; // прізвище та ім" я пацієнта

    boolean m_bMale; // чоловік чи

    boolean m_bFemale; // жінка

    int m_nAge; // вік

    double m_dHeight; // зріст в см

    double m_dPlasmaCreatinine; // (міліграм/дл)

    double m_dRenalFunctionClearance; // значення очищення з таблиці ренальної функції

    Drug m_Drug; // хіміопрепарат, що призначається

    // методи класу

    // // вага в кг

    double BodyWeight( )

    {

    if (m_bMale)

    {

    return 0.73 * m_dHeight - 59.42;

    }

    else

    {

    // для жінок

    return 0.65 * m_dHeight - 50.74;

    }

    }

    double BodySurfaceArea( )

    {

    return Math.sqrt((m_dHeight * BodyWeight( )) / 3600);

    }

    // CreatinineClearance - очищення креатініну (мл/хв)

    double CreatinineClearance()

    {

    if (m_bMale)

    {

    return(m_dPlasmaCreatinine * 72);

    }

    else

    {

    return 0.85(m_dPlasmaCreatinine * 72);

    }

    }

    // очищення (мл/хв)

    double Clearance( )

    {

    return m_dRenalFunctionClearance * BodyWeight( );

    }

    }

    Опис методу починається з означення типу об’єкту, що повертається методом. Якщо метод не повертає об’єктів, то тип об’єкту, що повертається, буде void. Тип об" єкту, що повертається, вказується перед іменем методу. За іменем методу в круглих дужках міститься список так званих формальних параметрів (аргументів) методу. Якщо метод не містить аргументів, то список повинний бути порожнім. Якщо метод повертає щось (на відміну від void), то його тіло повинне містити ключове слово return, за яким – об’єкт, що повертається.

    Обєкти

    Поняття об’єкту і класу досить близькі. Клас вказує на тип предмету. Наприклад, аспірін - це речовина, що належить до класу хіміопрепаратів. З іншої сторони, кожен конкретний аспірин, призначений певному пацієнту - це об" єкт. Він може бути представлень змінною patient_aspirin, описаною, як показане нижче:

    Drug patient_aspirin = new Drug( );

    Створювати об’єкти одного класу можна як завгодно багато разів.

    Доступ до елементів об єкту

    Доступ до елементів об’єкту здійснюється за допомогою операторові крапка (.). Розглянемо наступну функцію:

    void Example( )

    {

    Patient currentPtnt = new Patient( );

    currentPtnt.m_sName = 'Петренко Тарас';

    currentPtnt.m_bMale = true;

    currentPtnt.m_nAge = 30;

    currentPtnt.m_dHeight = 180.5;

    currentPtnt.m_dRenalFunctionClearance = 30.0;

    currentPtnt.m_Drug = new Drug ( );

    currentPtnt.m_Drug.m_sTitle = 'Aspirin';

    currentPtnt.m_Drug.m_bIntravenousInfusion = false;

    currentPtnt.m_Drug.m_dDose = 325.0;

    currentPtnt.m_Drug.m_dDosingInterval = 300.0;

    double drugConcentration = currentPtnt.m_Drug.AverageDrugConcentration(Clearance( ));

    // у змінній drugConcentration - середня концентрація хіміопрепарату

    }

    Тут, наприклад, конструкція currentPtnt.m_sName здійснює доступ до елементу m_sName об" єкту currentPtnt, аcurrentPtnt.m_Drug.AverageDrugConcentration(double) викликає метод- функцію класу Drug.

    Наслідування

    У розумінні об" єктів реального світу, що нас оточують важливою є властивість наслідувати властивості своїх об" єктів - батьків. Наприклад, на запитання "Що таке аспірин "? студент-медик відповість приблизно таке : "Це хіміопрепарат, що застосовується у стоматології для лікування післяопераційного болю, у медицині - для лікування болів і лихоманки; може використовуватися для профілактики інфаркту міокарду та ішемічної хвороби серця; управління ревматоїдним артритом, ревматичної лихоманки, остеоартриту та подагри (висока доза)". Подробиці тут не істотні - важливо ті, що будь-яка відповідь починатиметься із слів "Аспірин - це хіміопрепарат .".

    Використання таких абстрактних термінів, як хіміопрепарат (про що піде мова далі) сприяє систематизації інформації.

    Систематизація, у свою чергу, допомагає істотньо скоротити кількість інформації, що потрібно запам" ятати. Наприклад, наступна модифікація класу Drug зменшує обсяг інформації, що потрібно зберігати, та робить класи більш гнучкими для розв" язання різноманітних завдань, за допомогою введення наступних підкласів :

    public class Drug

    {

    // далі означуються елементи класу

    }

    public class Aspirin extends Drug

    {

    String sBrandName;

    // .. решта означень класу

    }

    public class Abacavir extends Drug

    {

    String sBrandName;

    // .. решта означень класу

    }

    public class Abciximab extends Drug

    {

    String sBrandName;

    // .. решта означень класу

    }

    Тобто з кожним конкретним хіміопрепаратом пов" язується власний клас.

    Абстрактні класи. Абстрактні методи

    Немає нічого чудового в тому, що наш приклад з хіміопрепаратами мі розпочали з класу Drug, який не може існувати сам по собі. Дійсно, немає хіміопрепарату, який би не належав до підкласу конкретних хіміопрепаратів (наприклад, Abacavir, Abciximab, Absorbable gelatin, Aspirin і т.д.). Тобто кожен хіміопрепарат є або Acarbose, або Acebutolol, або Acetaminophen. Клас, такий як Drug, є більш абстрактним поняттям, ніж конкретний фізичний об" єкт, який безпосередньо можна взяти. Такий клас називається абстрактним класом. Головна особливість абстрактного класу - не існує об" єктів - екземплярів абстрактного класу. Тобто не існує екземплярів класу Drug, існують лише екземпляри його підкласів. Виникає питання про доцільність використання абстрактних класів. Відповідь продемонструємо модифікованим класом Drug :

    import java.lang.String;

    abstract public class Drug

    {

    // далі означуються змінні класу

    // концентрація хіміопрепарату в плазмі (міліграм/мл)

    double m_dPlasmaDrugConcentration;

    // далі - методи класу

    // призначене дозування (міліграм/хв)

    abstract public double DosingRate( )

    // AverageDrugConcentration - середня концентрація

    // хіміопрепарату (міліграм/мл)

    double AverageDrugConcentration(double dClearance)

    {

    return DosingRate( ) / dClearance;

    }

    }

    public class IntravenousInfusionDrug extends Drug

    {

    // швидкість неперервного введення

    double m_dInfusionRate;

    double DosingRate( )

    {

    return m_dInfusionRate;

    }

    }

    public class IntermittentlyGivenDrug extends Drug

    {

    // доза при введенні з перервами

    double m_dDose;

    // година між введеннями хіміопрепарату у випадку з перервами

    double m_dDosingInterval;

    double DosingRate( )

    {

    return m_dDose / m_dDosingInterval;

    }

    }

    public class Aspirin extends IntermittentlyGivenDrug

    {

    String m_sBrandName;

               

    // .. решта означень класу

    }

    Тут, крім виділення нового класу Aspirin для представлення конкретного хіміопрепарату, надана можливість враховувати спосіб введення хіміопрепарату(малий. 1). Метод DosingRate( ) класу Drug є абстрактним, оскільки неможливо розрахувати швидкість дозування для хіміопрепарату взагалі.

    У подальшому DosingRate( ) реалізовано у конкретних підкласахIntravenousInfusionDrug та IntermittentlyGivenDrug.

    http://intranet.tdmu.edu.ua/data/kafedra/theacher/medkat/marcenuk/%d0%a3%d0%ba%d1%80%d0%b0%d1%97%d0%bd%d1%81%d1%8c%d0%ba%d0%b0/%d0%9b%d0%b5%d0%ba%d1%86i%d1%97/developmentsystem/object45.gif

    Малюнок 1. Ієрархія класів для представлення хіміопрепаратів

     

    Статичні елементи класу

    Більшість властивостей, таких як m_dDose, m_dDosingInterval - унікальні для об" єктів. Але деякі властивості є спільними для усіх об" єктів даного класу. Наприклад, уявимо, що увесь аспірін, який використовується в даній клініці має єдину торгівельну марку, наприклад Regular Strength Bayer® Enteric 500 Aspirin [OTC]. Крім того, мі бажаємо вести облік усіх використань аспіріну. Це можна реалізувати за рахунок обліку усіх об" єктів класу Aspirin. Введемо означення.

    Елементами класу називаються властивості, що спільно використовуються всіма об" єктами даного класу.

    Елементами об" єкту називаються властивсоті, що не є спільними для всіх об" єктів класу.

    Елементи класу означуються за допомогою ключового слова static. З цієї заподій сморід називаються статичнимиелементами, на відміну від елементів об" єкту, які називаються нестатичними.

    Використовуючи поняття статичних елементів, маємо наступне оголошення класу Aspirin

     

    class Aspirin extends IntermittentlyGivenDrug

    {

    static String m_sBrandName; // торгівельна назва

    // .. решта означень класу

    }

    Якщо тепер мі змінимо значення торгівельної назви для одного об" єкту, то вона зміниться для усіх об" єктів цього ж класу:

    void SomeFunc( )

    {

    Aspirin asDrug1 = new Aspirin( );

    Aspirin asDrug2 = new Aspirin( );

    asDrug1.m_sBrandName = "Extra Strength Bayer® Enteric 500 Aspirin [OTC]";

    String str = asDrug2.m_sBrandName;

    // значення змінної str - "Extra Strength Bayer® Enteric 500 Aspirin [OTC]"

    }

    Конструктори класу

    Конструктор - це спеціальний метод класу, який автоматичний виконується шкірного разу, коли створюється об" єкт класу. Його мета - ініціалізація об" єкту в початковий стан. Конструктор відрізняється від усіх інших методів тим, що він має таке ж ім" я, що й клас. Розглянемо приклад:

    class Aspirin extends IntermittentlyGivenDrug

    {

    static String m_sBrandName; // торгівельна назва

    static int m_nCounter; // лічильник використань аспірину

    Aspirin( )

    {

    m_nCounter++; // інкрементація

    // .. решта ініціалізації

    }

    // .. решта означень класу

    }

    Зверніть увагу, що на відміну від інших методів, конструктор не має типу значення, що повертається.

    Специфікатори керування доступом

    Класи, елементи класів, елементи об" єктів можуть бути доступними або ні у різних файлах класах, пакетах завдяки спеціальних ключових слів (специфікаторів), що вказуються перед ними:

    Специфікатор

    Призначення

    не вказується, або ж friendly

    елементи доступні іншим класам в тому ж самому пакеті (застосовний і до класів)

    public

    елементи доступні для інших класів в довільному пакеті (застосовний і до класів)

    private

    змінні і методи доступні лише всередині власного класу (цей специфікатор незастосовний до класів)

    protected

    елементи доступні в методах того ж класу, або усіх його підкласів. Непов" язані класи не мають до них доступу, навіть якщо сморід з того ж пакету



    1   ...   13   14   15   16   17   18   19   20   ...   62


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