如何使用许多单一责任的方法重构一个大类?

时间:2017-01-13 08:18:35

标签: java oop design-patterns optimization refactoring

搜索设计模式和更好的代码优化主要是关于如何创建类图的类和工具之间的继承和关系的文章。我想对一个大班的怎么说,分开一点。我正在开发一个java程序,其中一个类已经超过了1600行代码和大约20种方法。它的作用是从数据源查询数据并生成大量文本文件。

现在有很多数据修改逻辑(对于我已经创建了小方法的每个逻辑)继续查询数据,如:

- 检查用户的数据日期并执行更改
- 字符串
-logic检查是否需要忽略记录

并将过滤后的数据存储在Collection中并生成文本文件。我不认为为每个小逻辑创建单独的类是个好主意。也许我可以创建单独的实用程序类并将静态方法添加到其中?我无法发布保密问题的代码。如果有人可以轻松一点,让我思考正确的方向,这将是伟大的。感谢。

3 个答案:

答案 0 :(得分:7)

你能做的最好的事情就是忘记代码做什么,并考虑 的内容。

根据你给出的描述,你仍然是#34;思考你的代码应该做什么。它查询数据源,检查日期,附加字符串,过滤器等。这对于功能或程序方法来说没有错,但对于面向对象的代码并不理想。

尝试一下,忘记它应该做什么,并思考什么"事情"它是关于。是那些东西帐户,用户,机器,VirtualServers等。那个巨大的文本文件是什么?它是UsageReport,BalanceSheet等。

一旦你得到了"事物",你就可以开始思考什么"责任"你需要分配每一个。再次,"查询数据库"是不是的责任。您必须对所获得的数据执行某些操作,例如生成UsageReport, 是一种责任。

简而言之,这就是OO。还有一些指示:尽量避免使用实用程序,尽量避免使用getter,尽量避免使用setter。尽量避免服务,处理器,处理程序,渲染器和类似的类。这些不是"事情",但通常是伪装的程序。

答案 1 :(得分:2)

也许您应该考虑您的初始前提是否正确。单一责任原则规定,一个班级应该只有一个改变的理由。

对于您所描述的类,有多种职责:查询数据源,过滤,字符串操作(表示?),文本文件生成。

每个都应该分成自己的类。这解决了问题并提供了更小的更易于管理的代码。

答案 2 :(得分:1)

SRP (Single Responsibility Principle) 表示我们应该只有一个理由来更改课程。即一个班级应该只有一个责任。所以一个班级应该只做一件事。因此,在理想的面向对象环境中,我们将为每项工作提供类。

例如:

假设您正在构建具有基本数学支持的计算器应用程序。假设您必须实现汇总两个数字功能。以理想的方式,你必须做这样的事情。

public interface NumberMath{
    public float value();
}

public class Sum extends NumberMath{
    private float num1;
    private float num2;

    public Sum(float num1, float num2){
        this.num1 = num1;
        this.num2 = num2;
    }

    @Overrride
    public float value(){
        return num1 + num2;
    }
}

我认为你已经发现它会让我们的代码变得冗长。因此,实际上没有人会以理想的方式遵循面向对象(或 SRP )。相反,我们大多数人更喜欢一个包含求和,减法,除法,乘法等方法的类。它使我们的代码更简洁。

但是在你的情况下 1600行代码,其中包含20个1类方法,不能很好

将大型单个类分解为多个简单类的最佳方法

  • 识别独立方法。
  • 将类似的小方法(行为)合并到一个具有该类适当范围的类中,以及一个可以正确定义该范围的名称。
  • 尝试通过坚持使用方法重用来完全避免代码重复。

由于细节有限,再次为您的问题提供非常具体的答案有点困难。无论如何希望这有帮助。 :)