代码重复,相同的功能不同的类型

本文关键字:功能 类型 代码 | 更新日期: 2023-09-27 17:59:51

我有一个可以与Npgsql:一起使用的方法

private DataTable GetTableN(string sql, string[] pars)
    {
        NpgsqlCommand zapytanie = new NpgsqlCommand(sql, connn, trann);
        NpgsqlDataAdapter da = new NpgsqlDataAdapter();
        DataSet ds = new DataSet();
        try
        {
            if (pars != null)
            {
                for (int i = 0; i < pars.Length; i++)
                {
                    zapytanie.Parameters.AddWithValue("@param" + i, pars[i]);
                }
            }
            connn.Open();
            da.SelectCommand = zapytanie;
            da.Fill(ds);
            return ds.Tables[0];
        }
        catch (NpgsqlException e)
        {
            throw (new SqlException(e.Message.ToString()));
        }
        finally
        {
            connn.Close();
            zapytanie.Dispose();
            da.Dispose();
            ds.Dispose();
        }
    }

现在我需要有完全相同的方法,但使用Odbc。我只需要做这些改变

  1. NpgsqlCommand到ObdcCommand
  2. NpgsqlDataAdapter到OdbcDataAdapter
  3. NpgsqlException到OdbcException

我如何合并它以避免代码重复,并且只有一种方法?

代码重复,相同的功能不同的类型

您可以尝试更改方法的签名

private DataTable GetTableN(string sql, string[] pars, DbCommand zapytanie, DbDataAdapter da)
{   
    DataSet ds = new DataSet();
    try
    {
        if (pars != null)
        {
            for (int i = 0; i < pars.Length; i++)
            {
                zapytanie.Parameters.AddWithValue("@param" + i, pars[i]);
            }
        }
        connn.Open();
        da.SelectCommand = zapytanie;
        da.Fill(ds);
        return ds.Tables[0];
    }
    catch (DbException e)
    {
        throw (new SqlException(e.Message.ToString()));
    }
    finally
    {
        connn.Close();
        zapytanie.Dispose();
        da.Dispose();
        ds.Dispose();
    }
}

或者使用某种工厂

private DataTable GetTableN(string sql, string[] pars, MyFactory factory)
{
    DbCommand zapytanie = factory.CreateCommand(...);
    DbDataAdapter da = new factory.CreateAdapter(...);
    ...
}

或者你可以为使用继承

public abstract class MyClass
{
    private DataTable GetTableN(string sql, string[] pars)
    {
        DbCommand zapytanie = CreateCommand();
        DbDataAdapter da = CreateAdapter();
        ...
    }
    protected abstract DbCommand CreateCommand();
    protected abstract DbDataAdapter CreateAdapter();
}
public class OdbcClass : MyClass
{
    protected override DbCommand CreateCommand()
    {
        // create for odbc
    }
    protected override DbDataAdapter CreateAdapter()
    {
        // create for odbc
    }
}
public class PostgrClass : MyClass
{
    protected override DbCommand CreateCommand()
    {
        // create for postgr
    }
    protected override DbDataAdapter CreateAdapter()
    {
        // create for postgr
    }
}

我想工厂模式就是这样。非常感谢。