Android应用程序架构:应该如何形成软件包?

时间:2015-10-15 15:14:59

标签: java android architecture

我是Android编程新手。我经常看到程序员创建包作为活动,片段,适配器等的集合。对我而言,将活动/屏幕所需的所有Java代码放在一个地方似乎更直观。例如:对于主屏幕,我将在一个地方保留活动,片段,适配器,自定义视图等。 这种一般做法是否有任何明确的原因,还是仅仅是一种传统做法?

4 个答案:

答案 0 :(得分:4)

这与在代码库中增长时创建组件,可重用对象和代码维护有关。您的方法适用于小型应用程序,并且没有针对它的规则。但是,通常根据建议和常用方法创建包/文件结构,可以更容易地对代码进行修改并与同一项目中的其他人一起工作。请考虑以下事项:

如果您有许多活动分布在许多软件包或文件夹中,那么负责更改UI的人员必须遍历这些软件包。这使得很难识别可以在Activities中使用的UI模式,甚至更难使用这些模式,因为您需要在每个包/文件夹中实现它们。

这也会在非UI组件(例如数据对象模型,视图控制器等)中看到不太明显的模式时出现问题。例如,如果您需要两个不同Activities中的“用户”对象,您是否创建了2不同的对象?这不是可重复使用的代码。

因此,假设您决定重复使用“user”对象,这样您就只有1个类。然后你在其他需要它的包中进行子类化以便遵循你的模式吗?然后,如果一个UI元素需要一个新方法,你是否只在那个地方实现它?还是基础对象?

或者您是否将“用户”对象公开并从其他包/文件夹中引用它?如果这是您的答案,那么您将开始根据代码的演变在某些位置创建对象,而不是基于逻辑或易于维护。除此之外,这使得培训新人很难在代码库中的“所有内容”进行培训。 “用户”对象将位于一个位置,然后“用户帐户”对象最终会在首次需要的位置结束,但不太可能与“用户”对象一起使用。

随着项目增长到数百个类,我认为很明显这种方法对于许多应用程序来说变得难以管理。类将基于UI要求出现在包中,而不是基于它执行的功能。保持它们变得具有挑战性。

例如,在Lollipop到Marshmallow的情况下,Apache http已被弃用。如果您在整个项目中分散了这种依赖关系,那么您将在很多方面寻找如何处理此更改。在一个可能很好的小项目上,但是如果你在其他开发过程中尝试这样做的话,在一个更大的项目上,这可能会变得非常混乱,因为你现在正在修改许多包和文件夹而不是仅在几个位置。

但是,如果您有一个数据访问层或模型层组件将行为封装在一个或多个文件夹中,那么您的更改范围将更容易被您周围的人看到。将更改合并到项目中时,与您合作的人员可以轻松了解其他组件是否受到影响。

因此,虽然没有必要遵循这些指导原则(特别是对于小型项目),但随着项目的发展和几个或许多人参与开发,您将看到变化,但一般的做法是按目的或功能分组而不是按UI /可视组件分组。如果你开始使用其中的一些,你将在以后处理更改的工作量减少。 (但是,从项目早期的过多结构支持开始可能会使项目面临永不完成的风险......)

有几个答案提供了指南的链接。我希望这个答案有助于解释为什么存在这些指导原则,我认为这是你问题的核心。

答案 1 :(得分:2)

  

一般的做法是否有任何明确的理由,或者只是   传统做法?

是。在我当前的应用程序中,我有超过50个自定义UI视图和一些活动。至少10个单例控制器和很多数据库模型。所以to not lost在项目中,我使用了这样一个整洁的结构:

Activity
Adapter
Controller
Native
Model
-Database
-Rest
Ui

我建议你使用这种结构。

答案 2 :(得分:1)

没有正式的规则,也许是我没想到的最佳实践。

我现在得到一个基于意见的答案:
我使用包名将类分组为适配器,活动等逻辑主题。

如果你想要另一个结构就像你想要的那样,只是它可能会混淆其他开发者。

请记住,包名称应该是唯一的,因此您应该使用类似您拥有的域名的前缀,或者允许您使用(以相反的顺序排列)。

另请查看此链接,其中指出了更多想法:http://www.javapractices.com/topic/TopicAction.do?Id=205

  

构建应用程序的第一个问题是"如何将其分成包?"。对于典型的商业应用,似乎有两种方式来回答这个问题   按功能打包
  逐个功能使用包来反映功能集。它尝试将与单个功能(仅限该功能)相关的所有项目放入单个目录/包中。这使得包装具有高内聚力和高模块性,并且包装之间的耦合最小。密切配合的项目彼此相邻。它们并未在整个应用程序中展开。值得注意的是,在某些情况下,删除功能可以减少为单个操作 - 删除目录。 (删除操作可能被认为是对最大模块性的一个很好的测试:只有在一次操作中可以删除项目时,项目才具有最大的模块性。)

答案 3 :(得分:1)

通常,活动是主包中的位置,片段,适配器,工具包,模型在自己的包中,如片段包中的片段和ISODateParser类可以进入utils包。

您可以在包含Android最佳做法的Android Best Practices指南中找到更多相关信息。

关于哪些类应该放在指南中 Java包体系结构标题下讨论哪些包的指南。

希望它有帮助!