Использование предопределенных экземпляров - PullRequest
0 голосов
/ 31 августа 2010

Несколько проблем с экземплярами в том, что метод Equals не обеспечивает true, даже если они содержат одинаковые значения. Таким образом, попытка переопределить метод Equals обеспечивает намного более медленное, чем ссылочное равенство.

Пока я думал о производительности, я думал, что глупо создавать 2 экземпляра, которые являются одним и тем же, но не тем же адресом памяти. Если я смогу избежать создания одинаковых экземпляров с разными ссылками, это повысит производительность и поможет сравнить ссылки легче, чем писать собственные методы Equal.

Например:

У меня есть класс координат, в котором хранятся координаты шахматной доски. Так что мне нужен только массив Coordinate[8,8] для представления всех кординатов доски. Вместо создания экземпляров я могу создать все экземпляры, после чего мой фабричный метод может их вернуть.

Cooardinate.Get(2,3) вместо new Coordinate(2,3) Первый - это статический метод статического класса, который возвращает предопределенную координату в заданных значениях.

Еще одним преимуществом является то, что мы не будем тратить время на создание и сбор мусорных объектов в памяти. Все они уже определены заранее. Также мы можем предоставить уникальный GetHashCode для экземпляров простым и быстрым способом, например 0 для [0,0], 1 для [0,1] ....

Разве не стоит попробовать? эта идея сделает кодирование сложнее написать или понять? Есть ли такой шаблон?

Ну, вкратце, в чем недостатки этого пути?

Ответы [ 4 ]

2 голосов
/ 31 августа 2010

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

1 голос
/ 31 августа 2010

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

ПоэтомуКак и во всех оптимизациях, вы должны рассматривать его только в том случае, если у вас есть реальная потребность в оптимизации (например, он работает слишком медленно или использует слишком много памяти), и если вознаграждение (более высокая производительность, меньшее использование памяти) перевешивает риски(тратить время на оптимизацию, когда вы могли бы делать что-то более полезное, вводить ошибку, не иметь возможности найти ошибку, не иметь возможности быстро и легко модифицировать код в будущем или без введения ошибки).

1 голос
/ 31 августа 2010

В этом случае, когда вы имеете дело с шахматной доской (всего 64 координаты), вам не нужно слишком беспокоиться о производительности или сборке мусора. Сказав это, я думаю, что держать базовые 64 координаты в словаре просто прекрасно (и имеет смысл). С точки зрения сравнения Equals (), вы в основном сравниваете 2 целочисленных значения, что будет молниеносно, поэтому переопределите метод Equals (), чтобы указать, что сравнение является правильным подходом.

0 голосов
/ 31 августа 2010

Если вы действительно столкнулись с проблемами производительности из-за необходимости глубоких сравнений, чтобы определить равенство, тогда вам может потребоваться взглянуть на шаблон Flyweight , но поскольку вы говорите только о 64 парахЯ думаю, что в этом случае было бы полным излишним.На самом деле вам нужно переопределить оператор Equals для сравнения двух координат - этого будет достаточно быстро.Что-то более сложное, чем это, вероятно, является ложной оптимизацией, по крайней мере, на большинстве обычных платформ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...