CHA1-Structure——3.如何组织工程的源文件
原文:Organizing your Source Files
概述
Android应用程序代码应该使用清晰的文件夹结构整齐地组织,这样可以使代码更清晰地阅读。另外,代码和类的恰当的命名约定,是保证代码清晰可维护的重要方式。
命名约定
一定要阅读Ribot的代码和风格指南,以获得在代码风格和命名指南上的详细解释说明。
对于Java代码
以下命名和大小写约定在Java代码中非常重要:
Type | Example | Description | Link |
---|---|---|---|
Variable | incomeTaxRate |
All variables should be camel case | Read More |
Constant | DAYS_IN_WEEK |
All constants should be all uppercase | Read More |
Method | convertToEuroDollars |
All methods should be camel case | Read More |
Parameter | depositAmount |
All parameter names should be camel case | Read More |
参看命名指南来了解更多的细节。
对于Android类
Android类应该以特殊的约定方式命名,使得类的作用能够通过名字清晰的表述出来。例如所有的Activity应该以Activity
结尾,比如MoviesActivity
。以下是Android类中重要的命名约定:
Name | Convention | Inherits |
---|---|---|
Activity | CreateTodoItemActivity |
AppCompatActivity , Activity
|
List Adapter | TodoItemsAdapter |
BaseAdapter , ArrayAdapter
|
Database Helper | TodoItemsDbHelper |
SQLiteOpenHelper |
Network Client | TodoItemsClient |
N/A |
Fragment | TodoItemDetailFragment |
Fragment |
Service | FetchTodoItemService |
Service , IntentService
|
在对其他类型的文件命名前请认真思考,目标是对任意特定的Android类能够通过后缀进行标识。
Android项目的文件夹结构组织
在组织应用的包结构时,有几个最佳实践可供参考。
按类别组织包的结构
实现这一点的方法是按类别将事物进行分组,每个组件都聚集在相关的包中。
-
com.example.myapp.activities
- 包含所有的Activity -
com.example.myapp.adapters
- 包含所有的自定义Adapter -
com.example.myapp.models
- 包含所有的数据模型 -
com.example.myapp.network
- 包含所有网络操作相关的代码 -
com.example.myapp.fragments
- 包含所有的Fragment -
com.example.myapp.utils
- 包含所有的帮助类支持代码 -
com.example.myapp.interfaces
- 包含所有的接口
在应用中以上述方式组织文件夹结构逻辑较为清晰,阅读代码时会相对舒适。你可以通过Futurice的最佳实践中看到它们在这种结构基础上所做的轻微修改。
按应用特性组织包的结构
或者,我们可以按特性而不是按层进行组织。这种方式将包映射成特性集合。考虑下述的包结构:
-
com.example.myapp.service.*
- 它是所有与后台相关的服务包/类的子包 -
com.example.myapp.ui.*
- 它是所有UI相关包/类的子包 -
com.example.myapp.ui.mainscreen
- 包含一些应用主屏幕相关的类 -
com.example.myapp.ui.detailsscreen
- 包含一些应用的详情页Item相关的类
这个特性允许你将DetailsActivity
, DetailsFragment
, DetailsListAdapter
, DetailsItemModel
放在一个包里,当处理“Item详情”功能时,它可以提高方便的导航。
DetailsListAdapter
and DetailsItemModel
类或它们的属性可被定义为包私有级别,因此不会暴露在包外。在包内你可以直接访问它的属性而避免了生成大量的“setter”方法。
这可以使对象的创建简单直观,并且对象在包外保持不变。
资源的组织
资源应该被拆分成以下主要的文件和文件夹:
Name | Path | Description |
---|---|---|
XML Layouts | res/layout/ |
This is where we put our XML layout files. |
XML Menus | res/menu/ |
This is where we put our AppBar menu actions. |
Drawables | res/drawable |
This is where we put images and XML drawables. |
Colors | res/values/colors.xml |
This is where we put color definitions. |
Dimensions | res/values/dimens.xml |
This is where we put dimension values. |
Strings | res/values/strings.xml |
This is where we put strings. |
Styles | res/values/styles.xml |
This is where we put style values. |
查看完整的资源列表并注意以下事项:
-
不要在布局中使用十六进制硬编码的方式设置颜色值. 不要使用硬编码值,而是要将所有的颜色值放入
res/values/colors.xml
,并在布局中以@color/royal_blue
的方式引用颜色。 -
不要在布局中使用硬编码的方式设置margin/padding的尺寸值. 不要使用硬编码值,而是要将[所有尺寸值](http://developer.and放入
res/values/dimens.xml
,并在布局中以@dimen/item_padding_left
的方式引用它们。 -
为了支持多设备,我们可以使用可选的资源系统,基于不同的设备类型,屏幕尺寸以及API版本提供不同的颜色、字符串、尺寸和样式值等。
确保在开发应用时尽早地使用正确的方式组织资源。一定要参考Ribot代码和风格指南以获得在样式和命名约定上的深度建议。
将资源组织到子目录中
有些问题不仅如何组织源文件,而且还会涉及如何更好地组织应用程序资源。在当前的应用程序中,动辄会有成百上千的不同layouts,drawables,styles等,并且在默认情况下,它们都分在同一个类别列表下,在单个的子目录中(如res/layout)。
为进一步整理或对各种资源进行分组,最好的方式是安装Android Studio的第三方folding-plugin来创建虚拟文件夹。
<a href="https://github.com/dmytrodanylyk/folding-plugin"></a>
有关其他选项的讨论,请参考StackOverflow上的文章。
结论
上述方式中哪一个最适合你的项目,最终还是由你来决定。
然而,通常在Java 程序中,按特性对应用结构进行分包被认为更好一些,并且更有意义。