Правильно спроектировать приложение для редактирования кода
Я работаю над личным проектом, который по сути является редактором кода. Представьте себе стандартное меню Файл с пунктами меню Новый, Открыть, Сохранить, Сохранить как, Сохранить все, Закрыть, Закрыть все.
Я застрял с правильным дизайном. В настоящее время у меня есть:
- Класс Document, представляющий документ - элемент управления для редактирования кода, соответствующую вкладку на панели вкладок и различные свойства, такие как заголовок, имя файла, IsModified и т. Д.
- Класс Documents, который представляет все открытые документы. Содержит такие методы, как New, Open(FileName), ...
Проблема в том, что я не могу понять, какая команда класса / меню отвечает за какие задачи.
Например, с File->New команда меню проста - вызвать Documents.New и все.
Но что за File->Open? Метод Documents.Open ожидает имя файла в качестве параметра. Поэтому перед вызовом этого метода мне нужно открыть диалоговое окно выбора файла, позволить пользователю выбирать файлы и для каждого файла вызывать Documents.Open(FileName). Где лучше всего разместить этот вспомогательный код в команде меню, переписать Documents.Open и поместить его туда?
То же самое с Сохранить действия. Кто отвечает за сохранение? Это класс Documents, который использует Document.Editor.SaveToFile(FileName) или лучше создать метод Save в классе Document? Где-то посередине также нужно спросить пользователя, хочет ли он сохранить текущий документ...
Я застрял. Есть идеи?
Отредактировано: язык программирования Delphi.
2 ответа
ИМХО, вы добавляете слишком много обязанностей в ваш класс документов. Единственная обязанность класса Documents должна заключаться в том, чтобы поддерживать коллекцию Documents с некоторой связанной функцией (например, обрабатывать несколько экземпляров одного и того же документа, проверять, все ли документы закрыты, считать детей и т. Д.)
Открытие документа или даже создание нового документа (например, что делать, если вам нужно выбрать формат) - это отдельные операции, которые в конечном итоге приводят к новому документу, который затем добавляется в класс Documents. По моему мнению, вам даже не следует взаимодействовать с классом Documents до тех пор, пока вы не будете готовы передать объект Document.
Я надеюсь, что у вас есть некоторый класс для представления пользовательского интерфейса и для взаимодействия с пользователем, чтобы получить всю информацию, необходимую для создания или открытия файла. Вы должны справиться со всем оттуда. В противном случае вы портите свою модель с помощью пользовательского интерфейса.
Вам нужен объект Singleton (DocumentManager), который управляет всеми операциями с документами. Это будет иметь такие функции, как:
- Получить (список_идентификаторы)
- GetNew
- Сохранить (списке документов)
- обновление
- так далее...