лучшие практики Java в матрице / векторной библиотеке - PullRequest
7 голосов
/ 11 октября 2011

Мне нужно написать простую библиотеку векторов / матриц для небольшого проекта, связанного с геометрией, над которым я работаю.вот что мне интересно.

при выполнении математических операций над векторами в среде Java лучше использовать новый экземпляр вектора или изменять состояние оригинала.

Я видел это взад и вперед и просто хотел бы получить мнение большинства.

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

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

Я заметил, что математическая библиотека apache commons commonsвозвращает новый вектор каждый раз из оригинала.

Ответы [ 2 ]

5 голосов
/ 11 октября 2011

Насколько важна производительность? Собирается ли векторная арифметика большим компонентом, чтобы она влияла на производительность всей системы?

Если это не так и будет много параллелизма, то неизменные векторы будут полезны, потому что они уменьшают проблемы параллелизма.

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

1 голос
/ 11 октября 2011

Это зависит.Вообще говоря, неизменность лучше.

Прежде всего, это автоматически потокобезопасность.Это легче поддерживать и тестировать.

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

(Примечание. Если вы не уверены на 100%, вам нужна такая скорость, она вам не нужна. Подумайте о высокочастотной торговле и приложениях с интенсивной математикой в ​​реальном времени. И даже если вывначале все должно быть просто, а потом оптимизироваться.)

Что касается статических и обычных методов, следуя хорошим принципам ООП, у вас не должно быть статических методов.Для создания новых векторов / матриц вы можете использовать конструктор.

Далее, какова ваша структура поддержки?Ваша лучшая ставка, вероятно, это одномерные массивы двойников для векторов и многомерные массивы двойников для матриц.Это, по крайней мере, позволяет вам оставаться относительно быстрыми, используя примитивные объекты.

Если вы дошли до того, что вам нужна еще более высокая производительность, вы можете добавить модификаторы в свой вектор / матрицу, которые могут изменять данные поддержки.Вы даже можете решить, что размеры неизменяемы, но содержимое изменчиво, что также обеспечит вам некоторые другие гарантии.

...