docs: update csv student writer contract
This commit is contained in:
+143
-26
@@ -42,13 +42,13 @@ C25,4.9,10003
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# `StudentCsvWriter`
|
## `StudentCsvWriter`
|
||||||
|
|
||||||
## Назначение
|
### Назначение
|
||||||
|
|
||||||
Дозаписывать одного студента в указанный CSV-файл.
|
Дозаписывать одного студента в **существующий** CSV-файл.
|
||||||
|
|
||||||
## Контракт
|
### Контракт
|
||||||
|
|
||||||
Конструктор:
|
Конструктор:
|
||||||
|
|
||||||
@@ -65,41 +65,158 @@ public void write(Student student) throws IOException
|
|||||||
### Требования
|
### Требования
|
||||||
|
|
||||||
1. Метод принимает одного `Student`.
|
1. Метод принимает одного `Student`.
|
||||||
2. Запись выполняется в режиме добавления.
|
2. Указанный файл должен уже существовать.
|
||||||
3. Существующие записи не изменяются.
|
3. Запись выполняется в режиме добавления.
|
||||||
4. Если файл существует, заголовок повторно не записывается.
|
4. Существующие записи не должны изменяться.
|
||||||
5. Если файл не существует, необходимо создать файл.
|
5. Заголовок CSV не должен записываться повторно.
|
||||||
6. При создании нового файла имя должно соответствовать формату:
|
6. Если файл не существует, новый файл **не создавать**.
|
||||||
|
7. Если файл не существует, метод должен выбросить `IOException`.
|
||||||
|
8. При успешной записи метод завершается без исключения.
|
||||||
|
9. Метод не возвращает значение.
|
||||||
|
10. Исключения, связанные с записью файла, не обрабатывать внутри метода.
|
||||||
|
11. Исключения `Student` и `StudentBuilder` также не обрабатывать.
|
||||||
|
|
||||||
|
## Невозможность записи
|
||||||
|
|
||||||
|
Если указанный файл не существует, метод должен выбросить `IOException`.
|
||||||
|
|
||||||
|
Также `IOException` должен возникать и передаваться вызывающему коду, если:
|
||||||
|
|
||||||
|
- файл недоступен для записи;
|
||||||
|
- отсутствуют права на запись;
|
||||||
|
- произошла ошибка файловой системы;
|
||||||
|
- запись в файл невозможна по другой причине.
|
||||||
|
|
||||||
|
Создание файла с именем вида:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
students-yyyy-MM-dd-HH-mm.csv
|
students-yyyy-MM-dd-HH-mm.csv
|
||||||
```
|
```
|
||||||
|
|
||||||
Например:
|
`StudentCsvWriter` **не выполняет**.
|
||||||
|
|
||||||
```text
|
## Пример теста: несуществующий файл
|
||||||
students-2026-08-28-20-45.csv
|
|
||||||
|
Передать путь к несуществующему файлу:
|
||||||
|
|
||||||
|
```java
|
||||||
|
writer.write(student);
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Новый файл создаётся в директории, указанной абсолютным путём.
|
Проверить:
|
||||||
2. При создании нового файла сначала записывается заголовок.
|
|
||||||
3. При успешной записи метод завершается без исключения.
|
|
||||||
4. Метод не возвращает значение.
|
|
||||||
5. Исключения, связанные с записью файла, не обрабатывать внутри метода — они должны передаваться вызывающему коду.
|
|
||||||
6. Исключения `Student` и `StudentBuilder` также не обрабатывать.
|
|
||||||
|
|
||||||
## Невозможность записи
|
```text
|
||||||
|
IOException
|
||||||
|
```
|
||||||
|
|
||||||
Если студент не может быть записан, например:
|
Проверить также, что новый файл не был создан.
|
||||||
|
|
||||||
- отсутствуют права на запись;
|
## Изменение теста существующего файла
|
||||||
- невозможно создать файл;
|
|
||||||
- файл недоступен;
|
|
||||||
- произошла ошибка файловой системы;
|
|
||||||
|
|
||||||
метод должен выбросить соответствующее исключение, например `IOException`.
|
Для существующего файла:
|
||||||
|
|
||||||
Запись не должна возвращать специальное значение вроде `0` для обозначения ошибки.
|
```text
|
||||||
|
groupNumber,averageGrade,recordBookNumber
|
||||||
|
A12,4.5,10001
|
||||||
|
```
|
||||||
|
|
||||||
|
выполнить:
|
||||||
|
|
||||||
|
```java
|
||||||
|
writer.write(student2);
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверить, что результат:
|
||||||
|
|
||||||
|
```text
|
||||||
|
groupNumber,averageGrade,recordBookNumber
|
||||||
|
A12,4.5,10001
|
||||||
|
B07,3.8,10002
|
||||||
|
```
|
||||||
|
|
||||||
|
Заголовок присутствует только один раз.
|
||||||
|
|
||||||
|
## Дополнительный метод `StudentCsvWriter`
|
||||||
|
|
||||||
|
Кроме метода записи одного студента:
|
||||||
|
|
||||||
|
```java
|
||||||
|
public void write(Student student) throws IOException;
|
||||||
|
```
|
||||||
|
|
||||||
|
необходимо реализовать метод:
|
||||||
|
|
||||||
|
```java
|
||||||
|
public void write(MyList<Student>[] students) throws IOException;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Контракт
|
||||||
|
|
||||||
|
Метод должен:
|
||||||
|
|
||||||
|
1. Принимать массив `MyList<Student>`.
|
||||||
|
2. Последовательно обрабатывать все переданные коллекции.
|
||||||
|
3. Записывать каждого студента в указанный CSV-файл.
|
||||||
|
4. Сохранять порядок:
|
||||||
|
- коллекций в массиве;
|
||||||
|
- студентов внутри каждой `MyList`.
|
||||||
|
5. Использовать тот же формат CSV и те же правила записи, что и `write(Student)`.
|
||||||
|
6. Работать только с уже существующим файлом.
|
||||||
|
7. Не создавать файл, если он отсутствует.
|
||||||
|
8. При отсутствии файла выбрасывать `IOException`.
|
||||||
|
9. Не изменять переданные `MyList<Student>`.
|
||||||
|
10. Не обрабатывать исключения, возникающие при создании или валидации `Student`.
|
||||||
|
11. При ошибке записи прекращать операцию и передавать исключение вызывающему коду.
|
||||||
|
|
||||||
|
### Пример
|
||||||
|
|
||||||
|
```java
|
||||||
|
MyList<Student>[] studentLists = ...;
|
||||||
|
|
||||||
|
writer.write(studentLists);
|
||||||
|
```
|
||||||
|
|
||||||
|
Если:
|
||||||
|
|
||||||
|
```text
|
||||||
|
studentLists[0] = [Student A, Student B]
|
||||||
|
studentLists[1] = [Student C]
|
||||||
|
studentLists[2] = [Student D, Student E]
|
||||||
|
```
|
||||||
|
|
||||||
|
в файл должны последовательно добавиться:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Student A
|
||||||
|
Student B
|
||||||
|
Student C
|
||||||
|
Student D
|
||||||
|
Student E
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка пустых коллекций
|
||||||
|
|
||||||
|
Пустые `MyList<Student>` внутри массива не должны приводить к ошибке и не должны добавлять записей в файл.
|
||||||
|
|
||||||
|
### Проверка пустого массива
|
||||||
|
|
||||||
|
Для:
|
||||||
|
|
||||||
|
```java
|
||||||
|
MyList<Student>[] studentLists = ...; // размер 0
|
||||||
|
```
|
||||||
|
|
||||||
|
метод не должен добавлять никаких записей и не должен изменять файл.
|
||||||
|
|
||||||
|
### Проверка отсутствующего файла
|
||||||
|
|
||||||
|
Для несуществующего файла:
|
||||||
|
|
||||||
|
```java
|
||||||
|
writer.write(studentLists);
|
||||||
|
```
|
||||||
|
|
||||||
|
должен выбрасываться `IOException`. Файл создавать запрещено.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user