Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ruby / ruby_notes

.pdf
Скачиваний:
105
Добавлен:
06.06.2015
Размер:
215.34 Кб
Скачать

§ 3. Советы начинающим

11

ную функцию и вызовем её в нужных местах. Сложность в выделении новой функции заключается во внимательном отношении к локальным переменным находящимся внутри модифицируемого кода. Их необходи• мо передавать в качестве аргументов новой функции. В нашем случае simple? зависит только от переменной содержащей значение проверя• емого числа.

def simple?(number)

return false if number == 1 for i in (2..number/2)

return false if number % i == 0 end

return true end

def number_decomposition(number) simple_1, simple_2 = number/2, number/2

while simple_1 > 1 and simple_2 < number

if simple?(simple_1) and simple?(simple_2)

puts "", "Ответ: #{simple_1} + #{simple_2} = #{num}" return

end

simple_1 -= 1 simple_2 += 1

end

puts "нет разбиения" end

Длинная процедура

Уже на заре программирования было ясно, что чем длиннее про• цедура, тем труднее понять, как она работает. В старых языках про• граммирования вызов процедуры был связан с дополнительными рас• ходами, которые удерживали программиста от использования малень• ких методов. Но технологии не стоят на месте, в современных языках программирования и на современных компьютерах издержки на вызов процедуры минимальны, можно сказать — практически отсутствуют. Однако возникают проблемы у того, кто читает код, приходиться часто переключаться с одного метода на другой. Но в этом нет ничего страш• ного, если вы выбрали толковые («говорящие») имена для функций.

12

Таким образом при правильном подборе имен нет необходимости изу• чать код той или иной процедуры.

def long_method bonus = nil while true

puts "Введите размер бонуса меньший 100:" bonus = gets.to_i

if bonus > 100

puts "ошибка ввода, попробуйте снова" end

end

salary = base_salary(bonus)

if Time.now.month > 9

salary += salary*(bonus/100) end

puts "------------"

puts "Зарплата составляет: #{salary} с надбавкой #{bonus}%" puts "------------"

end

Как определить какая процедура длинная? Следует придерживать• ся эвристического правила, гласящего, что если ощущается необходи• мость что-то прокомментировать, надо писать новую функцию. Конечно у начинающего программиста такого ощущения может и не возникнуть, но в любом случае внимательно посмотрите на написанную процедуру и попытайтесь понять — можно ли разделить его на отдельные части, так чтобы она стала короче и, как следствие, чище и понятнее. Не бойтесь если обращение к коду будет длиннее, чем код, который им замещается. Главным здесь является не длина функции в строчках, а её правильное название, четко объясняющее что и как делает эта функция. Даже одну строку имеет смысл выделить в функцию, если она нуждается в разъ• яснениях!

def get_bonus bonus = 0 while true

puts "Введите размер бонуса меньший 100:" bonus = gets.to_i

if bonus > 100

§ 3. Советы начинающим

13

puts "ошибка ввода, попробуйте снова" end

end

return bonus end

def calc_salary(bonus) salary = base_salary(bonus)

if Time.now.month > 9

salary += salary*(bonus/100) end

return salary end

def print_details puts "------------"

puts "Зарплата составляет: #{salary} с надбавкой #{bonus}%" puts "------------"

end

def long_method bonus = get_bonus()

salary = calc_salary(bonus) print_details(salary, bonus)

end

Теперь еще раз о пользе коротких функций. Во-первых, если выде• лена маленькая функция, увеличиваются шансы её использования дру• гими функциями. Во-вторых, функции более высокого уровня (из них происходит вызов коротких функций) начинают выглядеть как коммен• тарии. И вообще, изменение программного кода становиться намного проще, когда функции небольшие и структурированы.

Условные операторы и циклы тоже свидетельствуют о возможности выделения. Каждая ветвь условного оператора или тело цикла может быть записана отдельной функций.

# до замены

if a > 10 and b < 20 c = a

a = b

14

b = a else

a = a - b * 100 end

# после замены

if a > 10 and b < 20 a, b = swap(a, b)

else

a = a - b * 100 end

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

Комментарии

Тем не менее комментарии писать нужно. Комментарии полезны, когда вы не знаете, как поступить. Правильным будет поместить в ком• ментарии обоснование своих действий. Это пригодиться вам когда вы будете читать свой код спустя некоторое время или покажете его своим друзьям. Например, будет очень хорошо, если поместить текст задания в качестве комментария в начале программы.

Соседние файлы в папке Ruby