Я был бы беспристрастным шаблону наследования, который заставляет вас выполнять действия в контексте базового унаследованного абстрактного класса. Причина, по которой я считаю это предпочтительнее, заключается в том, что она позволяет вам легко инкапсулировать открытие и закрытие ворот и не выставлять ни условия для этого, ни эту функциональность за пределами унаследованного сценария.
public void Main()
{
var x = new InheritedAction();
}
public abstract class BaseGateAction
{
public void PerformBaseAction(Action actionToPerformWhileGateIsOpen)
{
Open();
actionToPerformWhileGateIsOpen();
Close();
}
private void Open()
{
Console.WriteLine("Gate has been opened");
}
private void Close()
{
Console.WriteLine("Gate has been closed");
}
}
public class InheritedAction : BaseGateAction
{
public InheritedAction()
{
PerformBaseAction(() =>
Console.WriteLine("Attack the dragon while the gate is open"));
PerformBaseAction(() =>
{
Console.WriteLine("Attack the dragon while the gate is open");
Console.WriteLine("The dragon is victorious and you have been devoured");
});
}
}
Этот пример кода выводит следующий за оба метода PerformBaseAction называет соответственно:
Gate has been opened
Attack the dragon while the gate is open
Gate has been closed
Gate has been opened
Attack the dragon while the gate is open
The dragon is victorious and you have been devoured
Gate has been closed
Это позволит не только лучше повторного использования кода, но гораздо более герметизированная логика. Вы всегда можете добавлять дополнительные открытые методы, которые принимают предварительные условия или пост-условия, которые повлияют на то, сможете ли вы открыть ворота.
public abstract class BaseGateAction
{
....
public void PerformBaseActionWithPrecondition(Func<bool> precondition, Action actionToPerformWhileGateIsOpen)
{
if (precondition())
{
PerformBaseAction(actionToPerformWhileGateIsOpen);
}
else
{
Console.WriteLine("The gate could not be opened!");
}
}
...
}
Это можно назвать следующим образом:
PerformBaseActionWithPrecondition<bool>(
() => true == false,
() => Console.WriteLine("Attack!")
);
И выведет:
The gate could not be opened!
Рабочий код вне темы для StackOverflow. Вы можете взглянуть на [Code Review] (http://codereview.stackexchange.com/). –
Все зависит от того, что прокомментировал код.Если есть способ многократно использовать его, то определенно держите единственный метод. Опубликуйте полный код обзора кода, как предлагал @ Pierre-LucPineault. – krillgar
Остерегайтесь, однако, Code Review не разрешает код-заглушку. Вам нужно будет опубликовать весь метод (ы). – Hosch250