想了几天希望大神给一些思路
业务很简单:
比如我一个用户 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 是要死人的
最终都是if判断.手法都在if判断怎么组织上
我在想..if是避免不了的。如果搞个数据字典去相结合使用或许逻辑看起来会清晰点
这种逻辑你就算不用代码描述出来也是很麻烦的吧?所以你这边就算变成代码逻辑也会很麻烦的,所以这个地方不要想能偷懒。
这个地方建议使用职责链模式,规则这些你可以通过配置方式搞出来,每个class的职责只是判断其是否属于当前规则,如果属于则进行处理,反之交给后面的class处理。当然这里if啥的肯定会少很多(基本都是通过对你的配置的解析加个模板方法就可以搞定了),但要处理好职责链的先后顺序,否则还是会出错。
你这问就是在挖坑,分数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)来传递变化。也可以拓展,添加一个成员变量和对应的方法及中间量。供参考。
能简单用if else解决得了的问题,为什么不呢
前端时间遇到类似问题,给你说说我的做法,
给数据库扩展自定义一个函数,名如mrange
这个函数我用c++写的,它的功能是根据给定的数学区间和要判断的数据(当然也可以是数据库中的一个字段)
判断这个数据是否在区间中。
最后查询语句
select ★ from usr where mrange("(59,101)",usr.score)