тот же метод, несколько типов возврата.организация кода - PullRequest
2 голосов
/ 24 сентября 2011

Допустим, у меня есть класс User, и я хочу вернуть всех пользователей в моей базе данных.Для этого я создал метод getAll ();

Мне нужно вызвать метод в разных частях моего приложения и вернуть данные в разных форматах.Мне может понадобиться, чтобы все пользователи, разделенные запятыми, помещали в какое-то условие «где в», или в формате json, например, для создания API, или в виде массива.

Что является лучшим решением для организации моего кода?

Возможные решения: 1.Передать переменную fetchMode в функцию getAll, чтобы я мог соответствующим образом отформатировать возвращаемое значение.2. Создайте прокси-метод «findAllAsArray», «findAllAsJson» и т. Д., Который вызывает исходный метод getAll и форматирует ответ.3. Всегда возвращайте результат в стандартном формате (например, массив), а затем создайте несколько общих методов для преобразования между форматами: например: arrayToJson, arrayToCsv и т. Д. И используйте их, когда мне нужны результаты в другом формате, чем стандартный.

Метод 1 может сделать метод getAll слишком сложным, если у меня много форматов.Метод 2 может добавить слишком много дополнительных методов, делающих мой класс более сложным.Метод 3, не уверен, но данные должны быть возвращены в необходимом формате из модели, я думаю.Преобразование его в контроллер, вероятно, не лучшее решение.

1 Ответ

0 голосов
/ 20 ноября 2011

Создайте новый класс, например «Пользователи», который содержит необработанные данные.Пользователи неизменяемы: после инициализации его состояние никогда не меняется.Теперь getAll () возвращает экземпляр Users, инициализированный с необработанными данными, созданными getAll ().Результат имеет для каждого формата открытый метод, который соответствующим образом форматирует необработанные данные и возвращает их.

В псевдокоде:

class User:
  method getAll:
    users = # fetch the users
    return Users.new(users)

class Users
  method initialize(users)
    # Save users to a member variable
  method json:
    # Return users formatted as json
  method csv:
    # Return users formatted as csv

Для извлечения всех пользователей в формате json:

users.getAll.json

Чтобы получить всех пользователей в формате CSV:

users.getAll.csv
...