отрефакторить код

162
26 февраля 2018, 01:15

Помогите улучшить код

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;
    }
}
READ ALSO
Android, дополнительное меню редактирования

Android, дополнительное меню редактирования

Хочу сделать меню для списков подобное этому:

140
Обход массива в jquery

Обход массива в jquery

Есть некий html код, который записан в php, в который записываются данные из бдДля каждого нового $id создается новый

206
Как реализовать слайдер с миниатюрами в owlСarousel 2?

Как реализовать слайдер с миниатюрами в owlСarousel 2?

Подскажите примеры, как реализовать слайдер на owlСarousel 2, а к нему миниатюры карусели owlСarousel 2

364
Не работает форма на php Ajax Bootstrap

Не работает форма на php Ajax Bootstrap

Здравствуйте, я по инструкции собрал Ajax форму которая обрабатывает данные в БД (удаляет редактирует и тд), после того как я собрал эту форму...

270