Skip to content

Commit e61f263

Browse files
author
Никита
committed
- Удалены фабричные методы createFileStrategy(), createManualStrategy(), createRandomStrategy() из InputManager
- Стратегии теперь создаются напрямую в клиентском коде для лучшего соответствия паттерну Strategy - Исправлена обработка команды "стоп" в методе promptForConfirmation() для ManualInputReaderStrategy - Добавлена возможность прерывания ввода на любом этапе (подтверждение, ввод данных) - Все методы ввода последовательно пробрасывают StopInputException для единообразной обработки - Улучшены сообщения об ошибках и подсказки для пользователя
1 parent f3e1b4c commit e61f263

6 files changed

Lines changed: 99 additions & 85 deletions

File tree

.idea/vcs.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/dto/Client.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,19 @@ public String getPhoneNumber() {
4848
public int getIdNumber() {
4949
return idNumber;
5050
}
51+
52+
@Override
53+
public String toString() {
54+
return "Client{" +
55+
"name='" + name + '\'' +
56+
", phoneNumber='" + phoneNumber + '\'' +
57+
", idNumber=" + idNumber +
58+
'}';
59+
}
60+
61+
@Override
62+
public String toString() {
63+
return String.format("%s, тел.: %s, ID: %d",
64+
name, phoneNumber, idNumber);
65+
}
5166
}

src/main/java/input/InputManager.java

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -63,47 +63,4 @@ public CustomCollection<Client> loadData() throws IOException {
6363
}
6464
return currentStrategy.getData();
6565
}
66-
67-
/**
68-
* Создает стратегию для чтения данных из файла.
69-
*
70-
* <p>Файл должен содержать данные в формате:</p>
71-
* <pre>
72-
* Имя|Телефон|ID
73-
* Иван Иванов|+79991234567|1
74-
* </pre>
75-
*
76-
* @param filePath путь к файлу с данными о клиентах
77-
* @return стратегия чтения из файла
78-
* @throws IllegalArgumentException если {@code filePath} равен {@code null} или пуст
79-
*/
80-
public FileReaderStrategy createFileStrategy(String filePath) {
81-
if (filePath == null || filePath.trim().isEmpty()) {
82-
throw new IllegalArgumentException("Путь к файлу не может быть null или пустым");
83-
}
84-
return new FileReaderStrategy(filePath);
85-
}
86-
87-
/**
88-
* Создает стратегию для ручного ввода данных через консоль.
89-
*
90-
* <p>Стратегия предоставляет интерактивный интерфейс для ввода данных
91-
* о клиентах с валидацией и подтверждением.</p>
92-
*
93-
* @return стратегия ручного ввода
94-
*/
95-
public ManualInputReaderStrategy createManualStrategy() {
96-
return new ManualInputReaderStrategy();
97-
}
98-
99-
/**
100-
* Создает стратегию для генерации случайных данных о клиентах.
101-
*
102-
* @param count количество клиентов для генерации
103-
* @return стратегия генерации случайных данных
104-
* @throws IllegalArgumentException если {@code count} меньше или равен 0
105-
*/
106-
public RandomDataGeneratorStrategy createRandomStrategy(int count) {
107-
return new RandomDataGeneratorStrategy(count);
108-
}
10966
}

src/main/java/input/Strategy/FileReaderStrategy.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,12 @@ public Optional<Client.ClientBuilder> parseToClient(String line) {
113113
}
114114

115115
if (name.isEmpty()) {
116-
System.out.println("Пустое имя" + line);
116+
System.out.println("Пустое имя в строке: " + line);
117117
return Optional.empty();
118118
}
119119

120120
if (!phoneNumber.matches("^\\+7\\d{10}$")) {
121-
System.out.println("Неверный формат номера телефона" + line);
121+
System.out.println("Неверный формат номера телефона в строке: " + line);
122122
return Optional.empty();
123123
}
124124

