Большие Операторы переключения: Плохое ООП?

  1. strlen возвращает только количество символов. Освободите место для конечного нуля *(newArray + i) = (char*)malloc(sizeof(char)*(strlen(*(original + i))) +1);
  2. Лучше strncpy вместо strcpy

  3. Как можно продвинуться *size в [ 115]: *(newArray + (*size)) = (char*)malloc(sizeof(char)*strlen(number)); Вы можете идти только *size -1 вперед, поскольку он начинается с нуля.

  4. В цикле for, кажется, вы забыли добавить звездочку * for (int i = 0; i < size; i++)

75
задан Nifle 16 April 2011 в 16:19
поделиться

12 ответов

Можно вытащить некоторое преимущество из Шаблон "команда" .

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

, Если бы системой не является ООП, то я не добавил бы ООП только для этого..., можно легко использовать Шаблон "команда" с простым поиском по словарю и указателями функции или даже динамично сгенерированными вызовами функции на основе названия команды, в зависимости от языка. Затем можно просто сгруппировать логически присоединенные функции в библиотеки, которые представляют набор подобных команд для достижения управляемого разделения. Я не знаю, существует ли хороший термин для этого вида реализации... Я всегда думаю о нем как о стиле "диспетчера", на основе MVC-подхода к обработке URL.

34
ответ дан nezroy 24 November 2019 в 11:43
поделиться

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

0
ответ дан cyclo 24 November 2019 в 11:43
поделиться

Лучший способ решить эту конкретную проблему: сериализация и протоколы чисто должны использовать IDL и сгенерировать код маршалинга с операторами переключения. Поскольку безотносительно шаблонов (опытная фабрика, шаблон "команда" и т.д.), который Вы пытаетесь использовать иначе, необходимо будет инициализировать отображение между идентификатором/строкой команды и классом/указателем функции, так или иначе и это 'll работает медленнее, чем операторы переключения, так как компилятор может использовать идеальный поиск хеша для операторов переключения.

0
ответ дан ididak 24 November 2019 в 11:43
поделиться

Можно использовать словарь (или хешировать карту, если Вы кодируете в Java) (это назвало табличную разработку Steve McConnell).

1
ответ дан Peter Mortensen 24 November 2019 в 11:43
поделиться

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

0
ответ дан Otávio Décio 24 November 2019 в 11:43
поделиться

Вы могли также проявить подход языка здесь и определить команды со связанными данными в грамматике. Можно затем использовать инструмент генератора для парсинга языка. Я использовал Ирония с этой целью. Кроме того, можно использовать шаблон Интерпретатора.

, По-моему, цель не состоит в том, чтобы создать самую чистую модель OO, но создать гибкую, расширяемую, удобную в сопровождении и мощную систему.

0
ответ дан Rine 24 November 2019 в 11:43
поделиться

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

  1. Это нарушает OCP - Вы могли непрерывно поддерживать большую функцию.
  2. у Вас могла быть плохая производительность: O (n).

, С другой стороны, реализация Map может соответствовать OCP и могла работать с потенциально O (1).

2
ответ дан quamrana 24 November 2019 в 11:43
поделиться

Я вижу стратегическую модель. Если у меня есть 100 различных стратегий... пусть будет так. Гигантский оператор переключения ужасен. Являются все Команды допустимыми именами классов? Если так, просто используйте названия команды в качестве имен классов и создайте объект стратегии с Активатором. CreateInstance.

2
ответ дан Jason Punyon 24 November 2019 в 11:43
поделиться

Я думаю, что это - один из нескольких случаев, где большие переключатели являются лучшим ответом, если некоторое другое решение не представляет себя.

3
ответ дан Loren Pechtel 24 November 2019 в 11:43
поделиться

команда может быть одной из 100 различных команд

, Если необходимо сделать один из 100 разных вещей, Вы не можете постараться не иметь ответвление с 100 путями. Можно закодировать его в потоке управления (переключатель, if-elseif^100) или в данных (карта с 100 элементами от строки до команды/фабрики/стратегии). Но это будет там.

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

16
ответ дан Jonas Kölker 24 November 2019 в 11:43
поделиться

Я вижу наличие два операторы переключения как признак дизайна неOO, где switch-on-enum-type мог бы быть заменен несколькими типами, которые обеспечивают различные реализации абстрактного интерфейса; например, следующее...

switch (eFoo)
{
case Foo.This:
  eatThis();
  break;
case Foo.That:
  eatThat();
  break;
}

switch (eFoo)
{
case Foo.This:
  drinkThis();
  break;
case Foo.That:
  drinkThat();
  break;
}

... должен, возможно, быть переписан к как...

IAbstract
{
  void eat();
  void drink();
}

class This : IAbstract
{
  void eat() { ... }
  void drink() { ... }
}

class That : IAbstract
{
  void eat() { ... }
  void drink() { ... }
}

Однако один оператор переключения не imo такой сильный индикатор, что оператор переключения должен быть заменен чем-то еще.

24
ответ дан ChrisW 24 November 2019 в 11:43
поделиться

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

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

, Конечно, полностью диспетчер команды OOP (на основе волшебства, такого как отражение или механизмы как Активация Java) более красив, но иногда Вы просто хотите починить вещи и получить сделанную работу ;)

1
ответ дан devio 24 November 2019 в 11:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: