Есть ли шаблон проектирования, который изолирует «методы» от члена? - PullRequest
1 голос
/ 15 декабря 2009

В принципе, я хочу что-то вроде: class DataProcessor { }; * * Тысяча одна

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

Я хотел отделить членов от методов:

class DataProcessorCore{};
class DataProcessor : public DataProcessorCore    {};

Это обычный способ сделать эту работу? или есть какие-то модели, в которые я могу вписать свои идеи?

Большое спасибо

Ответы [ 8 ]

7 голосов
/ 15 декабря 2009

Я не уверен, что это шаблон, я просто использовал бы интерфейс.

class DataProcessorCore {
   public virtual void doProcessing() = 0;

   // Any other virtual methods, but no implementation
};

class DataProcessor : public DataProcessorCore {
   // implement the methods
};

Теперь все, что просто нуждается в функциональности DataProcessor, должно использовать класс интерфейса вместо конкретного класса. Если я вас правильно понимаю, то это позволяет отделить методы от методов.

1 голос
/ 15 декабря 2009

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

Во-вторых, что должна видеть эта функция? Объект с общедоступными переменными-членами? Или только одна с закрытыми переменными-членами и меньше методов доступа / мутатора, чем DataProcessorCore?

Относительно распространенная идиома в C ++ заключается в размещении как можно большего количества методов вне объекта.

Итак, ваше решение может быть примерно таким:

class DataProcessor {
   // Fill in only the basics. Member variables and a small set of "core" functions to access/modify them.
};

void ComplexOperation(DataProcessor& proc) { ...}
float AnotherOperation(DataProcessor& proc, int i) { ...}

А затем полностью исключить DataProcessorCore. Вам это не нужно, потому что у вас есть объект, содержащий данные (и, я бы предположил, небольшой набор основных функций), и все более широкие функциональные возможности могут быть реализованы в виде свободных функций, а не в извлеченном классе.

Стандартная библиотека широко использует эту технику. Подумайте о std::sort, который не является членом отдельных классов контейнеров, но является бесплатной функцией, которую можно вызывать в контейнере.

1 голос
/ 15 декабря 2009

Возможно, вы ищете шаблон стратегии. Это даст вам возможность изменить методы, работающие с вашими данными во время выполнения.

wiki: шаблон стратегии

1 голос
/ 15 декабря 2009

Сначала я подумал, что это вопрос C #, и мне в голову пришли методы расширения, но когда я обнаружил, что это C ++, я попытался найти аналогию, и, как я понимаю, аналогия

Имя, зависящее от аргумента (Кениг) поиск

Справка:

Методы расширения - отполированная функция C ++

0 голосов
/ 15 декабря 2009

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

0 голосов
/ 15 декабря 2009

Я думаю, что мы можем достичь этого, комбинируя шаблоны наследования и абстракции

interface Operations {
  public void printValue();
}

public class Data {

  private String value;

  protected void loadValues() {
   this.value = "somevalue";
  }

  protected String getValue() {
    return this.value;
  }
}

public class DataProvider extends Data implements Operations {
  public Operate() {
    super.load();
  }

  public void printValue() {
    System.out.println("Value is "+getValue());
  }
}

public class Consumer {
  public static void main() {
    Operations operate = (Operations) new DataProvider();
    operate.printValue();
  }
}
0 голосов
/ 15 декабря 2009

Я не уверен, что точно понял, что вы хотите, но, возможно, вам стоит взглянуть на шаблон Decorator.

Шаблон Decorator придает дополнительная функциональность к объекту динамически. Декораторы обеспечивают гибкая альтернатива подклассам для расширения функциональности.

Wiki: Шаблон декоратора

0 голосов
/ 15 декабря 2009

Интерфейс, который предлагает только геттеры ()?

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