Я должен использовать Базу данных В оперативной памяти вместо того, чтобы дразнить мои Репозитории?

Мне нравится идея использовать Базу данных В оперативной памяти, такую как SQLite при тестировании вместо того, чтобы создать Насмешки для моих Репозиториев. Таким образом, я могу также протестировать код своих Репозиториев без любых проблем производительности.

Каковы за и против этой стратегии?

6
задан jimmystormig 30 January 2010 в 14:06
поделиться

3 ответа

Переход от «0,1,2» к ['0', '1', '2'] его только «0,1,2». split (, «»)

Таким образом, если у вас есть переменная users , то users.split (, «») даст вам список.

Если они нужны в виде ints вместо последовательностей, это будет [int (x) для x в users.split (',')] .

-121--3433071-

Чтобы преобразовать последовательность в список, используйте разделить .

Чтобы преобразовать список последовательностей в список целых чисел, используйте понимание списка с помощью int .

Таким образом, сложив все вместе, это выглядит примерно так:

s = '0,1,2'
l = [int(x) for x in s.split(',')]

Результаты:

[1, 2, 3]
-121--3433070-

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

3
ответ дан 10 December 2019 в 02:47
поделиться

Так что вы хотите переключиться с чего-то вроде:

0  1  2  3
4  5  6  7
8  9  10 11

на

0  3  6  9
1  4  7  10
2  5  8  11

?

Попробуйте

for (int i = 0; i < width; ++i)
  for (int j = 0; j < height; ++j)
    array_b[ i * height + j ] = array_a[ j * width + i ];
-121--3554044-

Помимо ответа Митча есть еще один аспект: Webapps, как правило, плохо подходят для реляционных баз данных. Реляционные базы данных делают упор на нормализацию - по сути, облегчая записи, но читает тяжелее (с точки зрения проделанной работы, не обязательно для вас). Это очень хорошо работает для ситуаций типа OLAP, ad-hoc query, но не так хорошо для webapps, которые обычно массово взвешиваются в пользу чтения над записью.

Стратегия, используемая нереляционными базами данных, такими как Bigtable, является обратной: денормализовать, чтобы сделать чтение намного проще, за счет сделать запись более дорогой.

-121--1930398-

Моя стратегия состоит в том, чтобы при тестировании своего бизнес-кода я макетировал свой репозиторий. При тестировании репозитория выполняется макет уровня доступа к данным. Я использую, насколько это возможно, автоматически сгенерированный код для моего уровня доступа к данным (LINQ-to-SQL), поэтому там мало что можно проверить. То, что есть (валидация, специализированная обработка свойств), обычно может быть протестировано напрямую, без насмешек. Если это абсолютно необходимо (или проще), я иногда подделываю слой данных с помощью пользовательского хранилища в памяти, построенного на списках - см. мой блог по адресу http://farm-fresh-code.blogspot.com , где я написал об этом.

2
ответ дан 10 December 2019 в 02:47
поделиться

Скорость. Если поле устанавливается или считывается миллиарды раз в ходе моделирования, то необходимо использовать поле, а не свойство, чтобы избежать служебного вызова подпрограммы. По мере возможности, в соответствии с OO (DDD?), в этих случаях я бы рекомендовал прибегать к полям только в классе, посвященном представлению какой-то «ценности», как человек. Логика должна быть сведена к минимуму. Скорее, иметь персонального или персонсерватора.

Но если у вас есть эти проблемы, то вы, вероятно, не программируете c++ и не c #, не так ли?

-121--1255489-

Используйте команду svn switch с параметром командной строки --relocate .

-121--810528-

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

4
ответ дан 10 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: