Правильно спроектировать приложение для редактирования кода

Я работаю над личным проектом, который по сути является редактором кода. Представьте себе стандартное меню Файл с пунктами меню Новый, Открыть, Сохранить, Сохранить как, Сохранить все, Закрыть, Закрыть все.

Я застрял с правильным дизайном. В настоящее время у меня есть:

  • Класс 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
  • Сохранить (списке документов)
  • обновление
  • так далее...
Другие вопросы по тегам