歩を進めるNETコード再構築学習ノート13

11789 ワード

一、Replace Exception with Test(異常の代わりにテストする)
モチベーション
「呼び出し者は事前にチェックできる」という条件に直面して、あなたは異常を投げ出しました.呼び出し元を変更して、関数を呼び出す前にチェックします.
        private Dictionary<int, string> _values;



        public double GetValueForPeriod(int periodNumber)

        {

            try

            {

                return _values[periodNumber];

            }

            catch

            {

                return 0;

            }

        }

 
に改心
        private Dictionary<int, string> _values;



        public double GetValueForPeriod(int periodNumber)

        {

            if (_values.ContainsKey(periodNumber))

                return _values[periodNumber];

            return 0;

        }

 
 
二、Pull Up Field(値ドメインを上へ移動)
モチベーション
2つのsubclassesは同じ値ドメインを持ち、この値ドメインをsuperclassに移動します.
    public abstract class Emplayee

    { 

    

    }



    public class Salesman : Emplayee

    {

        private string _name;



        public string Name

        {

            get { return _name; }

            set { _name = value; }

        }

    }



    public class Engineer : Emplayee

    {

        private string _name;



        public string Name

        {

            get { return _name; }

            set { _name = value; }

        }

    }

 
に改心
    public abstract class Emplayee

    {

        private string _name;



        public string Name

        {

            get { return _name; }

            set { _name = value; }

        }

    }



    public class Salesman : Emplayee

    {



    }



    public class Engineer : Emplayee

    {



    }

 
三、Pull Up Method(関数を上に移動)
モチベーション
いくつかの関数は、各subclassで完全に同じ結果を生成します.この関数をsuperclassに移動します.
    public abstract class Emplayee

    {



    }



    public class Salesman : Emplayee

    {

        public string GetName()

        {

            return "spring yang";

        }

    }



    public class Engineer : Emplayee

    {

        public string GetName()

        {

            return "spring yang";

        }

    }

 
に改心
    public abstract class Emplayee

    {

        public string GetName()

        {

            return "spring yang";

        }

    }



    public class Salesman : Emplayee

    {

    }



    public class Engineer : Emplayee

    {

    }

 
四、Pull Up Constructor Body(コンストラクタ本体を上に移動)
モチベーション
各subclassには、本体コードがほぼ一致するコンストラクション関数があり、baseにコンストラクション関数を新規作成し、subclassコンストラクション関数で呼び出します.
    public abstract class Emplayee

    {

        private string _ID;

        private string _name;



        public string ID

        {

            get { return _ID; }

            set { _ID = value; }

        }



        public string Name

        {

            get { return _name; }

            set { _name = value; }

        }

    }



    public class Salesman : Emplayee

    {

        public Salesman(string id, string name)

        {

            ID = id;

            Name = name;

        }

    }

 
に改心
    public abstract class Emplayee

    {

        private string _ID;

        private string _name;



        public string ID

        {

            get { return _ID; }

            set { _ID = value; }

        }



        public string Name

        {

            get { return _name; }

            set { _name = value; }

        }



        public Emplayee(string id, string name)

        {

            _ID = id;

            _name = name;

        }

    }



    public class Salesman : Emplayee

    {

        public Salesman(string id, string name):base(id,name)

        {

        }

    }

 
五、Push Down Method(関数を下に移動)
モチベーション
superclassの関数の1つは、subclassesの一部(すべてではなく)にのみ関係します.この関数を関連するsubclassesに移動します.
    public abstract class Emplayee

    {

        public double GetQuota()

        {

            return 0;

        }

    }



    public class Salesman : Emplayee

    {



    }



    public class Engineer : Emplayee

    {



    }

 
に改心
    public abstract class Emplayee

    {



    }



    public class Salesman : Emplayee

    {

        public double GetQuota()

        {

            return 0;

        }

    }



    public class Engineer : Emplayee

    {



    }

 
六、Push Down Field(値域下シフト)
モチベーション
superclassの値ドメインは、subclassesの一部(すべてではなく)でのみ使用されます.この値ドメインを必要なsubclassesに移動します.
    public abstract class Emplayee

    {

        private double _quota;

        public double Quota

        {

            get { return _quota; }

            set { _quota = value; }

        }

    }



    public class Salesman : Emplayee

    {

 

    }



    public class Engineer : Emplayee

    {



    }

 
に改心
    public abstract class Emplayee

    {



    }



    public class Salesman : Emplayee

    {

        private double _quota;

        public double Quota

        {

            get { return _quota; }

            set { _quota = value; }

        }

    }



    public class Engineer : Emplayee

    {



    }

 
