如何创建CRUD方法的多个重载? [关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建CRUD方法的多个重载? [关闭]相关的知识,希望对你有一定的参考价值。

如果我有一个类,以某种方式表示我的数据库中的特定表的映射。该类包含大约30个属性。

我创造了CRUD Methods

并发现自己需要另一个(UPDATE)方法,它应该只更新两个字段。

我应该用简单的例子做些什么呢?

  1. 使用我现有的方法,填充整个对象并更新所有字段,包括我想要的两个字段? (无用的工作)
  2. 使用另一个名称创建静态方法(但我希望保留我的方法名称,因为它具有表现力)!并采取两个参数?
答案

我会创建两个独立的接口并为每个接口创建重载函数。我会根据用法对属性进行分组,就像我希望状态在某些时候与其他常见属性分开更新。

public interface ICommonProperties
{
   public string P1{get; set;}
   public string P2{get; set;}
   public string P3{ get; set; }
}
public interface ITrackable
{
   public string Status{get; set;}
}
public class FinalClass : ICommonProperties, ITrackable
{
   public string P1{get; set;}
   public string P2{get; set;}
   public string P3{get; set;}
   public string Status{get; set;}
}

public class FinalClassOperations
{
   public void Update(FinalClass finalClassInstance) { }; //Updates everything
   public void Update(ICommonProperties finalClassInstance) { }; //Updates only ICommonProperties
   public void Update(ITrackable finalClassInstance) { }; //updates only Status.
}

此外,如果您需要,您可以创建一个单独的类来仅更新状态,并且仍然适合:

public class Tracker : ITrackable{
    public string Status{get; set;}
}

但是,是的,如果这两个属性在逻辑上无法分离出来,我就不会这样做并将它们保持在一起。

另一答案

我建议你按照你的第二个选项,但是没有必要更改名称,因为方法参数的数量在两者上都是不同的让我们走进几个例子

我会尝试创造一个类似的情况,我希望这是你的情况。你可以澄清我是否错误地提出了这个问题。

课堂和方法

/// <summary>
/// CLass to store properties related to database
/// </summary>
class ObjectoA
{
   public string A{get; set;}
   public string B{get; set;}
   public string C{ get; set; }
}

/// <summary>
/// class to call method to update.
/// 
/// </summary>
class ObjectB
{
    /// <summary>
    /// update method.
    /// I would go with this solution.
    /// optionlay you can call the method which receive parameter of object
    /// </summary>
    /// <param name="A"> Object with properties mapped to database</param>
    /// <param name="updatetwoproperties">Optional paramneter to decide which update to run.
    /// the default value should be for update  that run most. For your need if you want to create an update methods for other
    /// two sets of parameter a suggest you create an Enum and pass this enum as optional parameter instead of bool parameter or you
    /// can pass as string and map each string value to specific update inside. IF YOU NEED EXAMPLE
    /// REPLAY ON COMMENTS</param>
    /// <returns></returns>
    public bool update(ObjectoA A, bool updatetwoproperties=false)
    {
        //method implementation
        if (updatetwoproperties)
        {
            //implement a update to all field
        }
        else
        {
            //implement update just to two field
        }
        return true;
    }

    /// <summary>
    /// update method based on parameter to update
    /// </summary>
    /// <param name="a">this properties is mapped on database</param>
    /// <param name="b">this propertie is mapped on database</param>
    /// <returns></returns>
    public bool update(string a, string b)
    {
        //method implementation e validate the return value
        return true;
    }       
}

/// <summary>
/// I don't suggest to use this solution because
/// it will add a method on string type while this method isn't related to string
/// I just added here as a workaround for you.
/// </summary>

public static class ObjectC {public static bool update(this string a,string b){//执行更新并验证返回值返回true; }}

呼叫方法和解释

    static void Main(string[] args)
    {
                    ObjectB B = new ObjectB(); //Class with methods
        ObjectoA A = new ObjectoA(); //object with properties

        #region Using Optional parameter to decide which update to run
        //Calling a method to update all columns
        B.update(A);
        //Calling a method to update two columns
        B.update(A, true); 
        #endregion

        #region Using polymorphism to update
        //Calling a method to update all columns
        B.update(A);
        //Update only using paramenter
        B.update(A.B, A.C); 
        #endregion

        //NOT RECOMMEND BECAUSE THIS UPDATE ISN'T RELATED TO STRING TYPE
        #region Using extension method to update
        //Calling a method to update all columns
        B.update(A);
        //using the extension method on variable type
        A.B.update(A.C); 
        #endregion

        //WE COULD USE EXTENSION METHOD ON YOUR OBJECT BUT IT WILL FAIL BECAUSE WE ALREADY AS UPDATE METHOD ON CLASS
        //IF YOU WANT TO SEE HOW JUST REPLAY
    }

我建议您在您的方法上添加可选参数以决定更新使用

另一答案

这取决于您在项目中的优先级:使用您现有的更新方法将一直更新所有内容,包含流量,IO和处理时间(验证等等)如果您正在进行属性的项目有时间戳,即使价值没有真正改变,它们也会更新......

如果您不介意这一切,请始终使用update()方法。

我的个人POV是:创建一个新方法(带有明确的名称)。这将是从现在开始的相同处理时间和2年后的思考时间,当你必须改变这个类时;)

另一答案

我不知道这是否是你应该做的事情,但是你可以做的事情是:创建一个SetAll或SetMany或者你传递给你的另一个实例(源)的任何方法。检查每个属性,如果它是非null,则将目标对象的属性值设置为源对象的属性值。请注意,此策略将取决于可空类型,并假设您可以忽略传递给新setter方法的空值。这是一个例子:

using System;

namespace BlogPartialUpdateTrick
{
    public class SomeClass
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int? HeightInches { get; set; }
        public DateTime? Dob { get; set; }

        public void SetAll(SomeClass source)
        {
            this.FirstName = source.FirstName ?? this.FirstName;
            this.LastName = source.LastName ?? this.LastName;
            this.HeightInches = source.HeightInches ?? this.HeightInches;
            this.Dob = source.Dob ?? this.Dob;
        }

        public override string ToString()
        {
            return String.Format("fn: {0}, ln: {1}, height: {2}, DOB: {3}", FirstName ?? String.Empty, LastName ?? String.Empty, 
                HeightInches.HasValue ? HeightInches.Value.ToString() : "null", Dob.HasValue ? Dob.Value.ToShortDateString() : "null" );
        }
    }
}

在第一个代码示例中,我们有我的spiffy类SomeClass。它有4个属性,所有属性都可以为空。这个类的值得注意的部分是SetAllMethod,我可以在其中传入一个也是SomeClass类型的源对象。它将此实例的属性值设置为source参数中传递的值,但前提是它们不为null。这是第二个代码模糊,我正在使用这些东西:

using System;
using System.Windows.Forms;

namespace BlogPartialUpdateTrick
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var destination = new SomeClass() { FirstName = "Freddy", LastName = "Fingers", Dob = DateTime.Parse("01/01/1970"), HeightInches = 72 };
            var source = new SomeClass() { FirstName = null, LastName="Flippers", Dob = null, HeightInches = 80 };
            destination.SetAll(source);
            MessageBox.Show(destination.ToString());
        }
    }
}

创建一个目标对象,一个源对象,调用新方法,瞧!输出是这样的:

“fn:Freddy,ln:Flippers,身高:80,DOB:1/1/1970”

另一答案

您应该使用Entity Framework并让上下文为您完成。使用EF,您将能够像这样更新实体:

        try
        {
            var original = ObjectContext.Set<Request>().SingleOrDefault(x => x.Id.Equals(_request.Id));
            if (original != null)
            {
                ObjectContext.Entry(original).CurrentValues.SetValues(_request);
            }

            return ObjectContext.SaveChanges();

        }
        catch (Exception ee)
        {
            return -1;
        }

以上是关于如何创建CRUD方法的多个重载? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在片段中使用按钮[关闭]

导航架构片段重载问题

Java基础之方法的调用重载以及简单的递归

如何使用 LINQ to SQL 创建通用数据访问对象 (DAO) CRUD 方法

Java面向对象---方法的创建与重载

MVC5 CRUD 最佳方法 [关闭]