Re[4]: Codepedia. Взгляд вглубь. (читать придется много :) )
От: anonymous Россия http://denis.ibaev.name/
Дата: 30.09.05 08:43
Оценка:
Здравствуйте, FreshMeat, Вы писали:

FM>Таким образом отказываемся от ООП.


да, выходит так... либо придется писать в аннотации что-то вроде:

template < class T >
bool is_intersect_lines2( T l0, T l1 );

Класс прямой T толжен иметь атрибуты с названиями p0x, p0y, p1x, p1y, в которых хранятся координаты точек, через которые проходит данная прямая.


FM>Компактно-крохотных сниппетов может оказаться совсем немного.


в этом я не уверен, все же алгоритмов существует достаточно много, плюс различные реализации этих алгоритмов...

FM>Плюс, если копнуть чуть глубже, появляются новые неприятности:

FM>если мы говорим о C++
FM>
FM>template < typename T >
FM>bool is_intersect_lines2( T p00x, T p00y, T p01x, T p01y, 
FM>                          T p10x, T p10y, T p11x, T p11y );
FM>


FM>1. при каждом вызове ф-ии, необходимо проверять вырожденные случаи —

FM>
FM>( p00x == p01x && p00y == p01y ) || 
FM>( p10x == p11x && p10y == p11y )
FM>

FM>если мы будем использовать классы, можно делать такую проверку один раз в конструкторе.
FM>Конечно, эту проблему можно переложить на пользователя, потребовать обязательно проверять передаваемые параметры, но тогда код становится более опасным (для меня это было бы уже достаточной причиной отказаться от использования такого сниппета)

согласен... хотя переложить эту проблему на пользователя не такая уж и плохая идея, просто нужно честно предупредить его в аннотации о всех ограничениях...

к примеру, хочет пользователь метод CLine.IsIntersectWith(CLine&), берёт он функцию is_intersect_lines2() и вставляет её вызов в тело метода... проверка подобная указанной уже не нужна, поскольку реализована в конструкторе CLine...

есть ещё идея автоматически генерировать такие методы, по некоему описанию класса, заданному пользователем, на основе вот таких сниппетов функций... но как, пока не ясно...

FM>p00x == p01x Эту операцию должен предоставлять пользователь — получаем еще один параметр у is_intersect_lines2, указатель на функцию сравнения.


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

FM>2. Немножно субъективизма.

FM>Посмотрим на другую ф-ю — определение точки пересечения прямых в 3d. Просто прикинем ее сигнатуру. Координаты входящих точек — шесть параметров, ф-я сравнения — один, результат — еще три. Итого — 10
FM>
FM>template < typename T >
FM>bool intersect_lines3( T p00x, T p00y, T p00z, T p01x, T p01y, T p01z,
FM>                       T p10x, T p10y, T p10z, T p11x, T p11y, T p11z,
FM>                       is_equal_t equal,
FM>                       T* resx, T* resy, T* resz );
FM>

FM>К чему это говорю — такую страшилку использовать в своем проекте захочется только от большоой тоски, чесслово

честно говоря, не вижу смысла в такой функции, её можно разделить на три вызова intersect_lines2()...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.