如何在 Java 上定义白名单方法以便能够返回特定"类型"的白名单?



我现在面临着一个很难决定的情况(在我的脑海中(,当我设计算法来过滤和检查某个东西,比如CallCenter,有某个电话号码或某个区域的允许列表,并返回CallCenter应用于它们的特定类型的允许列表时。它是电话号码的allowlist,还是某个区域的allowllist,甚至是区域和电话(特定目标(的组合。

顺便说一句,在我的设计中,呼叫中心将只有一种类型的Allowlist("byPhone"、"byArea"或"byAreaAndPhone"(我有这样的方法:

//// I use call center one to many relationship to allowlist directly to get the allowlists
private void validateWhitelistOfCallCenter(CallCenter callCenter, String phoneNumber, String areaName) {
if (callCenter.getAllowlists().isEmpty()) return;
String typeAllowlist
for (CallCenterAllowlist allowlist : callCenter.getAllowlists()) {
typeAllowlist = allowlist.getType();
if (ALLOWLIST_BY_PHONE_NUMBER.equals(allowlist.getType())
&& allowlist.getCustomerPhoneNumber().equals(phoneNumber)) return;
if (ALLOWLIST_BY_AREA.equals(allowlist.getType())
&& allowlist.getAreaName().equals(areaName)) return;
if (ALLOWLIST_BY_PHONE_NUMBER_AND_AREA.equals(allowlist.getType())
&& allowlist.getAreaName().equals(areaName)
&& allowlist.getCustomerPhoneNumber().equals(phoneNumber)) return;
}
if (ALLOWLIST_BY_PHONE_NUMBER.equals(errorType))
throw CallCenterErrors.customerPhoneIsNotInAllowlist(phoneNumber);
if (ALLOWLIST_BY_AREA.equals(errorType),
throw CallCenterErrors.customerAreaIsNotInAllowlist(areaName);
if (ALLOWLIST_BY_PHONE_NUMBER_AND_AREA.equals(errorType),
throw CallCenterErrors.customerAreaAndPhoneIsNotInAllowlist(phoneNumber, areaName);
}
/// note: each return means the customer is in allowlist or the callcenter doesn't use any allowlist kind of things

然后,在我的脑海中,我已经觉得当开发变得更大时会很奇怪,比如说callcenter allowlist会有更多类型的allowlist,那么最后一个方法执行中的if也会缩放,循环中的if语句也会缩放。有人能帮我决定在我制作的过程中进行验证是否足够好,或者我应该将验证分离为每种类型的allowlist上的一对一验证吗?。起初,我决定不分离函数,因为CallCenter只包含一种类型的allowlist,但无论allowlist中的类型条件如何,错误返回都会检查该类型。

**注意:顺便说一句,我已经为这种情况设计了一个阻止列表,阻止列表有相反的方法,可以更容易地应用错误规范,因为每当在循环中发现错误时,都会抛出错误,这意味着错误类型与我发现的与规范相同的确切元素相同(如byPhone或byArea(

这种类型的事情可以通过将"可以被列入白名单的事情"one_answers"白名单类型"封装到它们自己的类中来完全处理。

创建一个表示"白名单所针对的内容"的接口意味着您可以将此回合传递给所有实现。只要可以访问类型所需的所有内容,它就不需要关心您以后是否向其添加更多详细信息:

public interface WhitelistContext {
AreaName getAreaName();
PhoneNumber getPhoneNumber();
}

然后,您可以让您的WhitelistType成为另一个接受这些WhitelistContexts之一的接口。

public interface WhitelistType {
public void validate(WhitelistContext context) throws ValidationException;
}

然后让每个WhitelistType类负责自己的验证:

public class AreaWhitelistType implements WhitelistType {
@Override
public void validate(final WhitelistContext context) {
AreaName area = context.getAreaName();
// Do whatever else you need here...
}
}

这样,如果您在WhitelistContext中添加更多元素,它不会影响任何现有的WhitelistType,您的方法不需要不断增加的参数列表,并且不需要一个涵盖所有类型的if (...) else块,您可以循环通过,将WhitelistContext传递给每个类型,并让担心这一点。

为了处理不同的CallCenter,您可以将其作为参数添加到WhitelistType接口中,这样它就可以从中获取详细信息,或者让该类实现的构造函数使用一个并知道如何使用它。

最新更新