Рубріки: Теорія

Мова, з якої починалось ООП

Сергій Бондаренко

Що таке Objective-C

Сьогодні мова піде про одну з легендарніших мов програмування – Objective-C. Це досить складна мова, з високим порогом входу, на якій написано величезна кількість програм для macOS, iPad та iPhone.

Відмінна риса цієї мови полягає в тому, що вона є розширенням для іншої мови програмування – С. Хоча останнім часом Objective-C значно поступається новій мові SWIFT, розробка Apple все ще залишається актуальною і викликає інтерес.

 

Історія появи Objective-C

Все почалося на початку 70-х років минулого століття. На зорі програмування використовувалася структурна парадигма написання коду. Завдяки цій архітектурі всі програми будувалися на трьох конструкціях: послідовність, розгалуження та цикл (плюс підпрограми). Подібна методологія мала суттєвий недолік, який ставав все більш очевидним у міру ускладнення програм – код виходив більш заплутаним та погано спиймався візуально. Виникла потреба у появі якоїсь технології, яка б дозволила раціональніше використовувати код. 

Таким рішенням стала одна з перших об’єктно-орієнтованих мов з динамічною типізацією – Smalltalk. Цікаво, що, хоча вона створювалася в сімдесятих, перша версія називалася Smalltalk-80 (напевно, розробники з науково-дослідного центру Xerox PARC давали ім’я з прицілом на майбутнє). Вже на той час Smalltalk могла похвалитися можливостями, які залишаються актуальними й донині – у нього був збирач сміття, динамічна типізація. Програми, написані на Smalltalk, компілювалися в байткод і виконувались віртуальною машиною, що дозволяло запускати код на будь-якому обладнанні.

Взявши за основу головні принципи мови Smalltalk, було створено Objective-C. Творцем Objective-C вважається Бред Кокс, який намагався на початку вісімдесятих зробити таку мову програмування, в якій було б вирішено проблему повторюваності коду. Objective-C будувався на базових припущеннях: клас як самостійний повноцінний об’єкт, передача повідомлень між класами, динамічна типізація. Найголовніше, що відрізняло цю мову – гнучкість. Програміст міг писати код С, а потім просто вставляти його в Objective-C і програма працювала.

У 1985 році Стівом Джобсом після його звільнення з Apple була організована компанія NeXT, в яку пішли працювати кілька розробників з Apple. Стів Джобс вибрав для розробки майбутніх проектів Objective-C, що вже розроблялась кілька років і була досить перспективним проектом, та ще й крос-сумісна із мовою С. Objective-C стала базовою мовою програмування для операційної системи NeXTEP OS.

У 1988 програмісти NeXT розробили для Objective-C компілятор та SDK. А в 1992 році доопрацюванням Objective-C та компілятора зайнялися також і учасники проекту GNU, так що GCC отримав сумісність із Objective-C. З покупкою NeXT, Apple придбала і цей SDK (включаючи компілятор, бібліотеки та середовище розробки). IDE отримало назву Xcode, а GUI – Interface Builder. Фреймворк Cocoa (API для macOS) зараз є найпопулярнішим середовищем розробки програм на Objective-C.

У лютому 2008 року Apple представив iPhone SDK 2.0, який дозволяв розробляти програми під платформу iOS. Це посприяло популяризації мови програмування Objective-C і дало можливість компанії Стіва Джобса швидко заповнити AppStore великою кількістю програм.

Синтаксис

З Objective-C можна працювати практично на будь-якому дистрибутиві GNU/Linux через gobjc компілятор, що включений в набір компіляторів GNU Compiler Collection.

 Розробка застосунків Objective-C під ОС Windows можлива через безкоштовні емулятори середовища POSIX:

  • mingw;
  • cygwin;
  • сервіси Microsoft Windows для UNIX

Коли програміст С дивиться на код Objective-C, він бачить вже знайомий синтаксис з деякими доповненнями — квадратними дужками, значком “@”, та код, що починається з NS (спадщина NeXTSTEP).

Найпростіша програма, яка виводить на екран текстове повідомлення, виглядає в Objective-C так:

int main(int argc, const char * argv[]) {

    @autoreleasepool {

           NSLog(@””Highload.today””);

    }

    return 0;

}

Коли потрібно запакувати в об’єкті Objective-C ціле, речове чи логічне значення, використовується клас NSNumber.

NSNumber *someNumber = [NSNumber numberWithInt:1];

з літеральным синтаксисом:

NSNumber *someNumber = @1;

Літеральный синтаксис поширюється на всі типи данних:

NSNumber *intNumber = @1;

NSNumber *floatNumber = @2.5f;

NSNumber *doubleNumber = @3.14159;

NSNumber *boolNumber = @YES;

