チョークでコードを開始
するテクニック:
作曲方法本「
リファクタリング 」のリファクタリング手法の続き
。 既存のコードの改善Martin Fowler。構文はC#で記述されますが、主なことはアイデアを理解することであり、他のプログラミング言語でも使用できます。
オブジェクト間で関数を移動する
- メソッドを移動する ( より頻繁に使用するクラス内で同じ本体を持つ新しいメソッドを作成する )。
メソッドは、サブジェクト領域をよりよく反映するクラス内にある必要があります。
から
class View { private Shop shop; private List<User> FilterUsers(List<User> users, decimal koef) { List<User> activeUsers = new List<User>(); foreach(User user in users) { if(shop.IsActiveUser(user, koef)) { activeUsers.Add(user); } } return activeUsers; } } class Shop { public bool IsActiveUser(User user, decimal koef) { decimal rate = 1; if(koef > 1000) { rate = koef * 1.75; } return user.Boss || user.HasDiscount() && rate > 10; } } class User { private bool boss; public bool Boss { get { return boss; } } public bool HasDiscount() {
に
class View { private Shop shop; private List<User> FilterUsers(List<User> users, decimal koef) { List<User> activeUsers = new List<User>(); foreach(User user in users) { if(user.IsActiveUser(koef)) { activeUsers.Add(user); } } return activeUsers; } } class Shop { } class User { private bool boss; public bool Boss { get { return boss; } } public bool HasDiscount() {
- フィールドを移動する ( ターゲットクラスに新しいフィールドを作成する )。
フィールドは、サブジェクト領域をよりよく反映するクラス内にある必要があります
から
class Shop { private decimal rate; private DiscountType discountType; public Shop(DiscountType discountType, decimal rate) { this.rate = rate; this.discountType = discountType; } public decimal Rate { get{ return rate; } set{ rate = value; } } public bool HasDiscount(DateTime from, DateTime to) {
に
class Shop { private DiscountType discountType; public Shop(DiscountType discountType) { this.discountType = discountType; } public bool HasDiscount(DateTime from, DateTime to) {
- クラスを強調表示し ます ( 新しいクラスを作成し、フィールドとメソッドを古いクラスから新しいクラスに移動します )。
クラスには独自のデータモデルとそれを操作するメソッドが含まれている必要があります。そうでない場合、クラスはGodオブジェクトになります。
から
class User { private string name; private string street; private string city; public string Name { get{ return name; } set{ name = value; } } public string Street { get{ return street; } set{ city = value; } } public string City { get{ return city; } set{ city = value; } } public string GetAddressInfo() { return string.Format("{0} \ {1}", city, street); } }
に
class User { private string name; private Address address; public string Name { get{ return name; } set{ name = value; } } public string GetAddressInfo() { return address.GetFullAddress(); } } class Address { private string city; private string street; public string Street { get{ return street; } set{ city = value; } } public string City { get{ return city; } set{ city = value; } } public string GetFullAddress() { return string.Format("Adress: {0} \ {1}", city, street); } }
- クラスのインライン化 ( すべての関数を別のクラスに移動し、元のクラスを削除します)。
クラスの関数が少なすぎます。
から
class User { private string name; private Address address; public string Name { get{ return name; } set{ name = value; } } public Address GetAddress() { return address } } class Address { private string areaCode; private string country; public string AreaCode { get{ return areaCode; } set{ areaCode = value; } } public string Country { get{ return country; } set{ country = value; } } }
に
class User { private string name; private string areaCode; private string country; public string AreaCode { get{ return areaCode; } set{ areaCode = value; } } public string Country { get{ return country; } set{ country = value; } } public string Name { get{ return name; } set{ name = value; } } }
- 委任の 非表示(委任を非表示にするメソッドを作成 )。
カプセル化、システムの一部。
から
class View { private void Init() {
に
class View { private void Init() {
- ブローカーを削除 します ( クライアントがデリゲートに直接連絡するようにします )。
クラスは単純な委任で忙しすぎます。
から
class View { private void Init() {
に
class View { private void Init() {
- 外部メソッドの導入 ( クライアントで、サーバークラスが1番目のパラメーターとして渡されるメソッドを追加します )。
メソッドを導入する必要がありますが、クラスを変更する可能性はありません。
から
class View { private string GetUserName() {
に
class View { private string GetUserName() {
- ローカル拡張の導入 ( クラスのラッパーを作成(または継承を使用)し、必要なメソッドを追加します )。
メソッドを導入する必要がありますが、クラスを変更する方法はありません。
から
sealed class Account { public decimal CalculateSum() {
に
class ImportantAccount { private Account account; public decimal CalculateMaxSum() {
利益相反(レビューの一環として)。
原則として、校閲者とcomitt-errの間で生じるすべての論争/不一致は、次のように分類できます。
「技術:データ編成」をさらに続けていきたいと思います。