Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пояснювальна записка.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
597 Кб
Скачать
☆
  1. Опис реалізації

3.1 Зчитування вмісту xml файлу

Описується класом edu.kpi.XML.XMLReader та допоміжним класом пакетної видимості edu.kpi.XML.ElementHandler. Другий з них реалізує інтерфейс org.xml.sax.helpers.DefaultHandler, оброблюючи таким чином події зустрічі у XML файлі відкриваючого тегу та його атрибутів, закриваючого тегу, та подію яка викликається при отриманні вмісту XML елемента. У цих методах відбувається деяке структурування інформації у зручній для подальшої роботи формі та запуск методів класу edu.kpi.XML.XMLReader що займаються обробкою конкретних даних отриманих у результаті обходу XML файлу, та створенням з них десеріалізованого об’єкту класу edu.kpi.declaration.Declaration. Запуск процесу обробки з боку клієнта виконується запуском єдиного методом загальної видимості read(String fileXML, String fileSchema), що виконує валідацію XML файлу заданою схемою, та у результаті успіху запускає процес парсингу описаний вище, та на виході «віддає» клієнту готовий десеріалізований об’єкт.

3.2 Валідація xml файлу

Валідація XML файлу виконується за допомогою створеної вручну XSD схеми - файлу текстової розмітки XML, що повністю описує структуру кожного елемента перевіряємого XML файлу, зв’язки цих елементів, входження, інші залежності. Маючи таку у схему у програмі для виконання валідації достатньо виклику послідовності декількох методів: запит до класу SchemaFactory, щоб створити нову схему, створення валідатора відповідної схеми та виклик його методу «validate». У разі виникнення SAXException у нього схему вважаємо не валідованою.

3.3 Запис у xml файл

Зводиться до використання класу javax.xml.bind.Marshaller. Клас edu.kpi.XML.XMLWriter виступає обгорткою вище названого класу та дозволяє клієнту зчитувати дані потрібного класу викликом одного єдиного методу.

3.4 Консольне меню

Консольне меню проекту визначається абстрактним класом edu.kpi.menu.MenuItem та його наслідниками MenuItemChoose, MenuItemStepShow, MenuItemValueRead, що знаходяться у тому ж пакеті. Задання та обхід меню у програмі чимось нагадує аналогічні операції для структури даних дерево: кожен пункт меню має необмежену кількість нащадків - під меню, які в свою чергу також можуть мати необмежену кількість нащадків і т.д. Тоді обхід такого меню зводиться до послідовних рекурсивних викликів для запуску методу обробки нащадків оброблюваного пункту меню. У програмі є 3 типа пунктів меню, що по різному визначаються абстрактний метод для ресурсного обходу, так клас MenuItemChoose дає клієнту вибрати якого нащадка далі запускати, MenuItemStepShow запускає усіх своїх нащадків по черзі, MenuItemValueRead призначений бути листком дерева обходу меню, для служить лише для зчитування вводу користувача.

На рис. 1 та рис. 2 показаний зовнішній вигляд консольного меню.

Рис 1. Головне меню

Рис 2. Один із підпунктів меню

3.5 Подання множини прибутків

Усі класи що задають отримані прибутки: ProfitChildrenAid, ProfitGift, ProfitHonorar, ProfitMainJob, ProfitMaterialaid, ProfitPropertySale, ProfitRemittance, ProfitSubJob відповідно задають отримання грошових сум з пільг на дітей, подарунків, авторських винагород (гонорарів), доходів з основного місця роботи, матеріальної допомоги, продажів майна, грошових переводів із-за кордону, доходів з додаткового місця роботи, та спільний для них абстрактний клас Profit знаходяться у пакеті edu.kpi.profit та повністю задають усі типи витрат зазначених у технічному завданні та систему оподаткування кожного з них, а оскільки чинники які впливають на оподаткування сильно різняться для різних видів доходів, суперклас містить абстрактний метод для визначення податку getTax(), який перевизначаться його наслідниками, крім того суперклас містить й поле income, що задає суму прибутку, і є спільним для усіх нащадків.