NSNumber *charNumber = @’a’;

Змінні в Objective-C визначаются наступним чином:

int hours = 24;

/* де int – це тип змінної, hours – ім’я, 24 – значення */

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

Звертання до метода

Коли в Objective-C виникає звертання до будь-якого метода, це трактується не як звернення до функції, а як відправка повідомлення (із зазначенням аргументів та імені), аналогично тому, як це реалізовано в Smalltalk.  В цьому заключаєтся принципова відмінність Objective-C от С++, що є функціо-орієнтованою мовою. Оскільки Objective-C це об’єктно-ориентирована мова, цілком очікуєо, що вона відповідає головним принципам ООП:

  • інкапсуляція
  • приховування данних
  • наслідування
  • поліморфизм

Будь якому об’єкту, що використовується в коді, можна відправити повідомлення з будь-яким змістом. Об’єкт сам може не обробляти повідомлення. Натомість він може делегувати (перенаправити) повідомлення іншому об’єкту, який вже його обробить. Об’єкти можуть знаходитись у різних адресних просторах та на різних ПК.

Все об’єкти класів Objective-C разміщуються в динамічній памяти. Кожен об’єкт в Objective-C має власний ідентифікатор id. Замість id можна використовувати більш звичне позначення із явною вказівкою класу. В ідентифікаторах Objective-C заборонено використовувати розділові знаки (символи @, $ та %). Крім того, слід пам’ятати, що Objective-C это реєстрозалежна мова программування. 

Конструкція для відправлення повідомлень має такий вигляд:

[receiver method];

Аргументи в переданому повідомленні поділяються двокрапкою, параметрів може бути скільки завгодно:

[receiver methodAndFirstArgument: 20 andLastArgument: 30];

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

[receiver undefinedNumberParameters: oneParam, twoParam, threeParam, fourParam, fiveParam, sixParam, sevenParam];

Копіювання об’єктів

Ця мова програмування дозволяє копіювати будь-які об’єкти. Для цього слід звернутися до методу copy, визначеного в класі NSObject. При створенні копії викликається метод copyWithZone протоколу NSCopying. NSObject не підтримує цей протокол, тому протокол NSCopying має реалізовуватись у класах-спадкоємцях. Розрізняють два види цієї операції – поверхнева копія (shallow copy) та глибока копія (deep copy). Відмінність одного типу копіювання від іншого у тому, що при виконанні поверхневого копіювання копіюються не дані, лише вказівник на об’єкт із даними. Під час глибокого копіювання копіюється об’єкт із даними.

Оскільки Objective-C є «оберткою» для мови С чи С++, у ньому використовуються два типи файлів – заголовні файли (.h) і файли реалізації (.m).

Файли, створені при утворенні класса, можуть виглядати так:

//EOCPerson.h

#import

@interface EOCPerson:NSObject

@property (nonatomic, copy) NSString *firstName

@property (nonatomic, copy) NSString *lastName

@end

//EOCPerson.m

#import “EOCPerson.h”

@implementation EOCPerson

//Реалізація методів

@end

Припустимо, в класі Mycompany існує instance-змінні nameofcompany.

@interface Mycompany : NSObject

{

     NSString *nameofcompany;

}

Для доступу до неї оптимально звернутися до властивостей, які з’явилися в Objective-C 2.0. Щоб оголосити властивості, використовується ключове слово @property.

@property (retain) NSString *nameofcompany;

В дужках перераховуються атрибути доступу до instance-змінної. 

Булевий тип

На жаль, булеві дані в даній мові відсутні як тип. Оскільки для програмування це має критичне значення, його додають штучно, як BOOL (за фактом це unsigned char). Він може приймати значення або YES, або NO (так реалізовано в операційних системах NextStep, Mac OS X).

Протоколи

В інших мовах программування, наприклад, Java, вони називаються інтерфейсами. Протокол выглядає как перелік описів методів.

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

Приклад опису протоколу

@protocol TestProtocol 

-(void) test;

-(void) testWithName: (NSString *) name;

@end

Цикли

У Objective-C використовуються цикли таких типів:

  • while loop – Повторює оператор або групу операторів, поки задана умова є істинною. Він перевіряє умову до виконання тіла циклу.
  • for loop – Виконує послідовність операторів кілька разів, скорочуючи лічильник коду, що управляє змінною циклом.
  • do…while loop — Аналог оператора while, за винятком того, що він перевіряє умову наприкінці тіла циклу.
  • nested loops – Дозволяє застосовувати один або набір циклів всередині будь-якого іншого циклу, наприклад, while, for або do..while.

Розглянемо, як реалізовані у Objective-C цикли. Напишемо простенький код, який прийматиме рядкові дані та розділятиме їх на аргументи, нумеруючи кожне введене слово.

