Предположим, есть сайт, который предоставляет API, такой как:
- Пользователи размещают вопросы, ответы на этом сайте
- Вы можете сделать
GET
и POST
звонки - Существует два типа аутентификации: слабая (только дает права на чтение) и сильная (дает права как на чтение, так и на запись)
- ПравоТеперь я хотел бы прочитать вопросы и ответы пользователей (нужен только слабый доступ) и отправлять им сообщения или публиковать свои собственные вопросы в будущем (потребуется сильный доступ)
- API сайта имеет действия как как с пользователями (например, отправить сообщение), так и с сайтом в целом (см. о самых популярных вопросах)
То, что я сейчас имею, выглядит так:
public class Wrapper {
private AccessToken accessToken;
public Wrapper(...) {
//does some stuff
//gets access token:
getAccessToken(...);
}
public AccessToken getAccessToken(...) {
AccessToken result;
//gets access token, given the auth info provided as arguments
accessToken = result;
return result;
}
public ArrayList<Question> getQuestions(User user) {
//gets user's questions, using the accessToken field
//set's a user's questions field to the result and returns the result
}
public ArrayList<Answer> getAnswers(User user) {
//same as previous
}
public boolean sendMessage(User user) {
//sends a message, if current accessToken is strong
}
}
и Пользователь класс:
class User {
private String username;
private ArrayList<Question> questions;
private ArrayList<Answer> answers;
public User(String username) {this.username=username;}
//getters and setters
}
Итак, чтобы использовать его, вы должны использовать что-то вроде этого:
public class Main {
public static void main(String[] args) {
Wrapper wrapper = new Wrapper(...);
ArrayList<Question> questions = wrapper.getQuestions(new User("username"));
wrapper.sendMessage(new User("username2"));
}
}
У меня проблемы сэтот.
Прежде всего, класс User
кажется излишним, поскольку все функциональные возможности находятся внутри класса Wrapper
.
Во-вторых, мне интересно, правильны ли мои методы - с точки зрения дизайна: в getAccessToken
I оба return AccessToken
и установить Wrapper
поле accessToken
до результата.Это правильный подход?Или метод only должен возвращать токен доступа, и тогда этот результат должен быть явно назначен полю класса?То же самое относится к методам getQuestions
и getAnswers
: они оба получают ArrayList
s, возвращают их и присваивают поле User
результату - всевнутри одного метода.
Я бы хотел, чтобы класс User
имел какое-то значение.Я думал о том, чтобы сделать что-то вроде этого:
Wrapper wrapper = new Wrapper(...);
User user = new User("username");
user.getQuestions(wrapper.getAccessToken());
user.sendMessage(wrapper.getAccessToken());
Итак, класс Wrapper
будет служить только местом для получения токена доступа, что тоже не совсем правильно.Я мог бы поместить функциональность токена доступа в класс User
и использовать его следующим образом:
User user = new User("username", ...);
user.getQuestions();
user.sendMessage();
Конструктор User
будет принимать как имя пользователя, так и данные аутентификации, получать токен доступа и сохранять еговнутри пользователя, а затем использовать его при получении вопросов / ответов или отправки сообщений.Я мог бы сделать поле accessToken
внутри User
class static
, чтобы все пользователи использовали один и тот же токен.
Однако существуют действия, которые предоставляет API сайта, которые явно не связаны с пользователями: например, получение наиболее популярных вопросов сайта.Для этой цели кажется правильным использовать общий класс Wrapper
, что противоречит предыдущему подходу.
Я новичок в этом и знаю только пару шаблонов проектирования.Возможно, есть широко распространенные модели, которые должны использоваться для этого типа проблемы?Любая помощь / совет приветствуется.