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方式是什么?
所有评论都非常感谢!
那么,这段代码所在的类显然有太多的责任.我不会去尽可能隐藏所有的东西在一个门面,但不是有相关的一些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规则.
哇 !它看起来不像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
我的问题是 - 是一段明确驱动你的应用程序的代码,例如,表示程序编程,
不可能说这个代码片段是否"太程序化".
这些电话可能都是以实例方法的当前对象,无论是对不同的对象,或在当前实例的实例变量操作.这些将使代码OO,至少在某种程度上.
如果这些方法是static,那么代码确实是程序性的.这是否是一件坏事取决于方法是否正在访问和更新存储在static字段中的状态.(从名称来看,他们可能需要这样做.)
如果是这样,那么实现相同结果的更多OO方式是什么?
如果不看其余代码就很难说,但图片中似乎有一些隐含的对象; 例如
engine某种其中一些可能需要是类(如果它们不是类)...但哪些取决于它们正在做什么,它们有多复杂等等.通过将静态变量转换为实例变量,可以使类(无论出于什么原因)变得"更OO"的状态没有意义.
其他答案建议特定的重构,摆脱所有全局变量,使用依赖注入等.我的看法是,没有足够的信息来判断这些建议是否会有所帮助.
仅仅使应用程序"更多OO"并不是一个有用或有价值的目标.您的目标应该是使代码更具可读性,可维护性,可测试性,可重用性等.使用OO是否会改善问题取决于代码的当前状态,以及新设计的质量和重构工作.简单地采用OO实践不会纠正糟糕的设计,或将"坏"代码转换为"好"代码.