zoukankan      html  css  js  c++  java
  • 分数段代码改写——职责链

    很多公司在招聘的时候会给出一些代码,让面试者进行判断,下面是一个常见的分数段修改代码:

     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的思想。

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




  • 相关阅读:
    NKOJ P3051浇花
    Linux-Shell脚本编程-学习-2-Linux基本命令
    Linux-Shell脚本编程-学习-1-Linux基本命令
    Ubuntu下使用Git_6
    Ubuntu下使用Git_5
    电脑优化,提速
    Ubuntu下使用Git_4
    Ubuntu下使用Git_3
    Ubuntu下使用Git_2
    Ubuntu下使用Git_1
  • 原文地址:https://www.cnblogs.com/ubunoon/p/1408246.html
Copyright © 2011-2022 走看看