@@ -129,7 +129,7 @@ public Optional<Client.ClientBuilder> parseToClient(String line) {
129129
return Optional.of(builder);
130130

131131
} catch (Exception e) {
132-
System.out.println("Ошибка" + line);
132+
System.out.println("Ошибка в строке: " + line);
133133
return Optional.empty();
134134
}
135135
}

src/main/java/input/Strategy/ManualInputReaderStrategy.java

Lines changed: 76 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -60,21 +60,26 @@ public CustomCollection<Client> getData() throws IOException {
6060
int clientNumber = 1;
6161

6262
while (true) {
63-
if(userIds.size() == 1000) {
63+
if (userIds.size() == 1000) {
6464
System.out.println("Достигнут лимит клиентов");
6565
break;
6666
}
6767

6868
System.out.println("Ввод клиент №" + clientNumber);
6969

70-
if (!promptForConfirmation("Добавляем клиента?")) {
71-
break;
72-
}
70+
try {
71+
if (!promptForConfirmation("Добавляем клиента?")) {
72+
break;
73+
}
7374

74-
Client client = inputClient(clientNumber);
75-
if (client != null) {
76-
clients.add(client);
77-
clientNumber++;
75+
Client client = inputClient(clientNumber);
76+
if (client != null) {
77+
clients.add(client);
78+
clientNumber++;
79+
}
80+
} catch (StopInputException e) {
81+
System.out.println("\nВвод прерван пользователем. Текущий клиент не добавлен.");
82+
break;
7883
}
7984
}
8085
System.out.println("\n Ввод завершен. Добавлено клиентов: " + clients.size());
@@ -88,43 +93,55 @@ public CustomCollection<Client> getData() throws IOException {
8893
*
8994
* @param clientNumber порядковый номер клиента (для отображения в интерфейсе)
9095
* @return объект {@link Client} с введенными данными или {@code null},
91-
* если пользователь отменил ввод
96+
* если пользователь отменил ввод
9297
*/
9398
private Client inputClient(int clientNumber) {
94-
String name = promptForName();
95-
String phone = promptForNumber();
96-
int id = promptForId();
97-
98-
Client.ClientBuilder builder = new Client.ClientBuilder().name(name)
99-
.phoneNumber(phone)
100-
.idNumber(id);
101-
102-
System.out.println("\nВы ввели:");
103-
System.out.println(" Имя: " + name);
104-
System.out.println(" Телефон: " + phone);
105-
System.out.println(" ID: " + id);
106-
107-
if (promptForConfirmation("Все верно?")) {
108-
return builder.build();
109-
} else {
110-
System.out.println("Отмена ввода этого клиента");
111-
return null;
99+
try {
100+
String name = promptForName();
101+
String phone = promptForNumber();
102+
int id = promptForId();
103+
104+
Client.ClientBuilder builder = new Client.ClientBuilder().name(name)
105+
.phoneNumber(phone)
106+
.idNumber(id);
107+
108+
System.out.println("\nВы ввели:");
109+
System.out.println(" Имя: " + name);
110+
System.out.println(" Телефон: " + phone);
111+
System.out.println(" ID: " + id);
112+
113+
if (promptForConfirmation("Все верно?")) {
114+
return builder.build();
115+
} else {
116+
System.out.println("Отмена ввода этого клиента");
117+
return null;
118+
}
119+
} catch (StopInputException e) {
120+
throw e;
112121
}
113122
}
114123

115124
private String promptForName() {
116-
return promptForString("Введите имя", true);
125+
try {
126+
return promptForString("Введите имя", true);
127+
} catch (StopInputException e) {
128+
throw e;
129+
}
117130
}
118131

119132
private String promptForNumber() {
120133
while (true) {
121-
String phone = promptForString("Введите номер телефона в формате +7XXXXXXXXXX", true);
134+
try {
135+
String phone = promptForString("Введите номер телефона в формате +7XXXXXXXXXX", true);
122136

123-
if (phone.matches("^\\+7\\d{10}$")) {
124-
return phone;
125-
} else {
126-
System.out.println("⚠️ Неверный формат телефона! Пример: +79991234567");
127-
System.out.println(" Должно начинаться с +7 и содержать 11 цифр");
137+
if (phone.matches("^\\+7\\d{10}$")) {
138+
return phone;
139+
} else {
140+
System.out.println("⚠️ Неверный формат телефона! Пример: +79991234567");
141+
System.out.println(" Должно начинаться с +7 и содержать 11 цифр");
142+
}
143+
} catch (StopInputException e) {
144+
throw new RuntimeException(e);
128145
}
129146
}
130147
}
@@ -148,6 +165,8 @@ private int promptForId() {
148165

149166
userIds.add(id);
150167
return id;
168+
} catch (StopInputException e) {
169+
throw e;
151170
} catch (NumberFormatException e) {
152171
System.out.println("ID должен быть целым числом");
153172
}
@@ -168,19 +187,24 @@ private int promptForId() {
168187
*
169188
* @param message сообщение с вопросом для подтверждения
170189
* @return {@code true} если пользователь подтвердил действие,
171-
* {@code false} если отказался
190+
* {@code false} если отказался
172191
*/
173192
private boolean promptForConfirmation(String message) {
174193
while (true) {
175-
System.out.print(message + " (да/нет): ");
194+
System.out.print(message + " (да/д/yes/y или нет/н/no/n): ");
176195
String input = scanner.nextLine().trim().toLowerCase();
196+
197+
if (input.equalsIgnoreCase("стоп")) {
198+
throw new StopInputException();
199+
}
200+
177201
if (input.equals("да") || input.equals("д") || input.equals("y") || input.equals("yes")) {
178202
return true;
179203
}
180204
if (input.equals("нет") || input.equals("н") || input.equals("n") || input.equals("no")) {
181205
return false;
182206
}
183-
System.out.println("⚠️ Пожалуйста, введите 'да' или 'нет'");
207+
System.out.println("⚠️ Пожалуйста, введите 'да/д/yes/y' или 'нет/н/no/n'");
184208
}
185209
}
186210

@@ -191,27 +215,40 @@ private boolean promptForConfirmation(String message) {
191215
* <p>Если поле является обязательным ({@code required = true}),
192216
* метод будет продолжать запрашивать ввод до получения непустой строки.</p>
193217
*
194-
* @param message сообщение с описанием запрашиваемых данных
218+
* @param message сообщение с описанием запрашиваемых данных
195219
* @param required флаг, указывающий является ли поле обязательным для заполнения
196220
* @return введенная пользователем строка (без начальных и конечных пробелов)
197221
*/
198-
private String promptForString(String message, boolean required) {
222+
private String promptForString(String message, boolean required) {
199223
while (true) {
200224
System.out.print(message + ": ");
201225

202226
try {
203227
String input = scanner.nextLine().trim();
204228

229+
if (input.equalsIgnoreCase("стоп")) {
230+
throw new StopInputException();
231+
}
232+
205233
if (required && input.isEmpty()) {
206234
System.out.println("⚠️ Это поле обязательно для заполнения!");
207235
continue;
208236
}
209237

210238
return input;
211239
} catch (Exception e) {
240+
if (e instanceof StopInputException) {
241+
throw e; // Пробрасываем дальше
242+
}
212243
System.out.println("Ошибка ввода: " + e.getMessage());
213244
scanner.nextLine(); // Очистка буфера
214245
}
215246
}
216247
}
248+
249+
class StopInputException extends RuntimeException {
250+
public StopInputException() {
251+
super("Ввод прерван пользователем");
252+
}
253+
}
217254
}

test_clients.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Иван Иванов|+79991234567|1001
2+
Мария Петрова|+79992345678|1002
3+
в|dasd|3
4+
Сергей Сидоров|+79993456789|1003

0 commit comments

Comments
 (0)