Как Вы обрабатываете данные “особого случая” при моделировании базы данных?

Можем ли мы программно войти в CloudKit для модульного тестирования? Это нецелесообразно, потому что даже если бы мы могли, тесты были бы медленными & amp; хрупкий. Вместо этого рассматривайте CloudKit как архитектурную границу. Модульные тесты могут идти прямо до этой границы. И мы можем притворяться, что вещи возвращаются с границы. Таким образом, мы можем проверить все пути.

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

protocol CKContainerProtocol {
    func accountStatus(completionHandler: @escaping (CKAccountStatus, Error?) -> Void)
}

extension CKContainer: CKContainerProtocol {}

Затем добавьте свойство в модель представления:

var cloudKitContainer: CKContainerProtocol = CKContainer.default()

Значение по умолчанию означает, что ваш код будет продолжать использовать настоящий CKContainer, если не указано иное. Измените свой код так, чтобы он звонил cloudKitContainer вместо CKContainer.default().

Затем в тестовом коде вы можете предоставить другую реализацию CKContainerProtocol. Это позволит вам делать заглушки и насмешки. Вы можете подтвердить, что accountStatus() вызывается ровно один раз. И вы можете использовать его замыкание с разными значениями CKAccountStatus, чтобы подтвердить, как вызывается ваше завершение Completion.

(Подобные вещи будут подробно рассмотрены в книге о модульном тестировании iOS, которую я сейчас пишу .)

5
задан Eddie 28 February 2009 в 23:45
поделиться

8 ответов

Полагайте, что этот столбец является ценой, отображенной клиенту, который может содержать что-либо.

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

  • ЦЕНА НА ПРИЛОЖЕНИЕ!
  • ПОЗВОНИТЕ НАМ ДЛЯ СЕГОДНЯШНЕГО СПЕЦИАЛЬНОГО ПРЕДЛОЖЕНИЯ!!

Вы получаете идею.

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

4
ответ дан 18 December 2019 в 13:20
поделиться

Спросите себя...

Я буду добавлять эти значения? Я буду сортировать по цене? Я должен буду преобразовать в другие значения валюты?

ИЛИ

Я буду просто отображать это значение на веб-странице?

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

2
ответ дан 18 December 2019 в 13:20
поделиться

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

1
ответ дан 18 December 2019 в 13:20
поделиться

Большой выбор:

  1. Все цены, сохраненные как varchars
  2. Сохраненное численно и дополнительное price_display поле цен, которое переопределяет число, если заполнено
  3. Сохраненное numberically и дополнительное price_display поле цен в целях дисплея заполнило вручную или на триггере, когда числовая цена обновляется (дублирование данных, и это могло выйти из синхронизации - гогот),
  4. Сохраните особый случай отрицательные цены, которые отображаются на специальные ситуации (просто гогот!!)
  5. цена varchar, поле ключа префикса к таблице доступных префиксов ('стоимость + '...), суффиксное поле ключа к таблице доступных суффиксов, вводит полевой ключ к списку типов для значения в цене (' $', '%', 'описание'). Полезный, если необходимо было бы записать сложные запросы против цен в будущем.

Я, вероятно, пошел бы для 2 как прагматическое решение и расширение 5, если бы мне было нужно что-то очень общее для универсальной ценовой системы.

1
ответ дан 18 December 2019 в 13:20
поделиться

Если это - степень Вашей модели данных, то varchar поле прекрасно. Ваши нормальные цены - десятичное число, как они могут быть - вероятно, бесполезно для вычислений так или иначе. Как Вы сравниваете $10/ГБ для "передачи данных" и $25/месяцев для "хостинга домена"?

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

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

1
ответ дан 18 December 2019 в 13:20
поделиться

В этом по крайней мере одна из альтернативных цен число включили, что относительно столбца Price, ценового типа? Нормальные записи могли быть числом для долларовой стоимости и ввести 'доллар', и другой мог быть 8 и 'PercentOverCost' и пустой указатель и 'ISA' (для столбца Price и PriceType).

У Вас должна, вероятно, быть таблица PriceType для проверки и PriceTypeID, если Вы идете этим путем.

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

1
ответ дан 18 December 2019 в 13:20
поделиться

Когда мне приходилось делать такие вещи в прошлом, я использовал:

Price   Unit   Display
10.00   item   null
100.00  box    null
null    null   "Call for Pricing"

Цена будет десятичным типом данных (любое точное числовое значение, не вещественное или вещественное), единица измерения и отображение будут некоторым типом строковых данных.

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

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

4
ответ дан 18 December 2019 в 13:20
поделиться
Другие вопросы по тегам:

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