歩を進めるNETコード再構築学習ノート13
11789 ワード
一、Replace Exception with Test(異常の代わりにテストする)
モチベーション
「呼び出し者は事前にチェックできる」という条件に直面して、あなたは異常を投げ出しました.呼び出し元を変更して、関数を呼び出す前にチェックします.
例
に改心
二、Pull Up Field(値ドメインを上へ移動)
モチベーション
2つのsubclassesは同じ値ドメインを持ち、この値ドメインをsuperclassに移動します.
例
に改心
三、Pull Up Method(関数を上に移動)
モチベーション
いくつかの関数は、各subclassで完全に同じ結果を生成します.この関数をsuperclassに移動します.
例
に改心
四、Pull Up Constructor Body(コンストラクタ本体を上に移動)
モチベーション
各subclassには、本体コードがほぼ一致するコンストラクション関数があり、baseにコンストラクション関数を新規作成し、subclassコンストラクション関数で呼び出します.
例
に改心
五、Push Down Method(関数を下に移動)
モチベーション
superclassの関数の1つは、subclassesの一部(すべてではなく)にのみ関係します.この関数を関連するsubclassesに移動します.
例
に改心
六、Push Down Field(値域下シフト)
モチベーション
superclassの値ドメインは、subclassesの一部(すべてではなく)でのみ使用されます.この値ドメインを必要なsubclassesに移動します.
例
に改心
七、Extract Subclass(精製子類)
モチベーション
classの一部のプロパティ(features)は、すべてではなく一部のエンティティ(instances)にのみ使用され、subclassを新規作成し、上記のプロパティの一部をsubclassに移動します.
例
に改心
八、Extract Superclass(精製スーパークラス)
モチベーション
2つのclassesには類似の特性(similar features)がある.この2つのclassesのsuperclassを作成し、同じプロパティをsuperclassに移動します.
例
に改心
九、Extract Interface(抽出インタフェース)
モチベーション
いくつかのお客様はclassインタフェースの同じサブセットを使用します.あるいは、2つのclassesのインタフェースは部分的に同じです.同じサブセットを独立したインタフェースに抽出します.
例
に改心
十、Collapse Hierarchy(折りたたみ継承システム)
モチベーション
superclassとsubclassの間には大きな違いはありません.それらを一体化します.
例
に改心
歩を進める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
モチベーション
「呼び出し者は事前にチェックできる」という条件に直面して、あなたは異常を投げ出しました.呼び出し元を変更して、関数を呼び出す前にチェックします.
例
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