Полезно ли использовать подключение к базе данных как статическое? - PullRequest
0 голосов
/ 03 июня 2018

Я использую SQLite.swift Framework для моего приложения iOS.У меня есть класс DatabaseService, где я создаю соединение с базой данных и выполняю все операции CURD.Я создавал этот класс и создавал соединение на каждом контроллере, но недавно я изменил переменную базы данных на static и создал соединение один раз для всех контроллеров.Я не уверен, что это хорошая практика.Вот как я это делаю:

static var db: Connection?

init() {
    if DatabaseService.db != nil {
        return
    }
    let path = NSSearchPathForDirectoriesInDomains(
        .documentDirectory, .userDomainMask, true
        ).first!
    do {
        let fileManager = FileManager()
        try fileManager.copyfileToUserDocumentDirectory(forResource: "db", ofType: "sqlite3")

        // Empty database will be created if file does not exist
        DatabaseService.db = try? Connection("\(path)/db.sqlite3")

        print("Connection successful")
    } catch let error {
        print("Unable to connect with the database. \(error)")
    }
}

1 Ответ

0 голосов
/ 03 июня 2018

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

Но так как вы 'Вы спрашиваете: мой ответ - нет.

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

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

Я собираюсь добавить отрывок из книги , который я НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ:

Основные проблемы могут быть вызваны глобальными состояниями, например,использование Singletons или статических членов в тестируемом устройстве.Мало того, что Singletons увеличивают связь между программными единицами.Они также часто имеют глобальное состояние, которое обходит независимость модульных тестов.Например, если определенное глобальное состояние является предварительным условием успешного теста, но предыдущий тест изменил это глобальное состояние, это может вызвать серьезные проблемы.Особенно в старых системах, которые часто завалены синглетонами, возникает вопрос: как я могу избавиться от всех этих неприятных зависимостей от этих синглетонов и сделать мой код лучше тестируемым?Что ж, это важный вопрос, который я обсуждаю ...

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

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

Возможно, реальный ответ на самом деле всегда - нет.

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