end
end
Если нам хочется, чтобы объекты нашего класса можно было бы сравнивать между собой (и, как следствие, сортирововать массив таких объектов методом sort), то необходимо переопределить метод <=>. Метод <=> должен возвращать 0 если объекты равны между собой; отрицательное число, если первый аргумент меньше второго; и положительное число в остальных случаях.
class Frac def <=>(b)
if !b.kind_of?(Frac)
raise "Undefined method <=> for class Frac and #{b.class}!" end
return self.numerator * b.denominator -
b. numerator * self.denominator <=> 0
end
end
В случае необходимости иметь какую-то одинаковую для всех объектов класса характеристику используют переменные класса, которые синтаксически выделяются указанием префикса @@ в их имени.
Предположим, что нам потребовалось знать общее количество дробей, созданных при работе с классом Frac. Добавив в конструктор класса команду инкремента такой переменной, мы сможем узнать количество созданных дробей.
С понятием применения метода связано понятие ответственности за его выполнение. Иногда за то или иное действие отвечает не объект, а сам класс. В этом случае применяется метод класса. При его задании перед именем метода указывается имя класса.
Пример 2. Рассмотрим класс R@Point, описывающий точки на плоскости. Пусть нам требуется найти расстояние между двумя точками. В первом случае мы перекладываем ответственность за выполнение метода на одну из точек. Требование выглядит так: «точка, вычисли расстояние до другой точки». В этом случае непонятно, почему одна из точек берет на себя ответственность за выполнение этой обязанности, ведь они обе участвуют в данной операции на равных правах. Второй подход состоит в команде, отдаваемой самому классу: «класс, определи расстояние между двумя объектами».
3. Тестирование и обработка исклительных ситуаций
3.1 Unit–тесты. Проанализировав, на что уходит время у большинства программистов, – можно обнаружить, что на написание кода в действительности тратится совсем небольшая часть. Какая-то часть уходит на понимание задачи, еще кусок на проектирование, а большую часть времени занимает отладка. Отладка – это процесс проверки программы на соответствие поставленной задаче, хотя чаще под этим определением понимают работу по нахождению ошибок в программе. Отладка – это «страшная вещь», и любой программист может рассказать о том, как на поиски какой-то ошибки ушел день или даже больше. Исправить ошибку можно довольно быстро, но самое сложное – найти её. А при исправлении ошибки всегда существует возможность добавить новую, которая проявится гораздо позднее.
Из опыта предыдущих курсов было замечено, что студент написав программу, как правило, поверхностно проверяет её на работоспособность, а некоторые даже не запускают программу, почему-то считая, что раз уж они её написали, то она просто обязана работать правильно. Доходит до того, что студенты пытаются сдать программы, не обрабатываемые интерпретатором или компилятором.
Поэтому одной из основных целей этого курса можно считать задачу обучения студента проверке (тестированию) программ. У новичков процесс тестирования выглядел обычно следующим образом. Написав программу, студент запускал ее один раз (или несколько, в зависимости от количества частных случаев, рассмотренных в программе) и, получив похожий на правду ответ, считал, что задача решена. Если же программа выдавала неверный ответ, то он пытался найти ошибку и затем заново запускал программу.
Очевидно такая схема написания неудобна. Например, пусть отлаживаемая программа ищет пересечение двух прямоугольников. В процессе проверки нам придется неоднократно (для проверки различных частных случаев) вводить координаты различных прямоугольников (по восемь чисел на тест). Понятно, что необходимо как-то автоматизировать этот процесс. Один из способов – поместить тестовые данные в файл и считывать их оттуда при старте программы. Такой способ позволяет нам экономить на вводе тестовых данных, но этапа сравнения полученных решений с требуемыми при этом способе не избежать. Для решения этой задачи программисты на Ruby обычно используют специальную библиотеку TestUnit (подобного рода библиотеки есть в большинстве современных языков программирования, в языке Java, например, для этих целей используется пакет JUnit).
Приведем простой пример, в котором протестируем довольно простую программу о разложении чётного числа на сумму простых.