ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.12.2023
Просмотров: 48
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
fun save(protoType: ProtoType?) { val writer = BufferedWriter(FileWriter("saved")) if (protoType != null) { writer.write(protoType.typeName() + "\n") } this.forEach(object : DoWith { override fun doWith(obj: Any?) { val x = obj if (protoType != null) { writer.write( """ ${protoType.toString(x!!)} """.trimIndent() ) } } }) if (writer != null) writer.close() } fun load(protoType: ProtoType?): BinaryTreeArray? { val fileName = "saved" val bts = BinaryTreeArray(this.comparator) try { |
BufferedReader(FileReader(fileName)).use { br -> var line: String? line = br.readLine() if (protoType != null) { if (!protoType.typeName().equals(line)) { throw Exception("Wrong file structure") } } while (br.readLine().also { line = it } != null) { if (protoType != null) { bts.addValue(protoType.parseValue(line!!)) } } } } catch (e: Exception) { throw RuntimeException(e) } return bts; } |
Листинг 8. Реализация сохранения в файл и загрузки из файла
3.5 Пример работы разработанного ПО
В Main были написаны все методы по работе с деревом для демонстрации. Результат их работы приведён на рис. 1-4.
Также в ходе лабораторной работы был реализован GUI (рис. 5).
Код реализации класса GUI приведён в Приложении А.
Рисунок 1. Демонстрация работы операций над деревом при ТД “IntegerClass”
Рисунок 2. Демонстрация работы операций над деревом при ТД
“IntegerClass”
Рисунок 3. Демонстрация работы операций над деревом при ТД
“DateTimeClass”
Рисунок 4. Демонстрация работы операций над деревом при ТД
“DateTimeClass”
Рисунок 5. Демонстрация работы GUI
Заключение
В ходе выполнения лабораторной работы было разработано и протестировано программное обеспечение, позволяющее работать со структурой данных «Бинарное дерево в массиве» с различными типами данных (целочисленный тип и дата-время). Были применены шаблоны/паттерны проектирования «Фабрика» и «Объектпрототип/Строитель».
Программный код данного ПО был портирован с языка Java на Kotlin. Был сделан вывод, что возможности языка программирования Kotlin для разработки программного обеспеченияявляются достаточно удобными для написания кода.
Переведенный код на Kotlin имеет схожую структуру и функциональность с исходным кодом на Java. Вот некоторые основные аспекты
, которые следует отметить:
1. Синтаксис: Код на Kotlin использует синтаксис Kotlin, который отличается от синтаксиса Java. Например, в Kotlin нет точек с запятой в конце строк, и блоки кода обозначаются фигурными скобками вместо ключевого слова `begin` и `end` в Java.
2. Типы данных: Kotlin имеет свою систему типов данных, которая в некоторых случаях отличается от системы типов в Java. Например, в Kotlin нет автоматического преобразования между числовыми типами данных, поэтому в некоторых местах может потребоваться явное приведение типов.
3. Обработка событий: Обработка событий в GUI переведена на функциональный стиль с использованием лямбда-выражений вместо интерфейса `ActionListener` в Java. Например, вместо `addActionListener(this)` используется `addActionListener { ... }`.
4. Nullable типы: В Kotlin введено понятие nullable и non-nullable типов данных. Это помогает предотвратить ошибки связанные с нулевыми значениями. В коде Kotlin используются операторы `?` и `!!` для работы с nullable типами.
5. Строковые интерполяции: В Kotlin можно использовать строковые интерполяции с помощью символа `$`, чтобы вставлять значения переменных непосредственно в строки. Например, `println("value = " + btsArray.getDataAtIndex(2).toString())` в Java переведено как `println("value = ${btsArray.getDataAtIndex(2).toString()}")` в Kotlin.
6. Методы расширения: Kotlin позволяет определять методы расширения, которые можно вызывать на объектах как будто они являются частью самого класса. В переведенном коде такие методы используются, например, `btsArray.forEach { println(it) }`.
7. Конструкторы классов: В Kotlin есть сокращенный синтаксис для определения и инициализации полей класса в конструкторе. Например, вместо явного определения полей и присваивания им значений в отдельных строках, можно использовать сокращенный синтаксис наподобие `class GUI(private val factoryType: FactoryType) : JPanel(), ActionListener`.
В целом, переведенный код на Kotlin сохраняет функциональность и структуру исходного кода на Java, но использует синтаксис и особенности Kotlin, что делает код более коротким и читабельным
Приложение А
Main.kt
import model.factory.FactoryType
import model.structure.BinaryTreeArray
import model.usertype.prototype.ProtoType
import view.GUI
fun main(args: Array
// Здесь выполняются все операции одним потоком
val factoryType = FactoryType()
var protoType: ProtoType
var btsArray: BinaryTreeArray
// СД для ТД Integer
println("--------------TEST FOR INTEGER-------------")
protoType = factoryType.getBuilderByName("Integer")
btsArray = BinaryTreeArray(protoType.getTypeComparator())
btsArray.addValue(protoType.create())
btsArray.addValue(protoType.create())
btsArray.addValue(protoType.create())
btsArray.addValue(protoType.create())
btsArray.addValue(protoType.create())
btsArray.addValue(protoType.create())
btsArray.addValue(protoType.create())
println("---------PRINT TREE---------")
btsArray.printTree()
println("---------PRINT ARRAY--------")
btsArray.printArray()
println("\n----GET VALUE BY INDEX 2----")
println("value = " + btsArray.getDataAtIndex(2).toString())
println("---DELETE VALUE BY INDEX 2--")
btsArray.removeNodeByIndex(2)
btsArray.printTree()
println("-----SAVE IN BINARY FILE----")
btsArray.save()
println("-----------BALANCE----------")
btsArray = btsArray.balance()
btsArray.printTree()
println("---LOAD FROM BINARY FILE----")
btsArray = btsArray.load()
btsArray.printTree()
println("---------FOR EACH-----------")
btsArray.forEach { println(it) }
// СД для ТД DateTime
println("----------TEST FOR DATETIME-----------")
protoType = factoryType.getBuilderByName("DateTime")
btsArray = BinaryTreeArray(protoType.getTypeComparator())
btsArray.addValue(protoType.create())
btsArray.addValue(protoType.create())
btsArray.addValue(protoType.create())
btsArray.addValue(protoType.create())
btsArray.addValue(protoType.create())
btsArray.addValue(protoType.create())
btsArray.addValue(protoType.create())
println("---------PRINT TREE---------")
btsArray.printTree()
println("---------PRINT ARRAY--------")
btsArray.printArray()
println("\n----GET VALUE BY INDEX 2----")
println("value = " + btsArray.getDataAtIndex(2).toString())
println("---DELETE VALUE BY INDEX 2--")
btsArray.removeNodeByIndex(2)
btsArray.printTree()
println("-----SAVE IN BINARY FILE----")
btsArray.save()
println("-----------BALANCE----------")
btsArray = btsArray.balance()
btsArray.printTree()
println("---LOAD FROM BINARY FILE----")
btsArray = btsArray.load()
btsArray.printTree()
println("---------FOR EACH-----------")
btsArray.forEach { println(it) }
// GUI
val gui = GUI()
gui.showGui()
}