[英]How to define Whitelist approach on Java to be able to return specific 'Type' of whitelist?
伙計們。 我現在正面臨一個難以決定的情況(在我的腦海中),當我設計我的算法來過濾和檢查某個事物時,比如 CallCenter,有一個針對某個電話號碼或某個區域的白名單並返回特定類型的白名單CallCenter 應用在他們身上。 它是電話號碼的白名單,還是某些區域,甚至是區域和電話的組合(特定目標)。
順便說一句,在我的設計中,呼叫中心將只有一種類型的白名單(“byPhone”、“byArea”或“byAreaAndPhone”)我有這樣的方法:
//// I use call center one to many relationship to whitelist directly to get the whitelists
private void validateWhitelistOfCallCenter(CallCenter callCenter, String phoneNumber, String areaName) {
if (callCenter.getWhitelists().isEmpty()) return;
String typeWhitelist
for (CallCenterWhitelist whitelist : callCenter.getWhitelists()) {
typeWhitelist = whitelist.getType();
if (WHITELIST_BY_PHONE_NUMBER.equals(whitelist.getType())
&& whitelist.getCustomerPhoneNumber().equals(phoneNumber)) return;
if (WHITELIST_BY_AREA.equals(whitelist.getType())
&& whitelist.getAreaName().equals(areaName)) return;
if (WHITELIST_BY_PHONE_NUMBER_AND_AREA.equals(whitelist.getType())
&& whitelist.getAreaName().equals(areaName)
&& whitelist.getCustomerPhoneNumber().equals(phoneNumber)) return;
}
if (WHITELIST_BY_PHONE_NUMBER.equals(errorType))
throw CallCenterErrors.customerPhoneIsNotInWhitelist(phoneNumber);
if (WHITELIST_BY_AREA.equals(errorType),
throw CallCenterErrors.customerAreaIsNotInWhitelist(areaName);
if (WHITELIST_BY_PHONE_NUMBER_AND_AREA.equals(errorType),
throw CallCenterErrors.customerAreaAndPhoneIsNotInWhitelist(phoneNumber, areaName);
}
/// note: each return means the customer is in whitelist or the callcenter doesn't use anywhitelist kind of things
然后,在我的腦海中,我已經覺得當開發變得更大時會很奇怪,比如說呼叫中心白名單會有更多類型的白名單,那么最后一個方法執行的 if 也會被縮放,循環內的 if 語句也會被縮放也。 任何人都可以幫助我決定在我制作它時是否足夠好,或者我應該將驗證分開以成為每種類型白名單上的一對一驗證? 起初我決定不分離 function 因為 CallCenter 將只包含一種類型的白名單,但無論白名單中的類型條件如何,錯誤返回都會始終檢查類型。
**注意:順便說一句,我已經為這種情況設計了一個黑名單,黑名單有相反的方法,可以更容易地應用錯誤規范,因為每當在循環中發現的東西拋出錯誤,這意味着錯誤類型與確切的元素相同我發現與規范相同(如 byPhone 或 byArea)。
這種類型的東西可以通過將“可以被列入白名單的東西”和“白名單類型”封裝到它們自己的類中來完全處理。
創建一個代表“白名單對象”的接口意味着您可以將這一輪傳遞給所有實現。 只要它可以訪問該類型所需的所有內容,它就不需要關心您以后是否向其添加更多詳細信息:
public interface WhitelistContext {
AreaName getAreaName();
PhoneNumber getPhoneNumber();
}
然后,您可以讓您的WhitelistType
成為另一個接受這些WhitelistContext
之一的接口。
public interface WhitelistType {
public void validate(WhitelistContext context) throws ValidationException;
}
然后讓每個WhitelistType
class 負責自己的驗證:
public class AreaWhitelistType implements WhitelistType {
@Override
public void validate(final WhitelistContext context) {
AreaName area = context.getAreaName();
// Do whatever else you need here...
}
}
這樣,如果您向WhitelistContext
添加更多元素,它不會影響任何現有的WhitelistType
,您不需要在方法中添加不斷增長的 arguments 列表,而不是使用if (...) else
塊覆蓋所有類型,您可以循環遍歷,將WhitelistContext
傳遞給每個類型並讓它擔心。
為了處理不同的CallCenter
,您可以將其作為參數添加到WhitelistType
接口,以便它可以從那里獲取詳細信息,或者讓 class 的實現的構造函數獲取一個並知道如何使用它。 無論哪種方式都會很好恕我直言。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.