我有一個功能如下。ConditionFunc_A、B、C、D 等內部(最多 10 個條件)正在從資料庫中獲取資料以檢查驗證。誰能幫我確定設計模式或重構程序。
public void InsertTransaction(){
if(ConditionFunc_A())
InsertToPayment();
if(ConditionFunc_B())
InsertToSuspendedAccount();
if(ConditionFunc_C())
InsertToPayment();
if(ConditionFunc_D())
InsertToSuspendedAccount();
// There are around 10 ConditionFunctions }
uj5u.com熱心網友回復:
你可以把這些組
if(ConditionFunc_A())
InsertToPayment();
分成不同的功能。喜歡
function TryToInsertToPayment() {
if(ConditionFunc_A()) {
InsertToPayment();
}
}
然后你的主要功能看起來像
TryToInsertToPayment();
TryToInsertToSuspendedAccount();
// All other inserts
順便說一句,在我看來,條件是排他性的——所以如果Condition_A是true,那么所有其他條件都應該是false。InsertToPayment否則,對于不同的條件,您將不會有兩個。這是對的嗎?
在這種情況下,它會更好地作業 - 只需將多個條件合并為一個if。
function TryToInsertToPayment() {
if(ConditionFunc_A() || ConditionFunc_C() || ConditionFunc_E()) {
InsertToPayment();
}
}
并且 main 函式將只包含幾個呼叫 - 每個物件一個。
uj5u.com熱心網友回復:
設計是品味問題(至少在某種程度上)。
如果您只在您描述的一個地方有這種模式,我認為也許像您所做的那樣的一系列ifs 可能是要走的路。
但是-據我了解,您要求提供替代方案,因此您可以在下面看到一個。
正如我在上面的評論中提到的,您可以將條件 活動對放在陣列或串列中。當您有這些條件和活動的不同組合時(特別是如果它們可以動態更改),這可能很有用。
namespace ConsoleApp1
{
public delegate bool VoidToBool();
public delegate void VoidToVoid();
struct MyAction
{
public MyAction(VoidToBool cond, VoidToVoid activity) { Cnd = cond; Act = activity; }
public VoidToBool Cnd { get; set; }
public VoidToVoid Act { get; set; }
};
class Program
{
static bool ConditionFunc_A() { /*...*/ return true; }
static bool ConditionFunc_B() { /*...*/ return true; }
static bool ConditionFunc_C() { /*...*/ return true; }
static bool ConditionFunc_D() { /*...*/ return true; }
static void InsertToPayment() { /*...*/ }
static void InsertToSuspendedAccount() { /*...*/ }
static void Main(string[] args)
{
MyAction[] actions = new MyAction[] { new MyAction(ConditionFunc_A, InsertToPayment),
new MyAction(ConditionFunc_B, InsertToSuspendedAccount),
new MyAction(ConditionFunc_C, InsertToPayment),
new MyAction(ConditionFunc_D, InsertToSuspendedAccount) };
foreach (var action in actions)
{
if (action.Cnd()) {
action.Act();
// break; // NOTE: enable this line if you want to stop once the first condition was met.
}
}
}
}
}
uj5u.com熱心網友回復:
public class Rule
{
private readonly Func<bool> _canApply;
private readonly Action _applyAction;
public Rule(Func<bool> canApply, Action applyAction) => (_canApply, _applyAction) = (canApply, applyAction);
public bool CanApply() => _canApply();
public void Apply() => _applyAction();
}
public class TransactionManager
{
private readonly List<Rule> _insertionRules;
public TransactionManager() => _insertionRules = new()
{
new (ConditionFunc_A, InsertToPayment),
new (ConditionFunc_B, InsertToSuspendedAccount),
//...
};
public void AddInsertionRule(Rule rule) => _insertionRules.Add(rule);
public void InsertTransaction()
{
foreach (var rule in _insertionRules)
if (rule.CanApply())
rule.Apply();
}
private bool ConditionFunc_A() => true;
private bool ConditionFunc_B() => true;
private void InsertToPayment() { }
private void InsertToSuspendedAccount() { }
}
注意公共方法 AddInsertionRule 不違反開閉原則(即您可以(從外部)添加規則而不修改 TransactionManager)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/486178.html