七、Extract Subclass(精製子類)
モチベーション
classの一部のプロパティ(features)は、すべてではなく一部のエンティティ(instances)にのみ使用され、subclassを新規作成し、上記のプロパティの一部をsubclassに移動します.
    public class JobItem

    {

        public double GetTotalPrice()

        {

            return 1000;

        }



        public double GetUnitPrice()

        {

            return 10;

        }



        public string GetEmployee()

        {

            return 100;

        }

    }

 
に改心
    public class JobItem:BaseItem

    {

        public double GetTotalPrice()

        {

            return 1000;

        }



    }



    public class BaseItem

    {

        public double GetUnitPrice()

        {

            return 10;

        }

    }



    public class LaborItem:BaseItem

    {

        public string GetEmployee()

        {

            return 100;

        }

    }

 
八、Extract Superclass(精製スーパークラス)
モチベーション
2つのclassesには類似の特性(similar features)がある.この2つのclassesのsuperclassを作成し、同じプロパティをsuperclassに移動します.
    public class Department

    {

        public double GetAnnualCost()

        {

            return 1000;

        }



        public string GetName()

        {

            return "spring yang";

        }



        public double GetHeadCount()

        {

            return 100;

        }

    }



    public class Employee

    {

        public double GetAnnualCost()

        {

            return 1000;

        }



        public string GetName()

        {

            return "spring yang";

        }



        public int GetID()

        {

            return 1;

        }

    }

 
に改心
   public class LaborItem:BaseItem

    {

        public string GetEmployee()

        {

            return 100;

        }

    }



    public class Department:Party

    {

        public double GetHeadCount()

        {

            return 100;

        }

    }



    public class Employee:Party

    {

        public int GetID()

        {

            return 1;

        }

    }



    public class Party

    {

        public double GetAnnualCost()

        {

            return 1000;

        }



        public string GetName()

        {

            return "spring yang";

        }

    }

 
九、Extract Interface(抽出インタフェース)
モチベーション
いくつかのお客様はclassインタフェースの同じサブセットを使用します.あるいは、2つのclassesのインタフェースは部分的に同じです.同じサブセットを独立したインタフェースに抽出します.
    public class Employee

    {

        public double GetRate()

        {

            return 1;

        }



        public bool HasSpecialSkill()

        {

            return true;

        }



        public string GetName()

        {

            return "spring yang";

        }



        public string GetDepartMent()

        {

            return "Development";

        }

    }

 
に改心
    public class Employee:Billable

    {

        public double GetRate()

        {

            return 1;

        }



        public bool HasSpecialSkill()

        {

            return true;

        }



        public string GetName()

        {

            return "spring yang";

        }



        public string GetDepartMent()

        {

            return "Development";

        }

    }



    public interface Billable

    {

        double GetRate();

        bool HasSpecialSkill();

    }

 
十、Collapse Hierarchy(折りたたみ継承システム)
モチベーション
superclassとsubclassの間には大きな違いはありません.それらを一体化します.
    public class Employee 

    {

        public string GetName()

        {

            return "spring yang";

        }



        public string GetDepartMent()

        {

            return "Development";

        }

    }



    public class Salesman

    {

        public int GetID()

        {

            return 1;

        }

    }

 
に改心
    public class Employee 

    {

        public string GetName()

        {

            return "spring yang";

        }



        public string GetDepartMent()

        {

            return "Development";

        }



        public int GetID()

        {

            return 1;

        }

    }

 
 
 
歩を進めるNETコード再構築学習ノートシリーズ
歩を進めるNETコード再構築学習ノート一、なぜコード再構築するのか
歩を進めるNETコード再構築学習ノート二、抽出方法(Extract Method)
歩を進めるNETコード再構築学習ノート3、インラインメソッド(Inline Method)
歩を進めるNETコード再構築学習ノート4、一時変数(Temporary Variable)
歩を進めるNETコード再構成学習ノート5,分解関数,置換アルゴリズム(Replace Method And Substitute Algorithm)
歩を進めるNETコード再構成学習ノート6,移動関数,移動値ドメイン(Move Method And Move Field)
歩を進めるNETコード再構築学習ノート7
歩を進めるNETコード再構築学習ノート8
歩を進めるNETコード再構築学習ノート9
歩を進めるNETコード再構築学習ノート10
歩を進めるNETコード再構築学習ノート11
歩を進めるNETコード再構築学習ノート12