如何解决通过方法链接将大类拆分为小类
我有一个关于如何将一个大类分成几个小类的OOP问题。
下面的类有很多方法。我已经将这些方法分组。每组公共方法仅适用于该类所代表的现实世界业务对象的特定子部分。理想情况下,我希望将此类拆分为较小的类,例如(这些是粗略的名称,但它们仅用于说明目的):
- MyBusinessObjectGroupOne
- MyBusinessObjectGroupTwo
- MyBusinessObjectGroupThree
请注意,公共方法返回相同的类对象,因为这些方法是使用方法链调用的。而且,每个小组可以而且将拥有的方法不仅仅只有四个。
public class MyBusinessObject{
private object memberOne;
private object memberTwo;
private object memberThree;
//METHOD GROUP ONE
public MyBusinessObject Method1(){ }
public MyBusinessObject Method2(){ }
public MyBusinessObject Method3(){ }
public MyBusinessObject Method4(){ }
//METHOD GROUP TWO
public MyBusinessObject Method5(){ }
public MyBusinessObject Method6(){ }
public MyBusinessObject Method7(){ }
public MyBusinessObject Method8(){ }
//METHOD GROUP THREE
public MyBusinessObject Method9(){ }
public MyBusinessObject Method10(){ }
public MyBusinessObject Method11(){ }
public MyBusinessObject Method12(){ }
//METHOD GROUP FOUR
private void Method13(){ }
private void Method14(){ }
private void Method15(){ }
private void Method16(){ }
}
该类的三个方面使我难以确定该类是否可以拆分:
- 上述方法链接
- 尽管每个公共组中的方法都不会调用其他公共组中的方法,但是私有组中的方法可以由任何组中的任何公共方法来调用。
- 同样,所有四个组中的方法都可以访问和修改类成员。
因此,由于某些或所有这些原因,我不确定是否可以将此类分为多个单独的类。
我曾考虑将私有组中的方法移至新类(例如MyUtils
);并将类成员移至另一个新类(例如MyData
),该类的实例可以由MyUtils
传递给ref
。
因此,我可以将每个方法组移到各自的类中,并通过MyData
传递ref
,它们也可以使用MyUtils
。
对于上面的第2点和第3点,这是正确的方法吗? 我不确定将这些方法移到新类对方法链的影响。
编辑 这是对以下相关评论的回应。我正在研究这个问题,只是为了减少班级人数。我的目标不是通过拆分类来增加任何其他的体系结构灵活性或功能。它基本上是用于代码结构和组织的。我还知道,大型类中的方法在不同的单独逻辑组中的代码可能会违反单一责任原则。
解决方法
您可以使MyBusinessObject
为基类,从那里删除特定于组的方法,仅保留所有由protected
访问修饰符共享的方法。然后创建三个从MyBusinessObject
派生的类,以便这三个类都可以访问共享方法。然后在每个这些类上包括特定于组的方法。那应该给您较小的类提供链接的能力。像这样:
public class MyBusinessObject {
// You might need to move these to one of the derived classes .......
private object memberOne;
private object memberTwo;
private object memberThree;
//METHOD GROUP FOUR
protected void Method13(){ }
protected void Method14(){ }
protected void Method15(){ }
protected void Method16(){ }
}
public class Group1 : MyBusinessObject
{
//METHOD GROUP ONE
public Group1 Method1(){ }
public Group1 Method2(){ }
public Group1 Method3(){ }
public Group1 Method4(){ }
}
public class Group2 : MyBusinessObject
{
//METHOD GROUP TWO
public Group2 Method5(){ }
public Group2 Method6(){ }
public Group2 Method7(){ }
public Group2 Method8(){ }
}
public class Group3 : MyBusinessObject
{
//METHOD GROUP THREE
public Group3 Method9(){ }
public Group3 Method10(){ }
public Group3 Method11(){ }
public Group3 Method12(){ }
}
编辑:
基于澄清,此方法将不起作用,因为可能需要在不同组之间链接呼叫。
基于此信息,恕我直言,使代码更具可读性的最简单方法是使用partial
类将其拆分为不同的文件。正确的做法可能是重新设计,并创建更小,更简洁和更狭窄的类,但这将涉及重构工作,而这可能是昂贵的。
尝试通过扩展名(伪代码)
static class ExtensionGroup1
{
public static MyBusinessObject Method1_1(){ this MyBusinessObject onj,... }
public static MyBusinessObject Method1_2(){ this MyBusinessObject onj,... }
public static MyBusinessObject Method1_3(){ this MyBusinessObject onj,... }
public static MyBusinessObject Method1_4(){ this MyBusinessObject onj,... }
}
static class ExtensionGroup2
{
public static MyBusinessObject Method2_1(){ this MyBusinessObject onj,... }
. . . . ..
}
然后在您的主班级,您可以做...
class Context
{
int Var1 {get;set}
int Var2 {get;set}
}
private int _var1;
private bool _var2;
void SomeMethod(MyBusinessObject someObject)
{
var ctx = new Context(){ Var1 = _var1,Var2 = _var2 }
this.Method1_1(ctx).Method2_1(ctx)...
}
请注意-您将可以为相同或不同的组混合使用方法。并且,尤其要注意,您的扩展将需要使用当前的主类作为上下文类,因此Method1_1(this)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。