代码改变世界

分数段代码改写——职责链

2009-03-10 23:02  ubunoon  阅读(326)  评论(0编辑  收藏  举报
很多公司在招聘的时候会给出一些代码,让面试者进行判断,下面是一个常见的分数段修改代码:

 1 char grade(int score)
 2 {
 3     if0<score && score < 60 )
 4         return 'd';
 5     else if ( score>=60 && score < 70 )
 6         return 'c';
 7     else if ( score>=70 && score < 80 )
 8         return 'b';
 9     else if ( score>=80 && score<=100)
10         return 'a';
11     else
12         return '\0';
13 }

 1 char grade(int score)
 2 {
 3     int s = score/10;
 4     switch(s)
 5     {
 6         case 0:
 7         case 1:
 8         case 2:
 9         case 3:
10         case 4:
11         case 5:
12             return 'a'
13         case 6:
14             return 'c';
15         case 7:
16             return 'b';
17         case 8:
18         case 9:
19         case 10:
20             return 'a';
21     }
22     return '\0';
23 }

暂且不论代码是否修改正确,其实代码从一个转入另一个并没有改变多少内涵,都是学C语言太久,受到结构化思想的影响,代码之间的耦合性还是非常的强,代码还可以做下面的修改,虽然代码量增加很多,也复杂了很多,但是如果要在中间嵌入某个功能,相比较而言,会更加方便,同时估计也是很多面试官想要从你那儿得到的东西:

 1class score
 2{
 3public:
 4    score(void);
 5public:
 6    virtual ~score(void);
 7public:
 8    int sc;
 9}
;
10
11
12class ScoreHandle
13{
14public:
15    virtual char grade(score* s) = 0;
16    
17    void nextHandle(ScoreHandle* n)
18    {
19        next = n;
20    }

21protected:
22    ScoreHandle* next;
23}
;
24
25class NotPass : public ScoreHandle
26{
27public:
28    virtual char grade(score* s)
29    {
30        if( s->sc < 60 )
31            return 'd';
32        return next->grade(s);
33    }

34}
;
35
36
37class MidPass :  public ScoreHandle
38{
39public:
40    virtual char grade(score* s)
41    {
42        if ( s->sc >=60 && s->sc < 70)
43        {
44            return 'c';
45        }

46        return next->grade(s);
47    }

48}
;
49
50class WellPass :  public ScoreHandle
51{
52public:
53    virtual char grade(score* s)
54    {
55        if ( s->sc>=70 && s->sc<80 )
56        {
57            return 'b';
58        }

59        return next->grade(s);
60    }

61}
;
62
63class GreatPass :  public ScoreHandle
64{
65public:
66    virtual char grade(score *s)
67    {
68        if ( s->sc>=80 && s->sc<=100 )
69        {
70            return 'a';
71        }

72        return next->grade(s);
73    }

74}
;
75
76class NotExistPass :  public ScoreHandle
77{
78public:
79    virtual char grade(score* s)
80    {
81        return '\0';
82    }

83}
;

在你需要测试的前面,做下面的一些初始化工作:

 1    ScoreHandle *sh;
 2
 3    NotPass not;
 4    MidPass mid;
 5    WellPass well;
 6    GreatPass great;
 7    NotExistPass notExist;
 8
 9    not.nextHandle(&mid);
10    mid.nextHandle(&well);
11    well.nextHandle(&great);
12    great.nextHandle(&notExist);
13
14    sh = &not;


后就可以很放心的分级你的分数段了:

1 score s;
2 s.sc = 20;
3 cout << sh->grade(&s) << endl;
4     
5 s.sc = 65;
6 cout << sh->grade(&s) << endl;


这个才是OOP的思想。

好了,自己也很好的回顾了一下职责链的基本功能,希望网友也能够理解职责链的功能。