【问题标题】:What is the best practice for putting classes under package names in Android在Android中将类放在包名下的最佳做法是什么
【发布时间】:2014-12-02 04:45:22
【问题描述】:
Android Studio 0.8.11

你好,

我刚刚在 Android 上完成了一项测试,该测试旨在构建一个接收实时新闻提要并显示它们的应用。但是,老师非常挑剔,因为我将所有课程都放在一个包中。

我只是想知道打包类的最佳做法是什么。对于我的特定测试,我在这个包名下有以下类:

com.viewsys.ncon

我的课是:

DBHelper          <-- database creating and ugprading
DetailActivity    <-- activity that add the NconDetailFragment
NconContract      <-- properties of the database schema columns, table name
NconDetailFragment <-- detail fragment
NconListFragment  <-- list fragment
NconViewPager  <-- just the view pager
JsonNewsFeed   <-- class that downloads and parses the json format
MainActivity   <-- Main activity
NewsFeed       <-- class of properties getters/setters for news feed
NewsFeedDB     <-- simple array list to store all the object from the sqlite3 DB
SplashActivity <-- activity that add the splashFragment and the NconListFragment
SplashFragment <-- splash fragment
Utilities <-- just some simple utility functions

非常感谢您的任何建议,

【问题讨论】:

  • 对我来说你做得很好。你只有十三节课。无需将它们存放在不同的目录中。

标签: java android packages


【解决方案1】:

首先您可以按模型(保存数据的类)和视图(用于显示的所有内容)分开,然后您可以为不同类型的类创建子包。

例如:

com.viewsys.ncon

Utilities

com.viewsys.ncon.model

NconContract
JsonNewsFeed
NewsFeed

com.viewsys.ncon.model.db

DBHelper
NewsFeedDB

com.viewsys.ncon.view

NconViewPager

com.viewsys.ncon.view.activities

DetailActivity
MainActivity
SplashActivity

com.viewsys.ncon.view.fragments

NconDetailFragment
NconListFragment
SplashFragment

您应该尽量减少包依赖循环。这意味着一个包可以依赖于另一个(或多个其他)包并使用它们的类,但所需的包应尽量减少对第一个包的依赖。所以依赖调用应该只进入一个方向。

【讨论】:

  • @AlexK 当然,包括后缀'会有助于项目结构之外的代码可读性,不是吗?
  • 在这个包架构中,com.viewsys.ncon.view 中的模型类应该有原始数据和对象的getter 和setter,而com.viewsys.ncon.model.db应该只有与后端和服务交互的模型,对吗?
【解决方案2】:

好吧,我使用以下软件包-

  1. project.activity - 放置所有活动
  2. project.fragment - 片段
  3. project.broadcastReceiver
  4. project.databaseHelpers - 放置用于处理单个表的数据库助手类以及用于创建所有数据库表的主 SqliteHelper 类。
  5. project.networkTasks- 对不同服务的不同 API 的所有调用都在这里。
  6. project.services - 这包括作为服务运行的类。有时它们与网络任务重叠。
  7. project.general - 这包括一般类。例如,假设您将学生数据存储在表中。然后你可以有一个学生班。当您创建并填充它的实例时,您可以清楚地传递与学生关联的数据。
  8. project.utils - 这包括实用程序类。这些类主要有静态方法。例如,将 HttpResponse 作为字符串获取的方法将放在这些类之一中。

作为一般规则,史蒂夫所说的是正确的,应用内聚和耦合的原则。

【讨论】:

    【解决方案3】:

    我按照 Simulant 的建议来构建我的包,我发现这是维护一个结构良好的项目的最佳方法。

    但是,我还为扩展您自己的对象之一的对象创建子包。 例如:

    com.viewsys.ncon.view.fragments 
    ViewPagerFragment
    
    
    com.viewsys.ncon.view.fragments.viewpagerfragments
    YourViewPagerFragment1 extends ViewPagerFragment
    YourViewPagerFragment2 extends ViewPagerFragment
    YourViewPagerFragment3 extends ViewPagerFragment
    

    一旦项目变大,这种特殊方法对于在项目中导航非常有用,尤其是在您扩展自定义对象的许多先前功能时。

    【讨论】:

      【解决方案4】:

      应根据内聚和耦合的编程原则将类分成包。

      简单地说,凝聚力意味着相关(或某种类型)的事物应该放在一起。例如,您的 Fragments 和您的活动,如 Simulant 建议的那样。

      耦合是指不同事物相互依赖的程度。在可能的情况下,事物应该松散耦合——依赖关系只有一种方式。如果两个模块相互依赖,我们说它们是紧密耦合的,它们应该是同一个包的一部分——尽管您可能希望通过引入一个接口来分离它们的依赖关系。如果依赖项只是一种方式(应该如此),那么您可以将它们分成不同的包。

      【讨论】:

        【解决方案5】:

        尽量保持模块松散耦合,以便将来支持可扩展性。如果将所有类放在同一个包中,可能会导致可伸缩性问题。将片段、活动、模型所有内容保存在不同的包中。

        【讨论】:

          【解决方案6】:

          请看一下这个repository,它介绍了android开发的最佳实践,其中一个实践就是java包架构。

          简而言之,您可以这样做:

          com.business.project
          ├─ network
          ├─ models
          ├─ managers
          ├─ utils
          ├─ fragments
          └─ views
             ├─ adapters
             ├─ actionbar
             ├─ widgets
             └─ notifications
          

          Activity和Fragment不属于视图,因为它们是控制器,但它们也处理视图,所以放在自己的包中。

          【讨论】:

            猜你喜欢
            • 2012-04-28
            • 1970-01-01
            • 1970-01-01
            • 2015-04-30
            • 1970-01-01
            • 2010-09-29
            • 1970-01-01
            • 2011-03-01
            • 1970-01-01
            相关资源
            最近更新 更多