Является ли хорошей практикой использование AppDelegate для манипулирования и обработки данных?

Я делаю объект AppDelegate и использую его во всей своей программе, и я объявил все сеттеры и геттеры, а также вставляю, выбираю, удаляю, обновляю в нем запросы базы данных.

Я хочу спросить, является ли это хорошей практикой, если да, то как, и если нет, то почему это не является хорошей практикой?

Я надеюсь, что мой вопрос понятен, пожалуйста, задавайте сопутствующие вопросы, если они у вас есть.


person Chatar Veer Suthar    schedule 01.03.2011    source источник


Ответы (3)


Превращать AppDelegate в «большой ком грязи», содержащий миллион методов и свойств, — не лучшая стратегия (хотя это может показаться заманчивым).

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

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

И еще одной альтернативой может быть эффективное превращение самого вашего DatabaseManager в «одиночку», в результате чего доступ к его экземпляру осуществляется через метод класса в классе. Синглтоны, которые работают таким образом, часто не одобряются, и обычно по уважительным причинам (усложняет тестирование и тому подобное). Я склонен избегать того, чтобы объекты имели свою «одиночную» природу, запеченную прямо в объекте — я предпочитаю, если мне нужны такие вещи, иметь известную точку доступа (своего рода «фабрику», если хотите), где вы можно перейти к получению общего экземпляра.

person occulus    schedule 01.03.2011

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

Объявите там все свои сеттеры и геттеры и используйте дескриптор одноэлементного объекта по всему проекту. См. эту ссылку, как создать одиночный класс

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

person ipraba    schedule 01.03.2011
comment
Упомянутый вами одноэлементный шаблон, когда объект имеет одноэлементную природу, «запеченную внутри», является довольно ограничительным. Что, если позже вы захотите иметь два объекта менеджера баз данных (поскольку вы подключаетесь к двум базам данных)? Что делать, если вы пишете тесты, которые требуют существования более одного экземпляра для целей тестирования? Более гибко предоставить какую-то фабрику, которая выдает сконфигурированный общий экземпляр singleton. Просто мои мнения. - person occulus; 01.03.2011
comment
И еще одна проблема: хорошие проекты часто включают передачу информации о конфигурации в менеджер баз данных (или что-то еще), а не настройку самой себя (опять же по причинам тестирования и т. д.). Но это становится сложным, если весь ваш код запрашивает у самого объекта-одиночки его общий экземпляр, поскольку все ваши вызовы getInstance должны передавать информацию о конфигурации, если это необходимо. - person occulus; 01.03.2011

Все дело в сложности и ваших чувствах. Вам должно понравиться ваше решение ;-)

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

person zrzka    schedule 01.03.2011
comment
И другим людям должно понравиться его решение позже, если они работают над одним и тем же кодом :) - person occulus; 01.03.2011