我的代码是否过于程序化?

Qua*_*Oat 11 java oop procedural-programming

最近有人看了我的代码并评论说它过于程序化.需要说明的是,他们看到的代码并不多 - 只是一个部分清楚地概述了应用程序中采取的逻辑步骤.

if(downloadFeeds(ftpServer, ftpUsername, ftpPassword, getFtpPathToLocalPathMap())) {
    loadDataSources();
    initEngine();
    loadLiveData();
    processX();
    copyIds();
    addX();
    processY();
    copyIds();
    addY();
    pauseY();
    resumeY();
    setParameters();
}
Run Code Online (Sandbox Code Playgroud)

然后,这些不同的方法创建了一大堆不同的对象,并根据需要在这些对象上调用各种方法.

我的问题是 - 是一段明确驱动你的应用程序的代码,例如,指示程序编程,如果是这样,那么实现相同结果的更多OO方式是什么?

所有评论都非常感谢!

ata*_*man 7

那么,这段代码所在的类显然有太多的责任.我不会去尽可能隐藏所有的东西在一个门面,但不是有相关的一些FTP引擎,数据源和位于一个神的对象(反模式)其他实体的所有的东西,应该有一个业务流程其中有所有这些实体.

所以代码看起来更像是这样的:

if(downloadFeeds(ftpServer, ftpUsername, ftpPassword, getFtpPathToLocalPathMap())) {
    datasource.load();
    engine.init();
    data.load();
    engine.processX(data);
    data.copyIds()
    foo.addX();
    engine.processY();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

数据源,引擎和所有其他组件可能会被注入到您的业务流程中,因此a)测试变得更容易,b)简化交换实现并且c)代码重用是可能的.

请注意,程序化的代码并不总是坏的:

class Person {
    public void getMilk() 
    {
        go(kitchen);
        Glass glass = cupboard.getGlass(); 
        fridge.open(); 
        Milk milk = fridge.getMilk(); 
        use(glass, milk);
        drink(glass);
    } 
    // More person-ish stuff
}
Run Code Online (Sandbox Code Playgroud)

虽然该代码显然是程序性的,但它可能没问题.它完全清楚这里发生了什么,不需要任何文档(马丁的干净代码鼓励像这样的代码).只需记住单一责任原则和所有其他基本OOP规则.

  • @mohamed这是一个公平的观点,但我不认为玻璃应该由牛奶填充.也许应该没有getMilk方法,只是一种通用饮料(饮料d)一种?设计很有趣! (2认同)

Erh*_*mir 6

哇 !它看起来不像OO风格.这样怎么样:

    ConnectionData cData = new ConnectionData(ftpServer, ftpUsername, ftpPassword, getFtpPathToLocalPathMap());


    if(downloadFeeds(cData)) {
      MyJobFacade fc = new MyJobFacade(); 
      fc.doYourJob();
    }
Run Code Online (Sandbox Code Playgroud)

MyJobFacade.java

public class MyJobFacade {

    public void doYourJob() {
          /* all your do operations maybe on different objects */
    }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下Facade Pattern http://en.wikipedia.org/wiki/Facade_pattern


Ste*_*n C 6

我的问题是 - 是一段明确驱动你的应用程序的代码,例如,表示程序编程,

不可能说这个代码片段是否"太程序化".

  • 这些电话可能都是以实例方法的当前对象,无论是对不同的对象,或在当前实例的实例变量操作.这些将使代码OO,至少在某种程度上.

  • 如果这些方法是static,那么代码确实是程序性的.这是否是一件坏事取决于方法是否正在访问和更新存储在static字段中的状态.(从名称来看,他们可能需要这样做.)

如果是这样,那么实现相同结果的更多OO方式是什么?

如果不看其余代码就很难说,但图片中似乎有一些隐含的对象; 例如

  • 数据源和(可能)数据源管理器或注册表
  • engine某种
  • 用于保存实时数据,X和Y的东西
  • 等等.

其中一些可能需要是类(如果它们不是类)...但哪些取决于它们正在做什么,它们有多复杂等等.通过将静态变量转换为实例变量,可以使类(无论出于什么原因)变得"更OO"的状态没有意义.


其他答案建议特定的重构,摆脱所有全局变量,使用依赖注入等.我的看法是,没有足够的信息来判断这些建议是否会有所帮助.


但是这值得吗?

仅仅使应用程序"更多OO"并不是一个有用或有价值的目标.您的目标应该是使代码更具可读性,可维护性,可测试性,可重用性等.使用OO是否会改善问题取决于代码的当前状态,以及新设计的质量和重构工作.简单地采用OO实践不会纠正糟糕的设计,或将"坏"代码转换为"好"代码.