0

我继承了一个代码库,并发现了一些我无法弄清楚为什么(以及是否)需要它的代码。

这是一个习惯ViewPage,但我们将完全相同的代码重复了两次——一次 forViewPage和一次 for ViewPage<T>

基本上:

public class MyPageBase : WebViewPage
{
    //A whole bunch of properties intended to be accessible on every page
}
public class MyPageBase<T> : WebViewPage<T>
{
    //The exact same properties. Doesn't actually use T anywhere. The code is literally identical.
}

有这么多重复的代码远非理想。更糟糕的是,我不明白为什么需要它。一些测试表明,顶部的似乎没有做任何事情,但我无法对所有视图进行全面搜索(这个 MyPageBase 使用了几十个应用程序)。

所以我的问题是:对于通用+非通用,是否/为什么需要从两次继承 WebViewPage?

4

1 回答 1

0

首先,它没有被继承两次,你有两个同一个类的实现,一个是通用的,另一个是非通用的。

你还没有向我们提供内部代码所以这里举个例子,说你有这样的东西..

public class MyPageBase<T> : WebViewPage<T>
    {
        //The exact same properties
        private DbContext db;
        public MyPageBase()
        {
            db = new MPContext();
        }

        public List<T> Fill()
        {
            return db.Set<T>().ToList();
        }

        public T FillBy(object id)
        {
            return db.Set<T>().Find(id);
        }
    }

那么为什么需要一个通用页面呢? 如果在所有页面中都有一些共同的任务,您只需制作一个通用方法来完成这项工作。下面是一个非常示例的用法。假设您的 dbcontext 中有USERSORDERS表

public class UsersPage<USERS>:MyPageBase<USERS>{

  public void Index()
  {
     var filledData = Fill<USERS>();
  }
}

public class UsersPage<ORDERS >:MyPageBase<ORDERS >{

  public void Index()
  {
     var filledData = Fill<ORDERS>();
  }
}

当然你可以很容易地做到这一点

var filledData = db.USERS.ToList();

你可以问为什么这么大惊小怪?实现通用方法,但有时会发生比获取所有记录等更复杂的场景。

假设您有 20 多个表,并且您决定从每个表中仅填充 5 条记录。如果没有通用实现,您就知道必须翻遍 20 多页并更改代码

var filledData = db.TABLE_TYPE.ToList();

var filledData = db.TABLE_TYPE.Take(5).ToList()

但是使用泛型你可以用下面的方法修复它,你甚至可以让它参数化

public List<T> Fill()
    {
        return db.Set<T>().Take(5).ToList();
    }

你很安全..

现在如果您要使用 MyPageBase 的非通用实现

所有这些你需要做的事情,你必须一遍又一遍地写它们。

当然,编写越来越多的代码会给你带来经验,但是当你在一个程序中工作一段时间后,尤其是在大规模程序中工作时,你希望让事情尽可能简单、易于理解和可维护......

我很抱歉我的英语不好,

我希望我很清楚,这对你有帮助!

于 2020-01-10T11:15:44.730 回答