Skip to content

Latest commit

 

History

History
117 lines (85 loc) · 11.9 KB

File metadata and controls

117 lines (85 loc) · 11.9 KB

Сериализация и работа с файлами

Памятка к домашнему заданию

Перед тем, как отправить своё решение на проверку преподавателю, сверьтесь с чеклистом

Что делать, если возникли сложности?

И это здорово! Если их преодолевать правильно, то можно получить большую образовательную пользу для себя. Периодическое возникновение вопросов, недопонимание пройденного материала - нормальная и неотъемлемая часть обучения. А мы здесь, чтобы помочь вам пройти этот путь.

Что делать, если непонятна теория?

  1. Если подобный вопрос разбирался на лекции, посмотрите еще раз раздел с этой темой в видеозаписи.
  2. Если вопрос не решился, попробуйте поискать ответ самостоятельно в интернете, этот навык пригодится вам в работе.
  3. Если самостоятельно разобраться не удалось, задайте вопрос в общем чате, мы обязательно поможем.

Что делать, если непонятно условие задания?

  1. Прежде чем задать вопрос по условию задачи, перечитайте его ещё раз и убедитесь, что в тексте условия нет прямого ответа на этот вопрос. Умение работать с текстом - важный навык работы с информацией.
  2. Если ответа на свой вопрос в тексте условия не увидели, задайте его в общем чате, мы раскроем детали условия подробнее. Не забудьте при этом скинуть и ссылку на условие задания, про которую у вас вопрос.

Что делать,если не получается задача?

Если ваша проблема это ошибка компиляции (подчёркивает красным, не даёт запустить программу), сборки проекта, CI и прочие подобные ошибки, то:

  1. Найдите и прочитайте текст ошибки, который вам подсвечивает реплит, идея (или логи); "подчёркивает красным" - это не описание ошибки.
  2. Попробуйте понять текст ошибки, при необходимости воспользуйтесь переводчиком. Нестрашно, если вы переведёте неточно, тут главное сам процесс: со временем и с нашей помощью вы будете это делать лучше и лучше, но, пропуская этот этап, вы не сможете научиться это делать.
  3. Если не получилось понять ошибку по её тексту, попробуйте её загуглить и изучить подобную ошибку у других людей. Попробуйте примерить решения их проблем на свой код. Соотнесите найденные описания ошибки с пройденной теорией.
  4. Если все равно вашу трудности не разрешились, напишите в общий чат, обязательно указав:
    1. Название задачи и ссылку на условие
    2. Ссылку на вашу работу
    3. Текст и скриншот (не фотография) ошибки.
    4. Ваши размышления и описание шагов, которые вы совершили для решения.

Если ваша проблема это ошибка исполнения (программа умирает уже после запуска) или она отрабатывает неправильно, то:

  1. Воспользуйтесь отладчиком для пошагового анализа работы вашей программы. Так вы либо убедитесь в неправильности придуманного вами алгоритма или найдёте конкретное место, где ожидаемое поведение программы разошлось с фактическим.
  2. Если проблему найти не получилось, напишите в общий чат, обязательно указав:
    1. Название задачи и ссылку на условие
    2. Ссылку на вашу работу
    3. Конкретное и подробное описание проблемы или затруднения при решении задачи ("Помогите что не так" - это не описание)
    4. Подробное описание вашего анализа программы с помощью отладчика вместе со скринами
    5. Ваши размышления и описание шагов, которые вы совершили для решения.

В решении выполнены все требования задания

Убедитесь, что все требования задания выполнены. Для этого перед отправкой внимательно прочтите весь текст условия задания и соотнесите сказанное в нём с вашим решением. Навык самопроверки работы перед ревью пригодится вам как при обучении, так и на работе.


Сдаём через гитхаб

Время пришло познакомиться с профессиональными инструментами для контроля версий вашего кода. Теперь мы не сдаём домашние задания в реплите, а заливаем проект из идеи сразу же в публичный гитхаб-репозиторий. Одна задача - один репозиторий.

Для того чтобы в репозитории не отслеживался всякий мусор, не забывайте добавлять .gitignore. В нём должны игнорироваться файлы идеи (правила *.iml и .idea), папки для автогенерируемых результатов сборки (out, позже - target). Этот файл должен находиться в корне вашего репозитория, а сам репозиторий должен быть инициализирован в корне вашего проекта. Т.е. открывая репозиторий вы должны сразу видеть папку src. Если вы забыли проигнорировать какие-либо файлы и они попали в репозиторий, используйте команду git rm.

Задача 1 (обязательная)

⚠️ Эта задача является продолжением задачи про одномерные массивы, поэтому для выполнения этой лучше сперва нужно получить по ней зачёт.

Возьмите реплит с решением задачи про магазин или решите её заново сразу в соответствии с новыми требованиями. Несмотря на то, что та задача решалась в реплите, эти мы сдаём через гитхаб. Требования исходного условия задания сохраняются и в этой задаче.

Создайте класс Basket, объект которого будет представлять себе покупательскую корзину. В нём должны быть методы:

  • конструктор, принимающий массив цен и названий продуктов;
  • addToCart(int productNum, int amount) - метод добавления amount штук продукта номер productNum в корзину;
  • printCart() - метод вывода на экран покупательской корзины.
  • saveTxt(File textFile) - метод сохранения корзины в текстовый файл; использовать встроенные сериализаторы нельзя;
  • static Basket loadFromTxtFile(File textFile) - статический(!) метод восстановления объекта корзины из текстового файла, в который ранее была она сохранена;
  • геттеры, которые вы посчитаете нужными.

После ввода каждой покупки пользователем вам следует сохранять пользовательскую корзину в файл basket.txt. При старте программа должна искать этот файл в корне проекта и если он находится, восстанавливать корзину из него; если файл не найдет, то стоит начать с пустой корзины.

Коммит и пуш в ветку main.

Подсказки

Если все данные у вас хранятся в массивах, то просто сохраните по массиву на каждой строке.

Например, если бы это был лонговый массив в поле нашей корзины, то можно было бы сделать так:

public void saveTxt(File textFile) throws IOException {
    try (PrintWriter out = new PrintWriter(file);) {
        ...
        for (long e : longArrInField)    
            out.print(e + " ");
        }
        ...
    }
}

А при чтении вы сможете строку файла разбить через split(" ") и пройдясь циклом каждое значение превратить в long.

Задача 2 (обязательная)

Эту задачу делаем в том же репозитории. Отведите ветку serial от main, в которой находится решение первой задачи.

В этом задании мы будем сохранять и восстанавливать корзину покупок через встроенную сериализацию в Java.

Добавьте метод saveBin(File file) для сохранения в файл в бинарном формате.

Добавьте метод static loadFromBinFile(File file) для загрузки корзины из бинарного файла.

Используйте для этого сериализацию и десериализацию. Замените в main сохранение и загрузку из текстового файла на бинарный (название пусть будет basket.bin).

Коммит и пуш в ветку serial.