Ruby / ruby_notes
.pdf§ 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
Однако не стоит применять выделение функции всегда. Иногда встречаются функции тела которых столь же понятны, как названия. В этом случае не стоит разбивать функцию на составляющие.
Комментарии
Тем не менее комментарии писать нужно. Комментарии полезны, когда вы не знаете, как поступить. Правильным будет поместить в ком• ментарии обоснование своих действий. Это пригодиться вам когда вы будете читать свой код спустя некоторое время или покажете его своим друзьям. Например, будет очень хорошо, если поместить текст задания в качестве комментария в начале программы.