如何避免重复?
How to avoid duplication?
我正在制作 C# 应用程序。该应用程序有两个 classes 和多个方法。在编写代码时,我偶然发现了一个问题。我在 classes 中使用相同的两个变量(XList 和 YList)和一个方法。并且我可能需要更多 classes 来处理此代码。所以我创建了一个重复问题。下面是我的代码的一个简单版本:
public class A {
private testEntities db = new testEntities();
public List<int> XList = new List<int>();
public List<int> YList = new List<int>();
public void GetAllInfo()
{
// Get the data from a database and add to a list
XList = db.Table1.ToList();
YList = db.Table2.ToList();
}
public void DoStuff()
{
// Do Stuff with XList and YList
}
}
public class B {
private testEntities db = new testEntities();
public List<int> XList = new List<int>();
public List<int> YList = new List<int>();
public void GetAllInfo()
{
// Get the data from a database and add to a list (the same as in class A)
XList = db.Table1.ToList();
YList = db.Table2.ToList();
}
public void DoDifferentStuff()
{
// Do ddifferent stuff with XList and YList then in class A
}
}
我的问题是解决这个重复问题的最佳方法是什么?
经过一些研究,我发现我可以通过继承或组合来解决这个问题。我还读到人们选择组合而不是继承。所以我写了下面的代码来解决重复问题:
public class DataPreparation
{
private testEntities db = new testEntities();
public List<int> XList = new List<int>();
public List<int> YList = new List<int>();
public void GetAllInfo()
{
// Get the data from a database and add to a list
XList = db.Table1.ToList();
YList = db.Table2.ToList();
}
// Implement other methods
}
public class A
{
public void MethodName()
{
DataPreparation dataPreparation = new DataPreparation();
dataPreparation.GetAllInfo();
UseDataX(dataPreparation.XList);
UseDataY(dataPreparation.YList);
// Implementation UseDataX() and UseDataY()
}
}
public class B
{
public void MethodName()
{
DataPreparation dataPreparation = new DataPreparation();
dataPreparation.GetAllInfo();
VisualizeDataX(dataPreparation.XList);
VisualizeDataY(dataPreparation.YList);
// Implementation VisualizeDataX() and VisualizeDataY()
}
}
如您所见,我制作了一个 class 来处理从数据库中获取数据。 class A 和 B 使用 DataPreparation class。
但这是解决重复的最好方法吗?还是我应该使用继承或其他方式?
一个简单的选择是使用 inheritance。使用共享功能创建基础 class,A
和 B
可以从中继承。例如:
public abstract class Base
{
private testEntities db = new testEntities();
public List<int> XList = new List<int>();
public List<int> YList = new List<int>();
public void GetAllInfo()
{
// Get the data from a database and add to a list
XList = db.Table1.ToList();
YList = db.Table2.ToList();
}
}
public class A : Base
{
public void DoStuff()
{
// Do Stuff with XList and YList
}
}
public class B : Base
{
public void DoDifferentStuff()
{
// Do ddifferent stuff with XList and YList then in class A
}
}
我认为你应该只有一种方法叫做 DoStuff()
而不是一种叫做 DoStuff()
和另一种叫做 DoDifferentStuff()
.
然后你可以创建一个ABC来实现公共代码,并且有一个抽象的DoStuff()
方法,在派生的classes:
中实现不同
public abstract class Base
{
private testEntities db = new testEntities();
public List<int> XList = new List<int>();
public List<int> YList = new List<int>();
public void GetAllInfo()
{
// Get the data from a database and add to a list (the same as in class A)
XList = db.Table1.ToList();
YList = db.Table2.ToList();
}
public abstract void DoStuff();
}
public class A: Base
{
public override void DoStuff()
{
// Do Stuff with XList and YList
}
}
public class B: Base
{
public override void DoStuff()
{
// Do ddifferent stuff with XList and YList then in class A
}
}
(我也认为拥有这样的 public 字段是个坏主意 - 但我 guessing/hoping 这只是示例代码,您的真实代码没有这些.. .)
其他代码(创建 A
或 B
的代码除外)将通过 Base
class 类型使用该对象。
我正在制作 C# 应用程序。该应用程序有两个 classes 和多个方法。在编写代码时,我偶然发现了一个问题。我在 classes 中使用相同的两个变量(XList 和 YList)和一个方法。并且我可能需要更多 classes 来处理此代码。所以我创建了一个重复问题。下面是我的代码的一个简单版本:
public class A {
private testEntities db = new testEntities();
public List<int> XList = new List<int>();
public List<int> YList = new List<int>();
public void GetAllInfo()
{
// Get the data from a database and add to a list
XList = db.Table1.ToList();
YList = db.Table2.ToList();
}
public void DoStuff()
{
// Do Stuff with XList and YList
}
}
public class B {
private testEntities db = new testEntities();
public List<int> XList = new List<int>();
public List<int> YList = new List<int>();
public void GetAllInfo()
{
// Get the data from a database and add to a list (the same as in class A)
XList = db.Table1.ToList();
YList = db.Table2.ToList();
}
public void DoDifferentStuff()
{
// Do ddifferent stuff with XList and YList then in class A
}
}
我的问题是解决这个重复问题的最佳方法是什么?
经过一些研究,我发现我可以通过继承或组合来解决这个问题。我还读到人们选择组合而不是继承。所以我写了下面的代码来解决重复问题:
public class DataPreparation
{
private testEntities db = new testEntities();
public List<int> XList = new List<int>();
public List<int> YList = new List<int>();
public void GetAllInfo()
{
// Get the data from a database and add to a list
XList = db.Table1.ToList();
YList = db.Table2.ToList();
}
// Implement other methods
}
public class A
{
public void MethodName()
{
DataPreparation dataPreparation = new DataPreparation();
dataPreparation.GetAllInfo();
UseDataX(dataPreparation.XList);
UseDataY(dataPreparation.YList);
// Implementation UseDataX() and UseDataY()
}
}
public class B
{
public void MethodName()
{
DataPreparation dataPreparation = new DataPreparation();
dataPreparation.GetAllInfo();
VisualizeDataX(dataPreparation.XList);
VisualizeDataY(dataPreparation.YList);
// Implementation VisualizeDataX() and VisualizeDataY()
}
}
如您所见,我制作了一个 class 来处理从数据库中获取数据。 class A 和 B 使用 DataPreparation class。 但这是解决重复的最好方法吗?还是我应该使用继承或其他方式?
一个简单的选择是使用 inheritance。使用共享功能创建基础 class,A
和 B
可以从中继承。例如:
public abstract class Base
{
private testEntities db = new testEntities();
public List<int> XList = new List<int>();
public List<int> YList = new List<int>();
public void GetAllInfo()
{
// Get the data from a database and add to a list
XList = db.Table1.ToList();
YList = db.Table2.ToList();
}
}
public class A : Base
{
public void DoStuff()
{
// Do Stuff with XList and YList
}
}
public class B : Base
{
public void DoDifferentStuff()
{
// Do ddifferent stuff with XList and YList then in class A
}
}
我认为你应该只有一种方法叫做 DoStuff()
而不是一种叫做 DoStuff()
和另一种叫做 DoDifferentStuff()
.
然后你可以创建一个ABC来实现公共代码,并且有一个抽象的DoStuff()
方法,在派生的classes:
public abstract class Base
{
private testEntities db = new testEntities();
public List<int> XList = new List<int>();
public List<int> YList = new List<int>();
public void GetAllInfo()
{
// Get the data from a database and add to a list (the same as in class A)
XList = db.Table1.ToList();
YList = db.Table2.ToList();
}
public abstract void DoStuff();
}
public class A: Base
{
public override void DoStuff()
{
// Do Stuff with XList and YList
}
}
public class B: Base
{
public override void DoStuff()
{
// Do ddifferent stuff with XList and YList then in class A
}
}
(我也认为拥有这样的 public 字段是个坏主意 - 但我 guessing/hoping 这只是示例代码,您的真实代码没有这些.. .)
其他代码(创建 A
或 B
的代码除外)将通过 Base
class 类型使用该对象。