重构与对象封装

来源:互联网 发布:mysql bin是什么文件 编辑:程序博客网 时间:2024/05/16 15:22

背景说明:某公司面临一定数量的员工裁撤,要根据每个员工的个人情况分发这一年的工资。

程序编写目的:一是加强对象封装的练习,二是对方法的重构进行一次小小的应用,鄙人认为,方法的重构在面向对象的领域里面能够极大程度的提高方法的可复用性,减少了注释,增加了可读性

 

//驱动类

pubic class TestCountingMoney{

  public static void main(String[] args){

     CountMoney cm = new CountMoney();

     WokerInfro WI;

     String WorkerName[5] = new WorkerName("蒋云峰","许树林","张政","胡新华","高学义");

     int Woring_age[5] = new Working_age(12,13,10,12,6);

     String WorkerPos[5] = new WorkerPos("AdavancedWorker","Adavanced Worker","AdavancedWorker","MidAdavanced Worker","MidAdavanced Worker");

     for(int i = 0;i <= 4;i++){

       WI = new WokerInfor(WorkerPos[i],Woring_age[i],WorkerName[i],++i);

       cm.ChooseAndCount_EarnMoney(WI);

       System.out.println("worker id is:" + WI.GetId())

       System.out.println("WI:" + WorkerName[i] + "Pos is"+ WorkerPos[i] + "Total Money is:" + cm.GetYearMoney());

     }

   }

}

 

//计算每个将要被裁的员工的工资

class CountMoney {

 intMonthMoney[] = new MonthMoney[];

 intYearMoney;

 intMonth_Courage;

 

 pubic int Print_EarnMoney(WorkerInfor p){

  /***

   可以用来提取方法的重构内容

  if((p.GetPos() == "Adavanced Worker") &&(p.GetWorkingage() >= 10)){

     /***

     这是第二层可以重构的内容

      for(int i = 0;i <= 11;i++){

        MonthMoney[i] = 3000 + i * 100;

        YearMoney = YearMoney + MonthMoney[i];

      }

     ***/

  else if((p.GetPos() == "MidAdavanced Worker") &&(p.GetWorkingage() >= 10) )

     for(int i = 0;i <= 11;i++){

        MonthMoney[i] = 2500 + i * 100;

        YearMoney = YearMoney + MonthMoney[i];

      }

  else if((p.GetPos() == "MidAdavanced Worker") &&(p.GetWorkingage() < 10)){

      for(int i = 0;i <= 11;i++){

        MonthMoney[i] = 2000 + i * 50;

        YearMoney = YearMoney + MonthMoney[i];

      }

  ******/

  

  

   //被重构后的语句被下面的第一条函数语句替代,这就是重构中所谓的提取方法。提取方法一般分为两种情况:一种情况是方法语句后面使用了外层方法定义的局部变量,则必须有返回值;

   //第二种情况是方法没有返回值,前提是后面的语句和被重构的内容无利害关系。本程序演示的是方法提取的第二种情况,后面的程序输出语句用到的只是本类中的成员变量。   

      ChooseAndCount_EarnMoney(p);  //重构内容的替代方法

      

      System.out.println(p.GetName() + "MonthMoney is:" +MonthMoney);

      System.out.println(p.GetName() + "YearMoney is:" +YearMoney); 

       

   }

   }

  

 //第一次重构后的方法

 public voidChooseAndCount_EarnMoney(WorkerInfor p){

  if((p.GetPos() == "Adavanced Worker") && (p.GetWorkingage()>= 10)){

     Month_Courage = 150;

     Count_EarnMoney();    //第二次可以重构的内容所提取出的方法,请读者自行分析为何无需返回值

   }

  else if((p.GetPos() == "MidAdavanced Worker") &&(p.GetWorkingage() >= 10) ){

     Month_Courage = 100;

     Count_EarnMoney();

   }

   elseif((p.GetPos() == "MidAdavanced Worker") &&(p.GetWorkingage() < 10)){

     Month_Courage = 50;

     Count_EarnMoney();

   }

 }

 

 //第二次重构后的内部方法

 public void Count_EarnMoney(){

   for(int i = 0;i <= 11;i++){

        MonthMoney[i] = 3000 + i * Month_Courage;

        YearMoney = YearMoney + MonthMoney[i];

    }

 }

 

 public int GetYearMoney(){

  return YearMoney;

 }

 

 public void SetYearMoney(int ym){

  this.YearMoney = ym;

 }

 

 public int GetMonthMoney(int index){

  return MontyMoney[index];

 }

 

 public void SetMonthMoney(int index,intActualMoney){

  MonthMoney[index] = ActualMoney;

 }

 

}

 

//员工的个人情况

class WorkerInfor {

 String pos = null;

 String name = null;

 intWorking_age;

 intWorkerIndex;

 

 public Position(String pos,int Working_age,Stringname,int WorkerIndex){

  this.pos = pos;

  this.Working_age = Working_age;

  this.name = name;

  this.WorkerIndex = WorkerIndex;

 }

 

 public String GetPos(){

  return pos;

 }

 

 public void SetPos(String s){

   this.pos = s;

 }

 

 public String GetName(){

   return name;

 }

 

 public void SetWorkingage(int wa){

   this.Workingage = wa;

 }

 

 public int GetWorkingage(){

  return Workingage;

 }

 

 pubic int GetId(){

 return WorkerIndex;

 }

 

}

原创粉丝点击