首页 新闻 会员 周边

关于业务逻辑的设计以及代码思路

0
悬赏园豆:50 [已关闭问题] 关闭于 2017-06-08 18:18

想了几天希望大神给一些思路
业务很简单:
 比如我一个用户 20岁 考试 100分 需要给出 优良可差
21 岁 考试 120 分 给出 优良可差

90<优  <=100
 80<良<=90
60<差

当然只是思路 并不想写 
if(age>20 && point <100)           
   cw("优");
这样的代码

 

 

 

业务是有扩展的 所以是要搞成配置的
比如 年龄在 15-20之间的 得分90分的 是优
也可能是 男生 20-30之间 得分 80 是优
还有可能 北方人 男生 50-80之间 得分 50 也是优
还有可能...... 如果这样的业务 写 if 是要死人的

喵哈哈的主页 喵哈哈 | 初学一级 | 园豆:146
提问于:2017-04-18 16:14
< >
分享
所有回答(6)
0

最终都是if判断.手法都在if判断怎么组织上

吴瑞祥 | 园豆:29449 (高人七级) | 2017-04-18 16:58
0

我在想..if是避免不了的。如果搞个数据字典去相结合使用或许逻辑看起来会清晰点

Ctrl` | 园豆:3317 (老鸟四级) | 2017-04-18 17:30
0

这种逻辑你就算不用代码描述出来也是很麻烦的吧?所以你这边就算变成代码逻辑也会很麻烦的,所以这个地方不要想能偷懒。

这个地方建议使用职责链模式,规则这些你可以通过配置方式搞出来,每个class的职责只是判断其是否属于当前规则,如果属于则进行处理,反之交给后面的class处理。当然这里if啥的肯定会少很多(基本都是通过对你的配置的解析加个模板方法就可以搞定了),但要处理好职责链的先后顺序,否则还是会出错。

Daniel Cai | 园豆:10424 (专家六级) | 2017-04-18 17:33
0

你这问就是在挖坑,分数60~80的也带上啊,暂且计作“可”吧

分析下问题:

可以勉强用树的角度来看(得把业务判断逻辑捋顺),地方、性别、年龄段、分数区间------》2*2*n*4=16n种输出路径,暂且将年龄段也取3吧。

树的每一层的节点的当前判断都会影响下一层的节点走向:

代码如下,加班敲的,不容易啊》。《

public class RankResult{
    private int age;
    private int grage;
    private string addr;
    private int sex;//0:male;1:female
    private int[] divGradeArr =  [90,80,60];//优良差的分数临界点;
    private int[] divAgeArr = [15,20];//年龄分界点
    public RankResult(){
        this.age = 0;
        this.sex = 0;
        this.grade = 0;
        this.addr = "";
    }
    public RankResult(int age,int grade, string addr,int sex){
        this.age = age;
        this.sex = sex;
        this.grade = grade;
        this.addr = addr;
    }
    //年龄影响判优的分数期间
    private void Age(){
        if(divAgeArr[0]<=this.age<=divAgeArr[1])  divGradeArr = [90,80,60];//90才优
        if(this.age<divAgeArr[0])  divGradeArr = [80,70,50];//70-80才良
        if(divAgeArr[1]<this.age)  divGradeArr = [50,40,20];//20-40才可
    }
    //性别影响判优的年龄区间
    private void Sex(){
        if(this.sex == 0) divAgeArr = [20,30];
        divAgeArr = [15,20];
    }
    //地区在性别的基础上也影响判优的年龄区间(所以得有先后顺序了,先性别后地区)
    private void Addr(){
        if(this.addr == "") divAgeArr = [50,80];
        divSexArr = [45,70];
    }
    
    
    
    public string GradeToRank(){
        Sex();
        Addr();
        Age();
        if(this.grade>=divGradeArr[0]) return "";
        if(divGradeArr[1]<=this.grade<divGradeArr[0]) return "";
        if(divGradeArr[2]<=this.grade<divGradeArr[1]) return "";
        if(this.grade<divGradeArr[2]) return "";
    }
}

RankResult rr = new RankResult(55,59,"",0);//55岁,分数59,北方人,男
string result = rr.GradeToRank();

 

纯手敲txt,可能有些毛病,思路应该可行,主要是可以规避条件互相的牵扯,通过一个中间量(divGradeArr、divAgeArr)来传递变化。也可以拓展,添加一个成员变量和对应的方法及中间量。供参考。

codingHeart | 园豆:1511 (小虾三级) | 2017-04-18 19:20
0

能简单用if else解决得了的问题,为什么不呢

狼爷 | 园豆:1204 (小虾三级) | 2017-04-19 09:08
0

前端时间遇到类似问题,给你说说我的做法,

给数据库扩展自定义一个函数,名如mrange

这个函数我用c++写的,它的功能是根据给定的数学区间和要判断的数据(当然也可以是数据库中的一个字段)

判断这个数据是否在区间中。

最后查询语句

 

select ★ from usr where mrange("(59,101)",usr.score)

迅捷网络[来送福利] | 园豆:576 (小虾三级) | 2017-04-20 20:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册