Как конфертировать из условных операторов в OCP (Open Closed Principle) в SOLID? - PullRequest
0 голосов
/ 10 октября 2019

У меня есть код, который выполняет различные проверки базы данных на основе переданного строкового значения. Я могу решить это с помощью нескольких условных операторов (если и еще), и я точно знаю, что это нарушает принцип OCP в Solid, потому что он открыт для модификации. Я думал о способах подойти к этому, но это только усложняет кодовую базу. (Простота является ключевым фактором)

Каков наилучший способ сделать это?

В настоящее время я пытался создать интерфейс, который реализовали классы, но я не могу оценить его на основе переданного значения, посколькуон выполняет все классы, которые реализуют интерфейс

Пример, если переданы такие строки, как «cook», «bake», «sleep» и «fight». Я не хочу писать: if (action == 'cook'), тогда DO это или if (action == 'bake'), тогда DO это или if (action == 'sleep'), тогда DO это или if (action== 'fight'), тогда ДЕЛАЙТЕ это

Скорее, я создал интерфейс

public interface Iaction{
  public bool Act();
}

//then create various classes that  implemented the interface
public class Sleep: Iaction{

public bool Act(){
.....
  }
}

public class Cook: Iaction{

public bool Act(){
.....
  }
}

public class Bake: Iaction{

public bool Act(){
.....
  }
}

public class Fight: Iaction{

public bool Act(){
.....
  }
}

Основная проблема возникает, если переданное действие - готовить. Я хочу только выполнить метод повара. Iaction.Act ();выполняет все классы, которые реализовали интерфейс.

public IHttpActionResult ThingToDo(string action){

if(string.IsnullOrEmpty(action) == false){
bool response = Iaction.Act();
  }
....
....
...
}

Есть ли способ добиться этого с помощью OCP в Solid Principle?

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

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


public static IAction ResolveAction(string actionName)
{
   ///logic here
}

Тогда ваш код реализации будет выглядеть примерно так:

IAction actionToExecute = ActionFactory.ResolveAction(actionName);
actionToExecute.Act();

Чтобы избежать переключения или операторов if в этой функции, либо:

  1. Используйте отражение, чтобы загрузить соответствующий класс, который реализует IAction, по требованию. Вам нужно было бы назвать классы соответствующим образом, чтобы сделать это с помощью соглашения .. то есть "cook" сопоставляется с CookAction и т. Д.

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

1 голос
/ 10 октября 2019

Я предлагаю вам решить эту ситуацию, заменив условную логику шаблоном «Стратегия».

Поиск «Замените условную логику стратегией» книгу Мартина Фаулера и прочитайте «Рефакторинг к шаблонам»: Упрощение " от Джошуа Кериевского

OCP гарантируется тем, что вы добавляете стратегии и не меняете код (самое большее, измените фабрику, которая определяет применяемую стратегию)

uml: uml

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