Должны ли методы поиска / получения, которые извлекают строки из базы данных, быть методами экземпляра или статическими методами? - PullRequest
2 голосов
/ 01 февраля 2011

Зачем мне делать все мои функции поиска / получения, которые извлекают строки из базы данных, методы экземпляра? Если у меня есть функция getByID(id) или findPeople(person attributes), которая либо возвращает объект (ы), либо выдает исключение, то какое оправдание накладным расходам на создание экземпляра этого класса каждый раз, когда я хочу вызвать один из этих методов

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

Ответы [ 2 ]

2 голосов
/ 01 февраля 2011

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

2 голосов
/ 01 февраля 2011

Ну, вопрос в том, как вы хотите, чтобы это работало ... Есть несколько шаблонов, построенных вокруг этой концепции.

Если вы хотите получить один :

Если у вас много похожих вещей (например, людей), то вам может потребоваться Абстрактная фабрика . В этом случае вы, скорее всего, не захотите, чтобы оно было статичным. Но опять же, вам нужен экземпляр, чтобы вы могли связать свои отдельные фабрики с абстрактной фабрикой. Таким образом, вы обойдете фабрику «Персональный строитель». Затем, когда вы ищете человека, вы позвоните builder.buildPerson(id). Этот метод будет искать индивида, определять класс для фактической реализации и вызывать соответствующую фабрику.

Если есть только один тип "персонажа", я бы использовал Фабричный метод . В этом случае, поскольку класс (и его дочерние элементы) отвечают за создание экземпляров, статические методы являются предпочтительным способом. Так что тогда вы бы позвонили person::getPerson(id).

Если вы хотите получить много :

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

Если вам нужна какая-то эффективность при создании объекта, то вы, вероятно, ищете шаблон Flyweight .

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

Но другой взгляд на это

То, что «хранение» и «загрузка» данных для объекта не связано с самим объектом, поэтому он не принадлежит как метод (статический или нет). В этом случае было бы лучше иметь модель, представляющую хранилище данных. Затем, чтобы получить список пользователей, вы должны позвонить peoplemodel.getPerson(id). peoplemodel будет извлекать данные из БД и загружать информацию, необходимую для построения объекта (ов). Затем он вызовет фабрику для класса person, чтобы создать реальный объект и вернуть его.

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

Итак, в заключение :

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

Короче говоря, это зависит от того, что вы пытаетесь сделать. Но если вам нужен самый слабосвязанный код (наиболее многократно используемый и наиболее обслуживаемый), тогда держитесь подальше от статических методов и придерживайтесь абстрактных фабрик / сборщиков и DI ...

...