Помогите улучшить код
public class User {
private String firstName;
private String lastName;
private String email;
private String phone;
private String nationality;
private String state;
private String city;
private String street;
public String getFirstName(){
return firstName;
}
public String getLastName(){
return lastName;
}
public String getEmail(){
return email;
}
public String getPhone(){
return phone;
}
public String getNationality(){
return nationality;
}
public String getState(){
return state;
}
public String getCity(){
return city;
}
public String getStreet(){
return street;
}
public User (String firstName,
String lastName,
String email,
String phone,
String nationality,
String state,
String city,
String street){
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.phone = phone;
this.nationality = nationality;
this.state = state;
this.city = city;
this.street = street;
}
}
Класс Logger - инкапсулирует сообщения об ошибках
public class Logger {
public void logJsonChanged(){
System.out.println("Не получилось обработать узел json дерева. Структура
json у randomuser.me изменилась или другая причина");
}
}
Класс HttpClient - занимается получением ответа по HTTP запросу
public class HttpClient {
private final String url = "https://randomuser.me/api/";
public StringBuffer getResponseByRequest() {
try {
URL obj = new URL(url);
HttpURLConnection connection = (HttpURLConnection) obj.openConnection();
connection.setRequestMethod("GET");
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
Что меня смущает: - его название - возможно он слишком короткий и метод getResponseByRequest надо включить в другой класс. Хотя согласно одному из принципов SOLID - всё правильно
Класс Parser - разбирает HTTP ответ
public class Parser {
private Logger logger = new Logger();
public User getUserFromJSON() {
JsonElement jsonTree = new JsonParser().parse(new HTTPWorker().getResponseByRequest().toString());
if(jsonTree.isJsonObject()){
JsonElement results = jsonTree.getAsJsonObject().get("results");
if(results.isJsonArray()){
JsonElement name = getArrayObject(results,"name");
JsonElement firstName = getValue(name, "first");
JsonElement lastName = getValue(name, "last");
JsonElement email = getArrayObject(results,"email");
JsonElement phone = getArrayObject(results,"phone");
JsonElement nationality = getArrayObject(results,"nat");
JsonElement location = getArrayObject(results,"location");
JsonElement state = getValue(location, "state");
JsonElement city = getValue(location, "city");
JsonElement street = getValue(location, "street");
//System.out.println("||| " + firstName + lastName + email + phone + nationality + state + city + street);
return new User(firstName.toString(), lastName.toString(), email.toString(), phone.toString(),
nationality.toString(), state.toString(), city.toString(), street.toString());
}
}
logger.logJsonChanged();
return null;
}
private JsonElement getArrayObject(JsonElement array, String objectName){
return array.getAsJsonArray().get(0).getAsJsonObject().get(objectName);
}
private JsonElement getValue(JsonElement object, String objectName){
if(object.isJsonObject()) {
return object.getAsJsonObject().get(objectName);
}
logger.logJsonChanged();
return null;
}
}
Что меня смущает: - его название. Возможно назвать более конкретно. Например, RandomUserParser - return null; - хорошо ли так - IDEA предложила. Если нет - как избавится - присутствует явные объект new Logger() - вводится зависимость. Как её избежать?
Класс Users - создаёт и отдаёт коллекцию пользователей
public class Users {
private final int count = 110;
private List<User> users = new ArrayList<User>();
public void populate(){
for (int i = 0; i < count; i++){
users.add(new Parser().getUserFromJSON());
}
}
public List<User> get(){
return users;
}
}
Что меня смущает - нужен ли он вообще. Users перекликается с существующим User - не очень хорошо. Если не нужен, куда поместить его бизнес логику? В main? Но тогда загромоздится main.
Класс Main
public class Main {
public static void main(String[] args) {
Users users = new Users();
users.populate();
for (User user : users.get()) {
System.out.print("Имя: " + user.getFirstName().replace("\"", "") + " " +
"Фамилия: " + user.getLastName().replace("\"", "") + "\n");
}
System.out.print("--------------------------------------------------------------------------------------------------------------\n");
int userNum = 10;
System.out.print("Имя: " + users.get().get(10).getFirstName().replace("\"", "") + "\n" +
"Фамилия: " + users.get().get(userNum).getLastName().replace("\"", "") + "\n" +
"E-mail: " + users.get().get(userNum).getEmail().replace("\"", "") + "\n" +
"Телефон: " + users.get().get(userNum).getPhone().replace("\"", "") + "\n" +
"Национальность: " + users.get().get(userNum).getNationality().replace("\"", "") + "\n" +
"Место жительства: " +
"штат " + users.get().get(userNum).getState().replace("\"", "") + ", " +
"город " + users.get().get(userNum).getCity().replace("\"", "") + ", " +
"улица " + use
rs.get().get(userNum).getStreet().replace("\"", ""));
}
}
UPD
Улучшил HttpClient - избавил его от зависимости - урла, теперь я его в конструктор перадаю
public class HttpClient {
private String url = null;
public HttpClient(String url){
this.url = url;
}
public StringBuffer getResponse() {
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("GET");
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
улучшил Logger
public class Logger {
private Logger(){}
public static void logJsonChanged(){
System.out.println("Не получилось обработать узел json дерева. Структура json у randomuser.me изменилась или другая причина");
}
}
улучшил Users - убрал захардкоженный count, избавился от зависимости
public class Users {
private int count;
public Users(int count){
this.count = count;
}
private List<User> users = new ArrayList<User>();
public void populate(){
for (int i = 0; i < count; i++){
users.add(new Parser().getUserFromJSON());
}
}
public List<User> get(){
return users;
}
}
Изменённый Parser
public class Parser {
public User getUserFromJSON() {
StringBuffer httpResponse = new HttpClient("https://randomuser.me/api/").getResponse();
JsonElement jsonTree = new JsonParser().parse(httpResponse.toString());
if(jsonTree.isJsonObject()){
JsonElement results = jsonTree.getAsJsonObject().get("results");
if(results.isJsonArray()){
JsonElement name = getArrayObject(results,"name");
JsonElement firstName = getValue(name, "first");
JsonElement lastName = getValue(name, "last");
JsonElement email = getArrayObject(results,"email");
JsonElement phone = getArrayObject(results,"phone");
JsonElement nationality = getArrayObject(results,"nat");
JsonElement location = getArrayObject(results,"location");
JsonElement state = getValue(location, "state");
JsonElement city = getValue(location, "city");
JsonElement street = getValue(location, "street");
//System.out.println("||| " + firstName + lastName + email + phone + nationality + state + city + street);
return new User(firstName.toString(), lastName.toString(), email.toString(), phone.toString(),
nationality.toString(), state.toString(), city.toString(), street.toString());
}
}
Logger.logJsonChanged();
return null;
}
private JsonElement getArrayObject(JsonElement array, String objectName){
return array.getAsJsonArray().get(0).getAsJsonObject().get(objectName);
}
private JsonElement getValue(JsonElement object, String objectName){
if(object.isJsonObject()) {
return object.getAsJsonObject().get(objectName);
}
Logger.logJsonChanged();
return null;
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть некий html код, который записан в php, в который записываются данные из бдДля каждого нового $id создается новый
Подскажите примеры, как реализовать слайдер на owlСarousel 2, а к нему миниатюры карусели owlСarousel 2
Здравствуйте, я по инструкции собрал Ajax форму которая обрабатывает данные в БД (удаляет редактирует и тд), после того как я собрал эту форму...