2014-12-02 2 views
3

Предполагая, что у меня есть некоторая структура данных для работы (например, изображений), которые я хочу предварительно и постобработка по-разному, чтобы облегчить дальнейшие шаги обработки. Каков наилучший способ реализовать эту ответственность с помощью языка ООП, такого как C++?Дизайн кода: Кто отвечает за изменение данных объекта?

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

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

Может ли кто-то описать общую структуру хорошего и неудачного способа реализовать sth, как это?

ответ

0

Чтобы убедиться, что я понимаю, что вы просите, вот мои предположения основаны на моем чтении вопрос:

  1. Данные своего рода двоичный формат (предположительно изображение, но как вы говорите, может быть любым), которое может быть представлено в виде массива байтов
  2. Существует несколько этапов обработки (я буду называть их как преобразования), которые могут быть применены к данным
  3. Некоторые преобразования зависят от других, например, вы хотели бы избежать применения преобразования, если его предпосылка не была применена. Вы бы хотели, чтобы он был надежным, чтобы было обнаружено и предотвращено попытку применить незаконное преобразование.

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

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

Таким образом, вы можете определить следующее (простите мой Java-подобный стиль именования, это было давно, так как я сделал C++):

  1. Перечисляемый тип называется TransformationType
  2. Абстрактный класс называется Трансформатор, со следующими методами:
    • метод называется «GetType», который возвращает TransformationType
    • метод, называемый «canTransform», который принимает список TransformationType и возвращает логическое значение. В списке указаны преобразования, которые уже были применены к данным, а логическое значение указывает, нормально ли выполнять это преобразование.
    • метод, называемый «преобразования», который принимает массив байтов и возвращает массив (предположительно модифицированный) байт
  3. класс под названием BinaryData, содержащий массив байтов и список TransformationType. Этот класс реализует метод «void transform (Transformer t)», чтобы сделать следующее:
    • Запросить метод трансформатора «canTransform», передав список типов преобразований; либо выбросить исключение или вернуть canTransform возвращает ложь
    • Заменить он байтовый массив с результатами вызова t.transform (данные)
    • Добавить тип в трансформаторном к списку

Я думаю, что это выполняет то, что вы хотите - алгоритмы преобразования изображений определяются полиморфно в классах, но фактическое применение преобразований все еще «контролируется» объектом данных. Следовательно, нам не нужно доверять внешнему коду, чтобы делать правильные действия, устанавливая/проверяя флаги и т. Д.

Смежные вопросы