Возвращая новый объект или инициализирующий член в конструкторе? - PullRequest
3 голосов
/ 18 июня 2010

У нас есть класс поставщика данных, который возвращает репозитории для каждого агрегата в нашей базе данных.

Давайте рассмотрим следующий сценарий:

public class DataProvider {
    public IBookRepository Books { get { retun new BookRepository(); } }
    public IAuthorRepository Authors { get { retun new AuthorRepository(); } }
}

Как видите, мы возвращаем новый экземплярданный объект каждый раз, когда мы вызываем члена: DataProvider.Books.DoBANANAS();

против

public class DataProvider {
    public IBookRepository Books { get; }
    public IAuthorRepository Authors { get; }

    public DataProvider()
    {
        Books = new BookRepository();
        Authors = new AuthorRepository();
    }
}

Будет ли вызываться `DataProvider.Books.BANANAS ();быть сейчас менее загруженным процессором / памятью?

Поскольку я только что начал реализовывать обе версии, и они удивительно работали!

Но мой опыт подсказывает, что Версия 1 Отстой .Тем не менее, у меня более чем достаточно времени, чтобы полностью оптимизировать и внедрить конечный продукт.(Это одно из преимуществ работы в исследовательской группе)

Ответы [ 2 ]

3 голосов
/ 18 июня 2010

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

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

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

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

2 голосов
/ 18 июня 2010

Ваш первый пример создает новый экземпляр объекта XXXRepository каждый раз, когда второй возвращает дескриптор к уже существующему, поэтому второй должен работать лучше и использовать меньше ЦП, так как не требуется выделять новую память.

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

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