通过方法链接将大类拆分为小类

如何解决通过方法链接将大类拆分为小类

我有一个关于如何将一个大类分成几个小类的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(){ }
}

该类的三个方面使我难以确定该类是否可以拆分:

  1. 上述方法链接
  2. 尽管每个公共组中的方法都不会调用其他公共组中的方法,但是私有组中的方法可以由任何组中的任何公共方法来调用。
  3. 同样,所有四个组中的方法都可以访问和修改类成员。

因此,由于某些或所有这些原因,我不确定是否可以将此类分为多个单独的类。

我曾考虑将私有组中的方法移至新类(例如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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-