Навчіться програмувати в Delphi - складання калькулятора

Object Pascal

Автор: Ваннери

Ласкаво просимо до останнього епізоду серії «Навчись програмувати з початком». У перших чотирьох епізодах ми висвітлювали “Вступ та інсталяцію” безкоштовного видання Delphi Starter, а потім ми перейшли до основ IDE у “Створення в налагодженні”. У “Архітектурі та рівнях коду” були обговорені ключові концепції належної структури додатків, і в останньому епізоді ми розпочали “Проектування користувальницьких інтерфейсів”.

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

Кодування в C ++ та Object Pascal відрізняється. Спочатку я мав спокусу застосувати тут калькулятор по-своєму, але я зрозумів, що деяким розробникам може бути цікаво мати можливість порівняти, як ці дві мови можуть бути використані для реалізації того самого інтерфейсу та дизайну коду. Отже, я трохи змінив інтерфейс користувача калькулятора, який я створив у попередньому епізоді, щоб він відповідав Давидові.

Остаточний вихідний код проекту “Delphi Super Calculator” можна завантажити з мого Amazon S3.

Структура програми

Ось знімок екрана від менеджера проектів, і ви можете бачити, що проект калькулятора містить одну основну форму та п’ять одиниць із кодом.

У попередньому епізоді ми створили проект калькулятора з основною формою з 20 кнопками та міткою, яка виконує роль "дисплея". Дуже важливо відокремити код інтерфейсу користувача від логіки програми. Найкращий спосіб досягти цього розділення - використання інтерфейсів. Намагаючись відповідати дизайну Девіда, я додав до свого проекту новий блок "uInterfaces" і визначив там два інтерфейси. Один «ICalculator», який реалізує мій клас «TCalculator», і один «ICalculatorDisplay», який реалізований основною формою. Ці два інтерфейси є єдиним способом взаємодії інтерфейсу користувача з логікою програми.

Ви можете видалити зразок коду з класу “TCalculator”, який був доданий раніше для демонстраційних цілей, і ми можемо розпочати реалізацію калькулятора по-справжньому.

Наш клас “TCalculator” реалізує інтерфейс, і тому його не можна успадкувати безпосередньо від “TObject”, але його потрібно отримати від “TInterfacedObject”, який є базовим класом для всіх класів Delphi, що реалізує інтерфейси. Якщо ви не вказали базовий клас для свого об'єкта, ви будете успадковувати від “TObject”. Подібно всі інтерфейси Delphi походять від “IInterface”, а клас “TInterfacedObject” просто реалізує ці успадковані методи. Конструктор нашого класу “TCalculator” бере посилання на “ICalculatorDisplay” і зберігає його у приватному полі, тому в будь-який час, коли калькулятору потрібно щось відобразити, він може просто викликати метод “UpdateUI” і передати рядок, що відображатиметься. Це хороший дизайн. Клас калькулятора знає про користувальницький інтерфейс якомога менше. Він просто повинен мати можливість передавати рядок для відображення. Це може бути FireMonkey, VCL або, можливо, навіть консольний додаток.

Основна форма також містить посилання на клас “ICalculator” як приватне поле. Фактичне посилання на одиницю виміру “uCalculator” є у “імплементації”, використовуючи пункт форми, тому це максимально чисто. Код в основній формі повинен знати лише про методи інтерфейсу “ICalculator” для зв’язку з логікою програми.

Поки що це приблизно охоплює код С ++, який Девід обговорює у дописі блогу "Навчіться програмувати за допомогою C ++ Builder: №3, дизайн, архітектура та інтерфейси".

Наступні два епізоди стосуються внутрішньої роботи C ++, а Object Pascal просто робить все по-іншому. Моєю метою було імітувати в Delphi код із C ++. В Object Pascal немає поняття "розумні вказівники". Є конструктори та деструктори, які вам потрібно викликати, щоб створити екземпляр об’єкта та звільнити його.

У Delphi також не існує бібліотеки “boost”, а також не є додатковими типами, які забезпечують семантику, що допускає обнулення, як для простих, так і для об’єктних типів. Object Pascal по-іншому розглядає вбудовані типи, ніж C ++. Типи Object Pascal, що дозволяють обнуляти, заплановані на майбутнє - згідно з офіційною дорожньою картою RAD Studio, - але все ще немає. Для того, щоб певною мірою змоделювати тип “boost optional”, у проекті в проекті Delphi є одиниця “uOptionals”, яка використовує загальний тип “TO optional” для моделювання необов’язкових цілих чисел та необов’язкових подвійних значень, які використовує клас C ++ “TCalculator”.

Це дуже примітивно, але певною мірою імітує C ++, збільшує "необов'язкову" семантику.

Іншим цікавим типом у реалізації є поліморфний клас “оператор”, який виконує операцію над двома подвійними значеннями і повертає результат як double. Він також має функцію “Name”, яка використовується для відображення символу даної операції.

У Object Pascal ми можемо просто визначити клас за допомогою віртуальних абстрактних методів, який виступає в якості схеми для спеціалізованих класів, що забезпечують реалізації успадкованих абстрактних методів. Існує також глобальна заводська функція, яка повертає правильний тип екземпляра, сумісний з “TOperator”.

Решта коду проекту майже ідентична версії простого калькулятора C ++, доступній від GitHub. Остаточний вихідний код проекту “Delphi Super Calculator” можна завантажити з мого Amazon S3

Це воно! Сподіваюся, вам сподобалась серія "Навчись програмувати з Delphi", як і я.

Настав час нових викликів. Найближчими днями я буду проводити два глобальні вебінари, на які ви всі запрошені. Ви можете зареєструватися нижче:

  • 14 грудня: Розробка Appx для магазину Windows 10
  • 20 грудня: перехід на сервер RAD

Скоротіть час розробки та швидше виходьте на ринок за допомогою RAD Studio, Delphi або C ++ Builder.
Дизайн. Код. Скласти. Розгортати.
Почніть безкоштовну пробну версію сьогодні