#include <stdio.h>

int main (int argc, const char *argv[]) {

    for (int i = 0; i < argc; i++) {

        printf(“arg %d : %s\n”, i, argv[i]);

    }

    return 0;

}

Цикл обробляє текст, у результаті програма друкує нове слово, змінюючи лічильник на одиницю. Тепер скомпілюємо програму та виконаємо у командному рядку

 

У Objective-C доступний контроль багатопоточних обчислень. Використовуючи директиву @synchronized()  якусь частину коду можна закрити від одночасного виконання паралельними потоками.

Недоліки мови Objective-C

  • Objective-C працює повільніше в порівнянні зі SWIFT
  • Код, що написан на Objective-C, працює в Swift. Але навпаки – ні
  • Відсутня можливість задіяти  возможность задіяти декларативну область «простір імен»
  • В Objective-C нема множинного успадкування
  • Механізм динамічного запуску робить методи оптимізації непридатними для використання та знижує продуктивність.

Приклади коду на Objective-C

І, насамкінець, розглянемо кілька прикладів додатків на Objective-C.

Код програми, яка обчислює коріння квадратного рівняння:

#include

#include

int main()

{

int F, G, H, J;

printf(“F = “);

scanf(“%d”, &F);

if (F == 0) {

printf(“Помилка, що пов’язана з аргументами квадратного рівняння.”);

return 0;

}

printf(“G = “);

scanf(“%d”, &G);

printf(“H = “);

scanf(“%d”, &H);

 

J = G * G – 4 * F * H;

if (J == 0) {

printf(“x = %f\n”, -G / 2.0 / F);

return 0;

}

 

if (J > 0) {

printf(“x1 = %f\nx2 = %f\n”,

(-G + sqrt(J)) / 2.0 / F, (-G – sqrt(J))/ 2.0 / F);

} else {

printf(“x1 = (%f, %f)\nx2 = (%f, %f)\n”,

-G / 2.0 / F, sqrt(-J) / 2.0 / F, -G / 2.0 / F, -sqrt(-J) / 2.0 /F);

}

return 0;

Приклад коду программи для переведення текста в регістр Camel Case 

#import <Foundation/Foundation.h>

 

#define LETTERS @”ABCDFEGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz”

 

NSString *camelCase(NSString *s) {

  return [[[s capitalizedString] componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:LETTERS] invertedSet]] componentsJoinedByString:@””];

}

int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSLog(@”%@”, camelCase(@”beliberda”));

    NSLog(@”%@”, camelCase(@”primer-Dva “));

    NSLog(@”%@”, camelCase(@”!!! eto_cHto_esche_PRIMER?..”));

    [pool drain];

    return 0;

}

Висновок

Сьогодні ця мова програмування стрімко втрачає популярність під тиском нових технологій, значно поступаючись більш простому та зручному SWIFT. Багато хто пророкує цій мові швидке забуття, тому вивчати її чи ні – вирішувати тільки вам. Будь-який програміст, який володіє мовою С, зможе розібратися з основами Objective-C за кілька годин. Для інших бажаючих краще зрозуміти тонкощі цієї мови програмування рекомендуємо подивитися відео . У ньому розповідається як створювати класи, викликати екземпляри класів, а також розповідається про властивості та методи класів.

Останні статті

Айтівець Міноборони США понабирав кредитів і хотів продати рф секретну інформацію

32-річний розробник безпеки інформаційних систем Агентства національної безпеки Джарех Себастьян Далке отримав 22 роки в'язниці…

30.04.2024

Простий та дешевий. Українська Flytech запустила масове виробництво розвідувальних БПЛА ARES

Українська компанія Flytech представила розвідувальний безпілотний літальний апарат ARES. Основні його переваги — недорога ціна…

30.04.2024

Запрошуємо взяти участь у премії TechComms Award. Розкажіть про свій потужний PR-проєкт у сфері IT

MC.today разом з Асоціацією IT Ukraine і сервісом моніторингу та аналітики згадок у ЗМІ та…

30.04.2024

«Йдеться про потенціал мобілізації»: Україна не планує примусово повертати українців із ЄС

Україна не буде примусово повертати чоловіків призовного віку з-за кордону. Про це повідомила у Брюсселі…

30.04.2024

В ЗСУ з’явився жіночий підрозділ БПЛА — і вже можна проходити конкурсний відбір

В Збройних Силах України з'явився жіночий підрозділ з БПЛА. І вже проводиться конкурсний відбір до…

30.04.2024

GitHub на наступному тижні випустить Copilot Workplace — ШІ-помічника для розробників

GitHub анонсував Copilot Workspace, середовище розробки з використанням «агентів на базі Copilot». За задумкою, вони…

30.04.2024