Я работаю над реализацией таблиц в приложении Qt, но у меня возникли некоторые проблемы с правильным дизайном.
У меня есть два класса, Table
и Cell
.
Cell
имеет API для установки свойств ячейки, таких как границы и отступы, и получения строки и столбца ячейки с использованием int Cell::row()
и int Cell::column()
. Это явно совместно используемый класс, использующий QExplicitlySharedDataPointer для своих данных. Он также имеет isValid()
API для запроса, действительна ли ячейка или нет.
Table
имеет API для вставки / удаления строк и столбцов и объединения областей ячеек. Cell
может быть получен из таблицы с использованием Table::cellAt(int row, int column)
. Ряды клеток хранятся как QList<QList<Cell>>
. При удалении строк и столбцов удаленные ячейки помечаются таблицей как недействительные, что делает вызовы Cell::isValid
в любых ранее возвращенных ячейках из удаленных строк / столбцов, возвращая значение false.
Теперь самое сложное: поскольку вычисление номера строки и столбца ячейки, если вы еще не получили их, является дорогостоящей операцией, методы Table::cellAt(int row, int column)
явно задают строку / столбец в Cell
перед возвратом. это и Cell
сохраняет их как простые int
члены. Это означает, что Cell
может ответить быстро при запросе его строки / столбца.
Но тут возникает проблема; Это также означает, что значения Cell::row()
и Cell::column
будут неправильными, если строки или столбцы будут удалены / вставлены перед строкой / столбцом, в котором находится ячейка.
Я не могу пометить поврежденные ячейки как недействительные так же, как и я, когда фактическая строка / столбец, частью которого они являются, удалены. Позже кто-то может снова получить ячейку с cellAt(int, int)
в этой строке / столбце. И эта ячейка не должна быть недействительной.
У кого-нибудь есть советы по улучшению дизайна здесь?