1

古いコードをリファクタリングしようとしていて、より論理的な継承を作成したいと思っています。

(3)レベルに分けた構造体カスタムクラスがあります。

AccountView>詳細>継承で完全。必要に応じて、それぞれのプロパティを設定します。

セッターを確認した後、プロパティを設定するメソッドを使用して、セッターを1つのクラス「SetAccountProp」に結合したいと思いました。

動作するModelsACCOUNTデータを渡す「CustomerBaseView」があります。

ここで、CustomerDetailViewに対して同じモデルACCOUNTデータを渡しますが、「CustomerBaseView」のプロパティを入力し、関数「CustomerBaseView」を使用してから詳細を入力します。

また、CustomerFullViewの場合、モデルACCOUNTデータを渡し、「CustomerBaseView」、「THEN」、「CustomerBaseView」のプロパティを入力してから、CustomerFullViewの残りのフィールドに入力します。

「CustomerDetailView」関数内で「CustomerBaseView」を呼び出して入力するにはどうすればよいですか?新しいAccountsView();を初期化しますか?各機能で?

を繰り返さずにリファクタリングを終了する方法がわからない:

// -- CustomView  <--- replace with func?
view.Email = data.Email; 
view.Active = data.Active; 
view.FirstName = data.FirstName; 
view.LastName = data.LastName; 

詳細および全機能で。

コード

namespace BLL.Presenters
{
    public class AccountsView
    {
        public string Email { get; set; }
        public bool Active { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public class Details : AccountsView
    {
        public bool Administrator { get; set; }
        public DateTime? LastLogin { get; set; }
    }

    public class Full : Details
    {
        public Guid ID { get; set; }
        public DateTime Created { get; set; }
        public DateTime Modified { get; set; }
        public string FullName { get; set; }
    }


    public class SetAccountProp
    {
        public static AccountsView CustomerBaseView(Account data)
        {
            var view = new AccountsView();
            view.Email = data.Email;
            view.Active = data.Active;
            view.FirstName = data.FirstName;
            view.LastName = data.LastName;
            return view;
        }

        public static Details CustomerDetailView(Account data)
        {
            var view = new Details();

            // -- CustomView  <--- replace with func?
            view.Email = data.Email;
            view.Active = data.Active;
            view.FirstName = data.FirstName;
            view.LastName = data.LastName;

            // -- Details
            view.Administrator = data.Administrator;
            view.LastLogin = data.LastLogin;

            return view;
        }

        public static Full CustomerFullView(Account data)
        {
            var view = new Full();

            // -- CustomView <--- replace with func?
            view.Email = data.Email;
            view.Active = data.Active;
            view.FirstName = data.FirstName;
            view.LastName = data.LastName;

            // -- Details <--- replace with func?
            view.Administrator = data.Administrator;
            view.LastLogin = data.LastLogin;

            // -- Full
            view.ID = data.ID;
            view.Created = data.Created;
            view.Modified = data.Modified;
            view.FullName = data.LastName + ", " + data.FirstName;

            return view;
        }

    }

}
4

2 に答える 2

1

コンストラクターチェーンを使用すると、次のようになります。

各コンストラクターは最初にその基本クラスのコンストラクターを呼び出すため、コードを繰り返す必要はありません。

  namespace BLL.Presenters
  {
    using System;

    public class Account // dummy to make it compile
    {
      public string Email;
      public bool Active;
      public string FirstName;
      public string LastName;
      public bool Administrator;
      public DateTime? LastLogin;
      public Guid ID;
      public DateTime Created;
      public DateTime Modified;
    }

    public class AccountsView
    {
      public string Email { get; set; }
      public bool Active { get; set; }
      public string FirstName { get; set; }
      public string LastName { get; set; }

      public AccountsView(Account data)
      {
        this.Email = data.Email;
        this.Active = data.Active;
        this.FirstName = data.FirstName;
        this.LastName = data.LastName;
      }
    }

    public class Details : AccountsView
    {
      public bool Administrator { get; set; }
      public DateTime? LastLogin { get; set; }

      public Details(Account data) : base(data)
      {
        this.Administrator = data.Administrator;
        this.LastLogin = data.LastLogin;
      }
    }

    public class Full : Details
    {
      public Guid ID { get; set; }
      public DateTime Created { get; set; }
      public DateTime Modified { get; set; }
      public string FullName { get; set; }

      public Full(Account data) : base(data)
      {
        this.ID = data.ID;
        this.Created = data.Created;
        this.Modified = data.Modified;
        this.FullName = data.LastName + ", " + data.FirstName;
      }
    }

    class Program
    {
      static void Main()
      {
        Console.WriteLine();
        Console.ReadLine();
      }
    }
  }
于 2013-03-12T14:26:28.293 に答える
0

なぜこのようなものではないのですか?

public class CustomerBase
{
    public string Email { get; private set; }
    public bool Active { get; private set; }
    public string FirstName { get; private set; }
    public string LastName { get; private set; }

    protected void SetAccountInfo(Account account)
    {
        this.Email = account.Email;
        this.Active = account.Active;
        this.FirstName = account.FirstName;
        this.LastName = account.LastName;
    }
}

public class CustomerA : CustomerBase
{
    public string IsAdmin { get; private set; }
    public DateTime? LastLogin { get; private set; }

    public void SetAccountInfo(Account account)
    {
        base.SetAccountInfo(account);
        this.IsAdmin = account.IsAdmin;
        this.LastLogin = account.LastLogin;
    }

}

 public class Account
{
     //your properties
    public string Email { get; set; }
    public bool Active { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string IsAdmin { get; set; }
    public DateTime? LastLogin { get; set; }
}

または、SetAccountInfo()に戻りますthis

public CustomerA SetAccountInfo(Account account)
    {
        base.SetAccountInfo(account);
        this.IsAdmin = account.IsAdmin;
        this.LastLogin = account.LastLogin;
        return this;
    }
于 2013-03-12T14:11:19.577 に答える