С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 116

Рефакторинг кода

24.02.2018, 20:18. Показов 2202. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, помогите улучшить код?

Задача - с помощью сервиса randomuser.me получить список более 100 пользователей и показать данные о них. Пока это консольное приложение.

Класс User

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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 - инкапсулирует сообщения об ошибках
Java
1
2
3
4
5
public class Logger {
    public void logJsonChanged(){
        System.out.println("Не получилось обработать узел json дерева. Структура json у randomuser.me изменилась или другая причина");
    }
}

Класс HTTPWorker - занимается получением ответа по HTTP запросу
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class HTTPWorker {
 
    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 ответ
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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 - создаёт и отдаёт коллекцию пользователей
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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("\"", "") + ", " +
                         "улица " + users.get().get(userNum).getStreet().replace("\"", ""));
    }
}
Что меня смущает
- наличие for. Но вроде как никуда от него не деться. Main - это класс-потребитель или клиент. Он должен вызывать только методы get других классов (как я думаю)



Просьба помочь улучшить архитектуру, стиль и вообще дать любые замечания по рефакторингу. Если мои рассуждения некорректны - поправьте
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.02.2018, 20:18
Ответы с готовыми решениями:

Рефакторинг кода
Добрый день. Такой вопрос: Есть базовый(abstract) класс Base, от него унаследовано несколько классов Child1, Child2, Child3.. Есть...

Рефакторинг кода для генерации, валидации и записи в файл номеров платежных карт
В учебных и практических целях реализовал код, генерирующий номера платежных карт, состоящих из 16 цифр, а также их проверку по алгоритму...

Рефакторинг while в отдельный класс
Здравствуйте, делаю задание по рефакторингу, один из способов это создание отдельного класса. Помогите, пожалуйста выделить цикл while в...

14
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
25.02.2018, 00:44
Цитата Сообщение от olegall Посмотреть сообщение
Класс User
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
final class User {
 
    private final Person person;
    private final Contacts contacts;
 
    User(Person person, Contacts contacts) {
        this.person = person;
        this.contacts = contacts;
    }
 
    public Person getPerson() {
        return person;
    }
 
