ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C Часть 1

Чистка кода (#define, Refactor)

У бой-скаутов есть хорошее правило: «Оставь после себя место чище, чем до тебя». В нашем случае это правило можно применить к коду.

В Objective-C есть два мощных механизма форматирования и преобразования кода. Но не все о них знают и тем более — не все ними пользуются… Большинство программистов, когда замечают переменную, имя которой можно изменить (повысить выразительность кода) — не делают этого. Они просто боятся что-то менять в программе потому, что она может перестать работать. И в самом деле, если мы возмем код с урока Знакомство с GUI и изменим в нем имя переменной result — программа перестанет работать. Отказ работы программы будет связан с тем, что кроме кода, мы связывали эту переменную с интерфейсом нашей программы, то есть, нам прийдется вновь налаживать связь интерфейса с кодом для корректной работы.

Refactor выполняет за нас всю работу по переименованию переменных, функций и классов. Чтобы воспользоваться ним выделите ту часть строки, которую хотите переименовать (имя переменной, функции, класса). Затем нажмите правую кнопку и выберите пункт менюRefactor, в появившемся подменю выберите — Rename… После чего появится поле, в которое следует вписать новое имя (для примера я написал «myResult«) и нажимаем кнопку Preview. Теперь перед нами открылось окно разделенное на две части. В левой части ока мы видим каким код станет, а в правой — каким был.

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

Готово, вы только что изменили имя переменной и это никоем образом не повлияло на работу программы.

define — это второй механизм, который поможет сделать код чище и выразительнее. Дэфайны — это директива компилятор. Обычно дэфайны объявляют в отдельном классе или после импорта всех библиотек и классов. Ниже я приведу несколько простых примеров:

<code data-result="[object Object]">#define intNumber 10
#define floatNumber 14.2f
#define stringValue @"define"

#define circleArea(radians) (3.14159 * radians * radians)
#define logIntVariable(x) NSLog( @"Value of %s = %f",#x, x)</code>

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

<code data-result="[object Object]">NSLog(@"intNumber=%i", intNumber);
NSLog(@"floatNumber=%f", floatNumber);
NSLog(@"stringValue=%@", stringValue);

NSLog(@"circleArea=%f", circleArea(5));

float x = 20.2;
logIntVariable(x);</code>

Следует обратить внимание на тот факт, что строка кода NSLog(@»circleArea=%f», circleArea(2+3)); выдаст не такой результат какNSLog(@»circleArea=%f», circleArea(5)); (оператор умножения имеет преимущество перед оператором сложения), хотя, если быcircleArea — был функцией — результат был бы одинаковым.

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

Comments are closed.