Демо работы: asciicinema
Эта программа состоит из трёх проектов:
Projecto
— библиотека классов, которая содержит задачи, проекты и пользователей. Очень хорошо документирована.Projecto.Tui
— консольное приложение для работы со всем вышеперечисленным. Документирована хорошо, но сильно зависит от Thuja.Thuja
— библиотека, которая позволяет делать красивые консольные приложения. Документация есть, но разобраться может быть тяжело. К каждому проекту приложен README.md, в котором поверхностно описывается, как вообще код устроен и как оно работает.
Просматривать код рекомендую именно в таком порядке, причём желательно не забывать про README к каждому проекту.
Thuja — большой и обширный проект. Я приложил некоторые усилия, чтобы его документировать, но боюсь, что этого совершенно недостаточно. В целом, его можно рассматривать как какой-нибудь NuGet проект, что-то вроде вроде WinForms (но поменьше, конечно). Очень рекомендую прочитать его README, я надеюсь, что оно сильно поможет.
Проект написан под .NET5 и с использованием C#9. Использовались некоторые новые фичи языка, о которых я на всякий случай здесь напишу:
if (somevar is {} notNull) ...
идентичноif (somevar != null) { var notNull = somevar; ... }
public bool Property { get; init; }
— позволяет устанавливать свойство только в конструкторе или при создании класса таким образом:
var foo = new MyClass(...) {
Property = true, // Можно.
};
foo.Property = false; // Нельзя.
protected internal Dictionary<(int, bool), List<MyClass<int>>> myCrazyField = new()
— идентичноprotected internal Dictionary<(int, bool), List<MyClass<int>>> myCrazyField = new Dictionary<(int, bool), List<MyClass<int>>>()
. Здорово, правда?
Ну и как всегда активно использовались nullable-аннотации, так что если видите public List<int>? myField;
, то это означает, что поле может быть null. А если вопросительного знака нет, то там точно есть какой-нибудь список.
Для удобства отладки, в некоторых местах стоят явные вызовы подключенного отладчика, которые приостанавливают работу программы. На это корректно никак не реагировать, а просто продолжить работу. А ещё лучше, просто запустить вовсе программу без отладки (Ctrl+F5).