    public Contacts getContacts() {
        return contacts;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
final class Person {
 
    private final String firstName;
    private final String lastName;
    private final String nationality;
 
    Person(String firstName, String lastName, String nationality) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.nationality = nationality;
    }
 
    public String getFirstName() {
        return firstName;
    }
 
    public String getLastName() {
        return lastName;
    }
 
    public String getNationality() {
        return nationality;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
final class Contacts {
 
    private final String email;
    private final String phone;
    private final Address address;
 
    Contacts(String email, String phone, Address address) {
        this.email = email;
        this.phone = phone;
        this.address = address;
    }
 
    public String getEmail() {
        return email;
    }
 
    public String getPhone() {
        return phone;
    }
 
    public Address getAddress() {
        return address;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
final class Address {
 
    private final String state;
    private final String city;
    private final String street;
 
    Address(String state, String city, String street) {
        this.state = state;
        this.city = city;
        this.street = street;
    }
 
    public String getState() {
        return state;
    }
 
    public String getCity() {
        return city;
    }
 
    public String getStreet() {
        return street;
    }
}


Цитата Сообщение от olegall Посмотреть сообщение
Класс Logger
Есть миллионы готовых логгеров, хоть тот же slf4j

Цитата Сообщение от olegall Посмотреть сообщение
Класс HTTPWorker - занимается получением ответа по HTTP запросу
Есть же всякие Apache HTTP Utils (не помню точно название).

Цитата Сообщение от olegall Посмотреть сообщение
Что меня смущает:
- его название
Конечно, ведь правильное название HttpClient.

Цитата Сообщение от olegall Посмотреть сообщение
- возможно он слишком короткий и метод getResponseByRequest надо включить в другой класс.
В какой другой?

Что точно надо сделать, так это 1) сменить StringBuffer на StringBuilder, 2) Возвращать не StringBuffer/StringBuilder, а String. А как по мне, так лучше возвращать byte[], или, в идеале, принимать Consumer<InputStream>, пусть он разбирается с потоком.

Цитата Сообщение от olegall Посмотреть сообщение
Что меня смущает:
- его название. Возможно назвать более конкретно. Например, RandomUserParser
- return null; - хорошо ли так - IDEA предложила. Если нет - как избавится
- присутствует явные объект new Logger() - вводится зависимость. Как её избежать?
А наличие Gson и Jackson тебя не смущает?

Цитата Сообщение от olegall Посмотреть сообщение
Users перекликается с существующим User - не очень хорошо.
Каким образом он перекликается?

Цитата Сообщение от olegall Посмотреть сообщение
куда поместить его бизнес логику?
Есть же всякие паттерны, а ля DAO и Repository. Выбирай на свой вкус.

Цитата Сообщение от olegall Посмотреть сообщение
Main - это класс-потребитель или клиент. Он должен вызывать только методы get других классов (как я думаю)
Что это вообще значит?

Цитата Сообщение от olegall Посмотреть сообщение
Просьба помочь улучшить архитектуру, стиль и вообще дать любые замечания по рефакторингу
Любое замечание: почитай Effective Java, посмотри выступления Роберта Матрина, перестань велосипедить.
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 116
25.02.2018, 01:15  [ТС]
1. Идея своего логгера в том, что он должен содержать сообщения о разных ошибках. Если одну ошибку залогировать в разные места, получится дублированный код, используя готовый Logger.

Готовый логгер:
Т.е. в одном месте (упростил формальный класс) new Logger().log("Ошибка 1");
в другом месте (или классе) new Logger().log("Ошибка 1"); - дублирование текста ошибки


Если свой логгер
в одном месте new Logger().logMistake1();
в другом месте new Logger().logMistake1();
logMistake1() инкапсулирует текст ошибки - нет дублирования кода

Или я что-то не понимаю

2. User и Users - почти такое название, можно подумать, что функционал их схож. Или всё ок?

3. Можно ещё пояснить какие паттерны тут лягут? Например синглтон как мне кажется

4. Так и не получил ответы про слабую связность слоёв

Например
public class Parser {
private Logger logger = new Logger(); ---- жёсткое связывание
private Logger logger ---------------------- слабое связывание
.........
.........
.........
.........
}
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
25.02.2018, 01:39
Какие паттерны какая связанность. Делаешь запрос Apache http components, отдаешь джэксону, получаешь результат, все
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
25.02.2018, 09:15
Лучший ответ Сообщение было отмечено HighPredator как решение

Решение

olegall, как то вы все усложняете )

Задача - с помощью сервиса randomuser.me получить список более 100 пользователей и показать данные о них. Пока это консольное приложение.
Шаг 1.
Идем по адресу https://randomuser.me/api - и копируем полученый json
Шаг 2.
Идем на какой нибудь онлайн конвертер json и генерируем pojo классы для этого jsona. Я воспользовался http://www.jsonschema2pojo.org/
Шаг 3.
Подключаем retrofit
XML
1
2
3
4
5
6
7
8
9
10
11
        <dependency>
            <groupId>com.squareup.retrofit2</groupId>
            <artifactId>converter-gson</artifactId>
            <version>2.3.0</version>
        </dependency>
 
        <dependency>
            <groupId>com.squareup.retrofit2</groupId>
            <artifactId>retrofit</artifactId>
            <version>2.3.0</version>
        </dependency>
Шаг 4. создаем сервис
Java
1
2
3
4
5
public interface RandomUserService {
 
    @GET("api")
    Call<RandomUser> getRandomUser();
}
Шаг 5. Создаем приложение и тут же конфигурируем retrofit
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Application {
 
    public static void main(String[] args) throws IOException {
 
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://randomuser.me/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
 
 
        RandomUserService randomUserService = retrofit.create(RandomUserService.class);
 
        List<RandomUser> randomUsers = new ArrayList<>();
 
        for (int i = 0; i < 100; i++) {
            Call<RandomUser> result = randomUserService.getRandomUser();
            RandomUser randomUser = result.execute().body();
            randomUsers.add(randomUser);
            System.out.println("Add user #" + randomUsers.size() + " first name = " + randomUser.getResults().get(0).getName().getFirst());
        }
    }
}
Делов на 2 минуты
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 116
25.02.2018, 13:29  [ТС]
К сожалению уже не успеваю всё глобально переделать

Мои улучшения:

Улучшил HttpClient - избавил его от зависимости - урла, теперь я его в конструктор перадаю
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    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
Java
1
2
3
4
5
6
7
8
    public class Logger {
    
        private Logger(){}
    
        public static void logJsonChanged(){
            System.out.println("Не получилось обработать узел json дерева. Структура json у randomuser.me изменилась или другая причина");
        }
    }
улучшил Users - убрал захардкоженный count, избавился от зависимости
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    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
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    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;
        }
    }
Добавлено через 2 часа 7 минут
применил ко всем классам модификатор final - предполагаю, что от них нельзя наследоваться. Правильно?
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
25.02.2018, 14:00
olegall, ваш проект сейчас выглядит, примерно так (без обид):



И ваши попытки рефакторить имена классов, делать что то финальным... выглядят как "- интересно, а если я стеночку в зеленый покрашу.. лучше выглядеть будет?"
1
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 116
25.02.2018, 14:16  [ТС]
Текущий вариант:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
final class User {
 
    private final String firstName;
    private final String lastName;
    private final String nationality;
    private final Contacts contacts;
    private final Picture picture;
 
    public User (String firstName,
                 String lastName,
                 String nationality,
                 Contacts contacts,
                 Picture picture){
        this.firstName = firstName;
        this.lastName = lastName;
        this.nationality = nationality;
        this.contacts = contacts;
        this.picture = picture;
    }
 
