Наличие более чем одного «приложения», доступного в одной базовой форме - PullRequest
0 голосов
/ 21 мая 2009

У меня есть два совершенно разных приложения для настройки двух единиц оборудования, продаваемых этой компанией.

Меня попросили соединить два приложения, чтобы к ним можно было обращаться из одной и той же программы таким образом, чтобы оба были доступны. По аналогии с этой идеей можно открыть программу, выбрать файл для открытия, а затем открыть редактор документов или редактор электронных таблиц в зависимости от типа файла.

Это не особенно сложно для большинства аспектов приложения, но моя проблема в основном связана с главной панелью инструментов для консолидированного приложения. Каждое из двух различных приложений имеет свой собственный набор функций, относящихся к общему набору кнопок, а также свой собственный набор кнопок.

Я мог бы разделить ответы кнопок в коде проверкой типов, т.е.

If documentOpened.isSpreadsheet
  spreadSheetFunction()
Else
  documentFunction()

но мне это кажется беспорядочным, объединяя функции двух классов в один раздутый интерфейсный класс.

Есть ли какой-нибудь способ добиться большей степени инкапсуляции, если учесть, что два интерфейса настолько различны?

Ответы [ 2 ]

1 голос
/ 21 мая 2009

На ум приходит шаблон проектирования Visitor (хотя, вероятно, он не применим в самом строгом смысле). Если вы определили интерфейс, который включает в себя все кнопки на панели инструментов, а затем реализовали класс для каждого типа документа, который будет работать нормально, как предлагает Даниэль. Код структуры будет

public interface IToolbarHandler {
  void ButtonOne;
  void ButtonTwo;
  //etc
}

public class SpreadsheetToolbarHandler : IToolbarHandler {
   public void ButtonOne {
      //Do Some action
   }
   public void ButtonTwo {
      //Do Some action
   }
}

public class DocumentToolbarHandler : IToolbarHandler {
   public void ButtonOne {
      //Do Some action
   }
   public void ButtonTwo {
      //Do Some action
   }
}

Затем просто создайте переменную уровня формы, которая имеет тип IToolbarHandler, и установите экземпляр соответствующего обработчика для документа, который просматривается в данный момент. Затем ваши обработчики событий панели инструментов просто вызывают соответствующий метод этой переменной.

1 голос
/ 21 мая 2009

Я не знаю .Net, так что это общий совет объектно-ориентированного программирования. Тем не менее, вы выглядите так, будто задаете общий вопрос о дизайне ОО.

Похоже, вы пытаетесь сделать двойная отправка ; то есть выберите фактический код, который будет выполнен на основе типа времени выполнения двух разных вещей.

Традиционный способ очистки с помощью OO для двойной отправки - шаблон посетителя . Не дайте себя одурачить ни именем, ни примерами, описывающими шаблон для обхода какой-то сдерживающей структуры; это также очень полезно, даже если у вас есть только один объект за раз!

По сути, вы должны определить некоторый интерфейс - CommonButtonHandler - и затем реализовать его как для электронных таблиц, так и для документов. Когда нажимается общая кнопка «тиддл», вы делаете:

// Inside CommonTwiddleButton.onClick()
currentCommonButtonHandler.twiddleButtonClicked()

В Интернете есть несколько хороших примеров использования шаблона посетителя для двойной отправки; просто убедитесь, что ищите оба термина, иначе вы получите либо несколько примеров шаблонов посетителей, которые предполагают, что вам нужно пройти какую-то гетерогенную коллекцию, либо кучу лишних слов, хвастающихся тем, что их объектная система просто выполняет множественную диспетчеризацию. по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...