在上一篇的邏輯收斂中有提到健康告知的部分,但主要講的邏輯規則還是以是否可以投保為主,健康告知只是剛好在API中有使用到,所以在本篇中就會探討健康告知的部分。
我在撰寫API時,剛好思考健康告知的部分到底是要用正向表列還是負向表列,而且我也和同事討論了這個話題,然後正反兩派的意見都很有道理
支持正向表列的理由 :
1. 因為需求單位的規則是採用正向論述,所以直接依照中文論述翻譯成程式碼來實作
a. 新投保件之被保險人需填寫健康告知書
b. 續保件之本人投保保額若有提高需填寫健康告知書
採用正向表列的實作程式碼如下(收斂前):
public String isNeedHealth(){ // 新投保件之被保險人需填寫健康告知書
if(新投保){
return "需填寫健康告知";
}
else{
// 續保件本人投保保額若有提高需填寫健康告知書
if(保額提高){
return "需填寫健康告知";
}
else{
return "不需填寫健康告知";
}
}}
採用正向表列的實作程式碼如下(收斂後):
public String isNeedHealth(){ // 假設所有的被保險人都不用填寫健康告知書
String result = "不須填寫"; // 新投保件之被保險人需填寫健康告知書
if(新投保){
result = "需填寫";
return result;
}
// 續保件本人投保保額若有提高需填寫健康告知書
if(保額提高){
result = "需填寫";
return result;
}
return result;
}
支持負向表列的理由 :
寧可錯殺一千,不可放過一人 : 有一種情況系統判定此人不需要健康告知,但實際上需要填寫健康告知,但這時候若保單已經成立,要請客戶補健康告知是很困難的事情; 因此主張應該是要假設每個人都要做健康告知,再依序把不需要的條件做排除,如此一來假設該客戶被系統判定為需要填寫健康告知,但實際上是不需要的,也只是多做填寫,不會影響正常保單核保及成立的流程
採用負向表列的實作程式碼如下(收斂前):
public String isNeedHealth(){ // 續保件之被保險人
if(續保件){
// 沒有超過保額
if(保額持平或降低){
return "不需填寫健康告知";
}
else{
return "需填寫健康告知";
}
}
else{
return "需填寫健康告知";
}
}
採用負向表列的實作程式碼如下(收斂後):
public String isNeedHealth(){ // 假設所有的被保險人都需填寫健康告知書
String result = "須填寫"; // 續保件且保額提高之被保險人不需填寫健康告知書
if(續保件 && 保額持平或降低){
result = "不須填寫";
return result;
}
return result;
}
其中我們會發現以下有趣的結論:
1. 到底該使用正向表列還是負向表列,其實沒有一定答案,端看當時情境做考量
2. 就上面案例中,正向和負向收斂後的結果不太一樣,從規律來看,收斂過程其實就是把 ELSE{} 的部分拔掉,裡面 IF(...){} 的部分拉出來到第一層,如此逐層來做同樣規則,就可以得到收斂後的結果,然而你會發現負向(收斂前)的程式碼架構中 IF(續保件){}裡面又有 IF(保額持平或降低){} 區塊,就不能使用以上規則,這樣就是代表「續保件」和「保額」是有前後關聯的條件,因此就必須合併到同一層的 IF(...){} 區塊