我創建一個動態查詢生成器發送到另一個組件(報表生成器)。
查詢的某些部分有佔位符。例如:
SELECT DISTINCT ID, NAME AS VALUE FROM EVENTS
WHERE {{ESTABLISHMENTFILTER.ID}} IS NULL OR ESTABLISHMENT_ID = {{ESTABLISHMENTFILTER.ID}}
的數據,以在where子句可以是整數,字符串,日期,被取代,每一個都有一個不同的行爲(例如:包括在字符串周圍的值單引號案件)。
我的第一個方法是創建一個枚舉:
public enum FilterType
{
Integer,
String
}
,並使用它像這樣(在例如業務層)
switch (filter.Type)
{
case FilterType.Integer:
//Do replace logic for an integer
break;
case FilterType.String:
//Do replace logic for a string
break;
default:
break;
}
我也申請SOLID原則,以我的代碼,我發現這可能會破壞OCP。所以我重構使用一個基類
public abstract class FilterType
{
public abstract string Replace(string baseString, string oldValue, string newValue);
}
每種類型都有其自己的實現:
public class FilterTypeInteger : FilterType
{
public override string Replace(string baseString,string oldValue, string newValue)
{
//Do logic to replace for an Integer type
}
}
問題
固溶工作了我的測試,但在生產代碼數據庫中有一個int列來確定類型。所以我基本上把'switch-case'邏輯轉移到數據層,它將不得不檢查這個列來實例化正確的FilterType(下面的代碼是一個僞代碼,因爲我還沒有實現它):
if (dataReader["FILTERTYPE"] == 1)
filter.Type = new FilterTypeInteger();
else if (dataReader["FILTERTYPE"] == 2)
filter.Type = new FilterTypeString();
的課題
1)實施上述的 '的if-else' 邏輯被打破了OCP的方法?因爲如果創建一個新的類型,則必須實現一個新的else子句
2)是否有另一種方法將SOLID OCP原則保留在數據庫和業務代碼中,而不使用開關或if-else子句?
如果您正在構建SQL語句,爲什麼不使用庫和準備好的語句來爲您處理這些事情? – Seth
查詢是通過現有的用戶界面創建的,因此它必須支持在模板中定義的佔位符。它也必須支持級聯查詢這就是爲什麼我決定構建自己的組件。 –