clw*_*isk 3 java oop encapsulation helpermethods
背景:我有一个大型(几百行)类,它管理基于一些原始类型数据结构的概念
long[] slist; //list of unique patterns (related to polyominoes)
int[][][] sref;//patterns at each place [location][depth][<list of indices in slist>]
Run Code Online (Sandbox Code Playgroud)
问题:填充和更新这些数据的两种方法会很长,有少量 5-20 行任务,有些是共享的,有些是独特的。我可能想为每个子任务制作一个辅助方法。
update(...){
//do A
//do B
//do C
//...
}
build(){
//do D
//do B
//do E
//...
}
Run Code Online (Sandbox Code Playgroud)
问题是如果一个文件中有太多不相关的辅助方法,可读性不会提高。
这个问题的答案让我大部分时间都在那里。我可以在同一个包中,在它们自己的类中声明结构,并访问原始成员字段或调用相关方法。但我仍然想知道这里公认的智慧,因为这个组织并不容易想到。
你会在他们自己的文件中放置update()和build()运行吗?如果是这样,他们的共同任务应该在哪里声明?
我强烈推荐阅读Martin Fowler 的Refactoring(亚马逊链接);它应该在每个程序员的库中,并且会在这样的情况下帮助您。我会在帖子中提到它。
如果一个类有太多的代码,那么通常是时候拆分这个类了。这可能需要创建具有类的成员变量(委托功能),或者可能意味着动态创建一个对象(用方法对象替换方法)。具有共性的事物是应用继承或状态/策略模式的好例子。
是的,您甚至会将这些功能放在它们自己的文件中。但是,我会让他们上课。也许Updater和Builder对象。您可以继承自BuilderCommon和UpdaterCommon类。这些新对象将耦合到旧对象,但没关系。您可以考虑将这些新的类集放在它们自己的包中。分层组织将有助于提高通用代码的可读性和重用性。尝试利用继承等概念和泛型等抽象技术为您完成工作。如果您能找到、 等之间的共性doA,请从它们中doB创建UpdateHelper类并将它们放在一个列表中。然后简单地遍历列表。
这只是执行此操作的众多方法之一:
public class Updater
{
public Updater(List<IUpdateHelper> helpers)
{
helpers = new ArrayList<UpdateHelper>();
this.helpers.add(helpers);
}
public void update()
{
for (IUpdateHelper helper : helpers)
{
helper.performHelp();
}
}
protected List<IUpdateHelper> helpers;
}
public class UpdaterCommon extends Updater
{
public UpdaterCommon()
{
helpers.add(new UpdateHelperA());
... // Etc.
}
}
/*
* This uses inheritance for common helpers, but it could just as well use
* delegation. Also, this assumes that order of invocation for each helper
* doesn't matter.
*/
public class UpdaterOne extends UpdaterCommon {...}
interface IUpdateHelper
{
public void performHelp();
}
public class UpdateHelperA implements IUpdateHelper {...}
Run Code Online (Sandbox Code Playgroud)
绝对用对象替换这些数组并添加一个接口。
根据我的经验,通常只需要定期应用其中的一些概念,就可以显着提高代码质量。如果包、类、方法、条件等变得不守规矩,请将其分解为更小的单元。继续将基本功能推入非常小的方法中,以便您可以从高层次查看代码。