开始一个新项目,如何组织它? [关闭]

Posted

技术标签:

【中文标题】开始一个新项目,如何组织它? [关闭]【英文标题】:Starting a new project, how to structure it? [closed] 【发布时间】:2014-07-07 00:20:57 【问题描述】:

我有一个非常简单的 Java 任务,我不确定要为我的项目提供哪种结构。

我想用 Java 创建一个小项目,进行一些统计计算。例如,我需要创建一个获取数组并返回平均值的方法,另一个获取数组并返回标准差的方法,我还需要一个获取两个数组并返回相关系数的方法。

我想知道的是,既然我在 Eclipse 中打开了一个新项目,该怎么做?

应该全部在一个类中吗?我应该为每个方法都有一个单独的类,使其成为静态方法吗?最后,我想将此代码提供给其他人以将其集成到他的项目中。我需要尽可能简单高效地做到这一点。

你能指导我怎么做吗?一节课,几节课?公共/私人?我不熟悉这些东西,但我可以自己编写方法。

提前谢谢你

【问题讨论】:

如果这是一项简单的任务,那么只需使用一个类。 您在问一个关于基本 OO 原则的问题 - 有很多答案。对于初学者,请尝试阅读 en.wikipedia.org/wiki/SOLID_(object-oriented_design)。 单班还是分班,看你自己 根据您的描述(意思是标准差,...),听起来您应该能够在单个类中实现静态方法。如果您不需要在方法调用之间维护状态,则静态方法很有意义。 【参考方案1】:

您的所有方法都具有以下属性:

    只要您给它们足够具体的名称,它们就不可能有其他实现。毕竟数学不会改变。这意味着您可能不需要接口或子类之类的结构。

    当人们使用它们时,他们倾向于使用其中的几个或按功能分组。这意味着您应该按用法对方法进行分组,例如统计方法;信号处理方法;等等。

    方法不保持内部状态,所有输出都返回,没有其他调用者/线程的任何副作用。因此,您的方法不必让类包含它们自己或任何状态变量。

    您的方法本质上是主程序的提供程序实用程序,但方法的语义不会因调用者或调用上下文而有所不同。

因此,正如以上所有内容所示,您的方法应按其性质或用途分组在 1 个或多个类中。这些方法应该是没有任何副作用的静态方法。这正是 java.lang.Math 所做的。

【讨论】:

【参考方案2】:

我想用 Java 创建一个小项目,进行一些统计计算。例如,我需要创建一个获取数组并返回平均值的方法,另一个获取数组并返回标准差的方法,我还需要一个获取两个数组并返回相关系数的方法。

在我看来,您有兴趣创建一个用于统计计算的实用程序类。如何实现的范围非常广泛,但建议遵循常见的编码约定和基本的 OOP 概念。

应该全部在一个类中吗?我应该为每个方法都有一个单独的类,使其成为静态方法吗?

由于每种方法(均值、标准差...)都与相同的核心背景相关(即执行一些统计计算),因此为每个方法设置一个单独的静态方法似乎是合乎逻辑的您需要创建的功能。

当然,您必须注意基本的 OOP 概念,例如(数据隐藏)保持字段私有并正确公开它们的公共 getter/setter。此外,将您的计算方法保持私有并仅公开调用您的私有函数的公共方法是一个好主意。像

public class MyUtilityClass
    // A bunch of private fields
    int field1; ...


    private MyUtilityClass() // We don't want anyone to create an object of this class

    // method exposed to user
    public static float calcArithmeticMean(float[] arr1, float[] arr2)
        return getMean(arr1, arr2);
    

    // method for internal use
    private float getMean(float[] f1, float[] f2)
        //do your calculation here
    



    // remember to expose only those fields that you want the user be able to access
    // getter/setters here


最后,我想将此代码提供给其他人,以便将其集成到他的项目中。

如果您遵循正确的 OOP 编码约定,那么您的实用程序类将是可移植的,并且任何人都可以在他们的应用程序中理解和扩展它。

【讨论】:

【参考方案3】:

我将创建一个单独的类来表示数字数组本身。

   public class DataSet extends HashSet<Double> 
        public double mean () 
            // implementation
        
        public double standardDeviation () 
            // implementation
        
        public double correlationCoefficient (DataSet other) 
            // implementation
        
    

【讨论】:

【参考方案4】:

我的第一个建议是使用Maven 开始您的项目。它为您提供了一个可靠的项目结构和一个很好的工具来管理您的 jar 文件依赖项和构建生命周期。此外,包括 Eclipse 在内的所有主要 Java IDE 都可以轻松创建、理解和使用您的 Maven 设置。

其次,对于您的应用程序设计,建议避免使用大量静态方法,因为它们会损害您的代码的可测试性,如for example explained here。

关于类和方法的数量,这取决于您的具体用例,但指导原则是尝试根据它们的职责将相似的方法聚合到一个类中,如果一个类处理的职责过多,则将类分开单班。 Low coupling and high cohesion 在这种情况下是你的朋友。

数组可能比集合稍快,但要小心使用它们,因为they are reifiable and do not mix well with generics。一般依赖Collections。另外,如果您可以使用 Java 版本 8,请查看 Streams API。

最后但同样重要的是,Java 有大量的开源代码。因此,在开始编写库之前,请务必先查找库。如果是数学,请查看 this 和 that。

【讨论】:

【参考方案5】:

为每种计算类型创建一个具有不同方法的类(对每种计算类型(均值、标准差等一种方法)具有公共访问权限)。根据您的方便,这些方法可以在内部引用另一个不可公开访问的实用程序类中的辅助方法。

将所有这些类放在一个包中并将其导出以集成到其他项目中。

由于它将被其他人用作其他人的库,因此请确保您尽可能多地记录和评论它。

【讨论】:

【参考方案6】:

我投票支持单节课。方法应该是静态的,您不想显示的参数应该是私有的。

【讨论】:

【参考方案7】:

这取决于很多事情,例如项目的其他部分、未来的更改和扩展,... 我建议从single-class/public-static 开始,并在您扩展项目时根据需要更改它。

【讨论】:

以上是关于开始一个新项目,如何组织它? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何组织 C++ 项目 [关闭]

Azure DevOps - 组织项目和存储库

组织跨平台 C/C++ 项目 [关闭]

在 PHP 项目中,存在哪些存储、访问和组织辅助对象的模式? [关闭]

组织 Web 应用程序 [关闭]

Django项目工作目录结构的最佳实践[关闭]