    public String getFirstName(){
        return firstName;
    }
 
    public String getLastName(){
        return lastName;
    }
 
    public String getNationality(){
        return nationality;
    }
 
    public Contacts getContacts() {
        return contacts;
    }
 
    public Picture getPicture() {
        return picture;
    }
}
 
final class Contacts {
 
    private final String email;
    private final String phone;
    private final Address address;
 
    Contacts(String email, String phone, Address address) {
        this.email = email;
        this.phone = phone;
        this.address = address;
    }
 
    public String getEmail() {
        return email;
    }
 
    public String getPhone() {
        return phone;
    }
 
    public Address getAddress() {
        return address;
    }
}
 
final class Address {
 
    private final String state;
    private final String city;
    private final String street;
 
    Address(String state, String city, String street) {
        this.state = state;
        this.city = city;
        this.street = street;
    }
 
    public String getState() {
        return state;
    }
 
    public String getCity() {
        return city;
    }
 
    public String getStreet() {
        return street;
    }
}
 
 
final class Picture {
 
    private final String thumbnail;
    private final String large;
 
    public Picture(String thumbnail, String large){
        this.thumbnail = thumbnail;
        this.large = large;
    }
 
    public String getThumbnail() {
        return thumbnail;
    }
 
    public String getLarge() {
        return large;
    }
}
 
 
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;
    }
}
 
 
final class Logger {
 
    private Logger(){}
 
    public static void logJsonChanged(){
        System.out.println("Не получилось обработать узел json дерева. Структура json у randomuser.me изменилась или другая причина");
    }
}
 
 
final 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;
    }
}

Что сейчас плохо кроме классов HttpClient и Parser?

Есть идея избавиться от Parser и перенести метод getUserFromJSON в User, переименовав его в get, т.к.
он не универсальный и заточен под User. Правильно?
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
25.02.2018, 14:26
olegall, вы для начала расскажите, для чего вы это делаете? Если это тестовое задание для устройства на работу - то все плохо. Если это задание для себя что бы разобраться и понять как это все работает, то тут уже можно что то обсуждать.
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 116
25.02.2018, 14:28  [ТС]
Тестовое задание. Но и для себя тоже тренировка. Я исправил, что мог, что-то не успею. Всё ещё ВСЁ плохо?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
25.02.2018, 14:38
Цитата Сообщение от olegall Посмотреть сообщение
Всё ещё ВСЁ плохо?
тебе же готовый код дали. К чему ты упорствовать?

Добавлено через 44 секунды
а так да, вопросов довольно много возникает
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
25.02.2018, 14:41
olegall, в задании оговорено что фрейморками нельзя пользоваться? Графический интерфейс к этому безобразию нужен?
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 116
25.02.2018, 14:49  [ТС]
Там ничего не оговорено. Это должно быть мобильное приложение в итоге
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
25.02.2018, 14:59
Работодатель скорее всего ожидает увидеть что вы умеете использовать:
1. Системы сборки (maven, gradle и тд)
2. Git
3. Конфигуровать и использовать один из существующих логгеров (а не изобретенный свой)
4. Сможете подключить и воспользоваться существующей библиотекой для парсинга json
5. Продемонстрируете умение работать с асинхронными обращения к рест сервисам.
6. Использовать dependency injection.
7. Имеете хорошие навыки в ООП.

Добавлено через 1 минуту
Цитата Сообщение от olegall Посмотреть сообщение
Это должно быть мобильное приложение в итоге
Тем более.. демонстрация владения связкой rxjava + retrofit + dagger2 для di... вот что скорее всего ожидают увидеть от собеседуемого

Добавлено через 5 минут
вам скорее всего что то типа этого нужно почитать https://habrahabr.ru/company/r... og/275943/
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
03.03.2018, 16:59
olegall, если все еще актуально наткнулся на статейку https://habrahabr.ru/post/345372/ помоему это именно то что вам нужно было
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2018, 16:59
Помогаю со студенческими работами здесь

Конвертер валют, рефакторинг
Вот есть кусок кода, &quot;Конвертора валют&quot;, метод конвертации: public static String getResult(double inCount, int from, int to) throws...

Рефакторинг - Наследование и перегрузка
Всем привет! Написал код, чтобы потренироваться с перегрузкой и наследованием. Но мне кажется, что он громоздкий. Может есть способ...

Сделать рефакторинг для программы
Нужно сделать рефакторинг для этой программы package laba1; import java.awt.Color; import java.awt.event.ActionEvent; import...

Как правильно сделать рефакторинг Exceptions
Подскажите, как правильно сделать рефакторинг Exceptions. Например вынести в отдельный метод и тп. На разных сайтах все пишут по-разному....

Рефакторинг кода(упрощение для понимания)
Есть работающая лабораторная работа, я ее сделал, не показывал преподавателю и не буду, не хочу показывать г***код. Даже две лабораторных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru