何时创建辅助方法和单独的文件

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()运行吗?如果是这样,他们的共同任务应该在哪里声明?

Col*_*nic 5

我强烈推荐阅读Martin Fowler 的Refactoring亚马逊链接);它应该在每个程序员的库中,并且会在这样的情况下帮助您。我会在帖子中提到它。

如果一个类有太多的代码,那么通常是时候拆分这个类了。这可能需要创建具有类的成员变量(委托功能),或者可能意味着动态创建一个对象(用方法对象替换方法)。具有共性的事物是应用继承或状态/策略模式的好例子。

简答

是的,您甚至会将这些功能放在它们自己的文件中。但是,我会让他们上课。也许UpdaterBuilder对象。您可以继承自BuilderCommonUpdaterCommon类。这些新对象将耦合到旧对象,但没关系。您可以考虑将这些新的类集放在它们自己的包中。分层组织将有助于提高通用代码的可读性和重用性。尝试利用继承等概念和泛型等抽象技术为您完成工作。如果您能找到、 等之间的共性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)

绝对用对象替换这些数组并添加一个接口。

关闭

根据我的经验,通常只需要定期应用其中的一些概念,就可以显着提高代码质量。如果包、类、方法、条件等变得不守规矩,请将其分解为更小的单元。继续将基本功能推入非常小的方法中,以便您可以从高层次查看代码。