多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Android開發基礎規范(一)

Android開發基礎規范(一)

來源:程序員人生   發布時間:2016-10-22 13:05:58 閱讀次數:2876次

轉載請把頭部出處鏈接和尾部2維碼1起轉載,本文出自逆流的魚yuiop:http://blog.csdn.net/hejjunlin/article/details/52602487

前言:Android中1些開發規范,避免給自己和他人少留坑。

1、工程相干

  • 1.1 工程結構
    當進行提交代碼的工作時,工程應當保持以下的目錄結構:
//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin - src/androidTest - src/test - src/commonTest - src/main - androidTest - 功能測試目錄 - test - 單元測試目錄 - commonTest - 為AndroidTest & Test 提供的同享測試代碼的目錄 - main - 利用代碼目錄

當你修改或增加新功能的時候,工程結構仍然應當保持如上的模樣。
使用如上的工程結構可讓我們的利用代碼從相干的測試代碼中分離出來。
CommonTest目錄使得我們的功能測試和單元測試可以同享部份代碼,比如mock model creation and dagger test configuration classes.

  • 1.2 文件命名
    • 1.2.1 類文件
      任何定義的類都應當使用駝峰命名格式,比如:
//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin AndroidActivity, NetworkHelper, UserFragment, PerActivity

任何繼承自android組件的類都應當使用組件名稱來結尾,比如:

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin UserFragment, SignUpActivity, RateAppDialog, PushNotificationServer, NumberView
  • 使用駝峰格式命名易于瀏覽。
  • 用android組件名稱結尾的繼承類能夠清楚的標識出類的用處,比如,如果要去查找修改RegistrationDialog時,那末這個命名使得定位這個類文件非常方便。

    • 1.2.2 資源文件
      • 當命名資源文件時,應當只使用小寫字母和下劃線替換空格,例如:
        activity_main, fragment_user, item_post
        在你查找布局文件時,這樣命名一樣使得定位文件很方便。
      • 在使用android studio中,布局的package中的文件是按字母順序排列的,這樣意味activity,fragment和其他的layout是按組分類放置的,所以你知道從哪里去開始找1個文件了。
      • 不但如此,用組件名稱開頭的布局文件可以很清晰的表示這個布局文件是被那類組件使用。
  • 1.2.2.1 Drawable 文件

    • Drawable資源文件應當使用“ic_”前綴后跟上尺寸和資源的色彩信息
      For example, white accept icon sized at 24dp would be named:
      比如,白色的24dp大小的用于接受動作的圖標應當命名以下:
      ic_accept_24dp_white
      黑色用于取消動作的48dp大小的圖標命名:
      ic_cancel_48dp_black
      我們使用這樣的命名約定方便使用命名來組織drawable資源文件
    • 如果命名中沒有色彩和尺寸信息,那末開發者還需要打開drawable文件去查看這些信息。所以這樣可以節儉我們時間.其他的drawable文件應當使用對應的前綴,以下:

//create by 逆流的魚yuiop on 2016/9/21
//blog地址:http://blog.csdn.net/hejjunlin

Type Prefix Example
Selector selector_ selector_button_cancel
Background bg_ bg_rounded_button
Circle circle_ circle_white
Progress progress_ progress_circle_purple
Divider divider_ divider_grey

在Android Studio中這個命名約定仍然可以幫助我們將類似的組織到1起
并清晰的標識出這1文件用作甚么
比如, 命令1個資源為“button_cancel”不能標識任何信息
這是1個selector資源呢還是1個圓角按鈕背景呢?
正確的命名可以去除所有的引發的模糊不清.
在創建selector不同狀態資源時,也應當使用對應的命名下標:

//create by 逆流的魚yuiop on 2016/9/21
//blog地址:http://blog.csdn.net/hejjunlin

State Suffix Example
Normal _normal btn_accept_normal
Pressed _pressed btn_accept_pressed
Focused _focused btn_accept_focused
Disabled _disabled btn_accept_disabled
Selected _selected btn_accept_selected

使用如上清晰的下標絕對明顯的標識出了selector狀態資源的作用。
為有色彩和其他標識的資源文件增加下標,使得開發者在打開selector文件時就能夠知道不同的selector資源的狀態是甚么

1.2.2.2 Layout 文件
在命名布局文件時,應當用android組件的名稱作為文件名的前綴,比如:

//create by 逆流的魚yuiop on 2016/9/21
//blog地址:http://blog.csdn.net/hejjunlin

Component Class Name Layout Name
Activity MainActivity activity_main
Fragment MainFragment fragment_main
Dialog RateDialog dialog_rate
Widget UserProfileView view_user_profile
AdapterView Item N/A item_follower

注意:如果要創建的布局文件是有多個不同組件使用的,那末應當使用”layout_”前綴
這樣不但在層級目錄中可以很方便的找到文件,
這樣也能夠幫助我們定義相應的這個layout布局文件歸屬的類。


1.2.2.3 Menu Files
菜單文件不需要使用“menu_”前綴。
在資源目錄下已有菜單包了,所以這是沒必要要的。


1.2.2.4 Values Files
所有的資源文件名必須是復數的,比如:
attrs.xml, strings.xml, styles.xml, colors.xml, dimens.xml


2、代碼相干

  • 2.1 Java語句規則
    • 2.1.1 絕不要疏忽exceptions
      正確的方式是避免沒有處理的異常,以下:
//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin public void setUserId(String id) { try { mUserId = Integer.parseInt(id); } catch (NumberFormatException e) { } }

如果這里出現問題,這里不會打印出任何信息,而且也很難debug,只能讓人迷惑。
當catch1個異常時,我們總是需要輸出error日志到控制臺,用于調試,如果必要的話,需要正告用戶這個異常。比如:

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin public void setCount(String count) { try { count = Integer.parseInt(id); } catch (NumberFormatException e) { count = 0; Log.e(TAG, "There was an error parsing the count " + e); DialogFactory.showErrorMessage(R.string.error_message_parsing_count); } }

這里我們有以下的方式處理出錯:

  • 顯示1個信息給用戶,提示他們這里出錯了
  • 設置了1個可能的默許值
  • 拋出了1個適合的異常

2.1.2 不要catch最大的異常(Exception):

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin public void openCustomTab(Context context, Uri uri) { Intent intent = buildIntent(context, uri); try { context.startActivity(intent); } catch (Exception e) { Log.e(TAG, "There was an error opening the custom tab " + e); } }

為何不這樣做呢?
在大部份情況下,catch這個大的Exception或Throwable都是不適合的。(特別是Throwable由于它包括Error的異常。)
這樣意味著你沒有期望到的終究要捕獲的異常(包括RuntimeExceptions像CLassCastException)都被捕獲并在利用層進行error處理,這樣是很危險的。
如果有人在你調用的代碼里添加了1個新的類型的異常,編譯器不會幫你認識到你需要處理這個不同的毛病類型。這是你代碼里很難發現的毛病處理方式。
大多數情況下,你不應當用相同的處理方式來處理不同的exception.
以下,catch期望的異常并正確的處理:

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin public void openCustomTab(Context context, Uri uri) { Intent intent = buildIntent(context, uri); try { context.startActivity(intent); } catch (ActivityNotFoundException e) { Log.e(TAG, "There was an error opening the custom tab " + e); } }

2.1.3 組織 exceptions
在異常運行相同的代碼的地方,他們應當增加可讀性和避免代碼復制。比如,你可能會像以下這樣處理異常:

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin public void openCustomTab(Context context, @Nullable Uri uri) { Intent intent = buildIntent(context, uri); try { context.startActivity(intent); } catch (ActivityNotFoundException e) { Log.e(TAG, "There was an error opening the custom tab " + e); } catch (NullPointerException e) { Log.e(TAG, "There was an error opening the custom tab " + e); } catch (SomeOtherException e) { // Show some dialog } }

你可以這樣做:

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin public void openCustomTab(Context context, @Nullable Uri uri) { Intent intent = buildIntent(context, uri); try { context.startActivity(intent); } catch (ActivityNotFoundException e | NullPointerException e) { Log.e(TAG, "There was an error opening the custom tab " + e); } catch (SomeOtherException e) { // Show some dialog } }

2.1.4 Using try-catch over throw exception
在exception出現的地方使用try-catch塊增加代碼可讀性
在代碼中error產生的地方就處理,這樣不論是debug還是更改error處理都很容易。


2.1.5 不要使用垃圾回收器

  • 不能保證甚么時候垃圾回收器會被調用,也不能保證垃圾回收器將在甚么時候調用.
  • 大部份情況下,在有規范的異常處理的情況下,你可以做你需要做的。
    如果你實在需要,定義1個close()方法(或類似的)并在方法調用時,提示記得close
  • 以InputStreamfor作為example.
  • 在這類情況下是可以的,但是不需要從垃圾回收器中輸出少許日志信息,也不需要輸出大量日志.

2.1.6 完全限制方式導包

  • 導包時,使用全包格式,例如:
  • 不要這樣導包:
    import android.support.v7.widget.*;
  • 而是要這樣:
    import android.support.v7.widget.RecyclerView;

2.1.7 去掉無用的包引入

  • 通常從1個類中移除代碼意味著1些之前引入的包也已不需要。
    這類情況下,不需要導入的包應當和代碼1起移除掉。

2.2 Java樣式規則

2.2.1 屬性定義和命名

  • 所有的字段都應當在文件頂部定義,遵守以下規則:
    private, non-static 字段應當用“m”做前綴,像以下的例子是正確的:
    mUserSignedIn, mUserNameText, mAcceptButton

  • 所有其他的字段都用小寫字母開頭:
    int numOfChildren; String username;
    static final 字段(靜態的)全部大寫
    private static final int PAGE_COUNT = 0;

  • 類屬性命名沒有顯示任何信息的不應當適用,比如:
    int e; //number of elements in the list
  • 為何1開始不給屬性1個成心義的名字,而給1段comment呢?
    int numberOfElements;

2.2.1.2 View屬性名稱

當為1個界面控件定義1個類屬性時,view應當作為這個屬性的后綴,比如:

//create by 逆流的魚yuiop on 2016/9/21
//blog地址:http://blog.csdn.net/hejjunlin

View Name
TextView mUserNameView
Button mAcceptLoginButton
ImageView mProfileAvatarView
RelativeLayout mProfileLayout
  • 我們這樣命名view以便我們可以知道這個類屬性和甚么資源關聯.
  • 比如, 給定像這樣的類屬性命名:
    mUserNameView,mUserAvatarView或mUserProfieLayout
  • 這些命名很清晰的表明其對應的資源
  • 之前,控件屬性的命名通經常使用控件類型來結尾(比如acceptLoginButton),但是控件常常改變而且很容易忘記到java類中去更新變量的名稱.

2.2.2 命名屬性時不要包括容器類型

  • 根據上1條的規則,一樣我們應當避免在創建集合變量時使用集合類型來命名.比如,假設我們有1個使用arrayList包括userIds的列表:
  • 不要使用:
    List userIds = new ArrayList<>();
  • 使用:
    List userIdList = new ArrayList<>();
  • 容器變量正確的命名應當包括足夠的變量信息.

2.2.3 避免類似的命名

  • 使用類似的名稱來命名變量,方法或類時,會使其他開發者在瀏覽您的代碼時迷惑.比如:
    hasUserSelectedSingleProfilePreviously
    hasUserSelectedSignedProfilePreviously
  • 很難第1眼就能夠辨別出上面兩個變量是干甚么的.使用更清晰的方式命名變量可使得其他開發者更容易通過變量名理解您的代碼.

2.2.4 數字連續命名

  • 當Android Studio自動為我們產生代碼,這樣很容易給我們留下問題,特別是當它產生糟的命名時.比如,這樣就很不好:
    public void doSomething(String s1, String s2, String s3)
  • 不瀏覽代碼的話很難理解如上這個方法中的參數是做甚么的.
    public void doSomething(String userName, String userEmail, String userId)
    這樣就容易理解很多了.我們可以根據這個更容易理解的方法參數去瀏覽代碼了

2.2.5 易讀的命名

在對屬性,方法和類命名時,應當遵守以下規則:

  • 可讀:有效的命名意味著我們可以立刻通過名稱就理解,減少譯解名稱的認知負擔.
  • 可拼寫:在您嘗試對命名很糟的名稱發音時,可拼寫的命名可以免笨拙的對話.
  • 可搜索:沒有比在1個類中搜索1個方法或變量時發現名稱拼寫毛病或命名很糟.當我們想找到1個關于查找用戶的方法時,直接搜索字符串 ‘search’ 就應當保護這個方法的結果.
  • 不要使用匈牙利標記法:匈牙利標記法和上面3條沖突,不要使用.

2.2.6 將帶縮寫詞(那些將所有字母都大寫的詞)作為單詞使用

在任意類名,變量名中使用的縮寫詞都應當作為單詞使用.比如:

//create by 逆流的魚yuiop on 2016/9/21
//blog地址:http://blog.csdn.net/hejjunlin

Do Don’t
setUserId setUserID
String uri String URI
int id int ID
parseHtml parseHTML
generateXmlFile generateXMLFile

2.2.7 避免對齊變量聲明

任何變量的聲明都不應當使用特殊的對齊格式,比如:
這樣就很好:

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin private int userId = 8; private int count = 0; private String username = "hitherejoe";

不要這樣做:

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin private String username = "hitherejoe"; private int userId = 8; private int count = 0;

這樣產生了很多空白,讓代碼難于瀏覽.

2.2.8 使用空格符進行縮進

  • 對語句塊,應當使用4個空格符縮進:

    if (userSignedIn) {
    count = 1;
    }
    在自動換行時,應當使用8個空格符縮進:

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin String userAboutText = "This is some text about the user and it is pretty long, can you see!"

2.2.9 If-Statement語句

  • 2.2.9.1 使用標準的大括號樣式
    大括號應當與其前面的代碼放置在同1行。例如,避免下面這樣的代碼出現:
//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin class SomeClass { private void someFunction() { if (isSomething) { } else if (!isSomethingElse) { } else { } } }

取而代之應當這樣:

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin class SomeClass { private void someFunction() { if (isSomething) { } else if (!isSomethingElse) { } else { } } }

這不但是沒有必要增加額外的1行,而它還會讓讀取代碼變得更加容易

  • 2.2.9.2 Inline if-clauses 內聯if從句

    • 有時使用單行if語句是成心義的。例如:
      if (user == null) return false;
    • 但是,它僅適用于簡單的操作。像下面這樣的代碼會更合適使用大括號:
      if (user == null) throw new IllegalArgumentExeption(“Oops, user object is required.”);
  • 2.2.9.3 Nested if-conditions 嵌套的if條件語句
    在可能的情況下,if語句的條件應當合并,避免過于復雜的嵌套,例如:
    推薦:

if (userSignedIn && userId != null) { }

避免像下面這樣:

if (userSignedIn) { if (userId != null) { } }

這會使得代碼更加容易瀏覽,并且從嵌套語句中移除沒必要要的行數。

  • 2.2.9.4 Ternary Operators 雙目運算符
    • 在適當的情況下,雙目運算符能夠用來簡化操作。
      例如,下面的代碼很容易瀏覽:
userStatusImage = signedIn ? R.drawable.ic_tick : R.drawable.ic_cross;

它比下面的代碼占用更少的行數:

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin if (signedIn) { userStatusImage = R.drawable.ic_tick; } else { userStatusImage = R.drawable.ic_cross; }

注意:在有些情況下雙目運算符不應當使用。如果if語句的邏輯過于復雜或包括了大量的字符,這時候應當使用標準的大括號樣式。

2.2.10 Annotations 注解

2.2.10.1 Annotation practices 注解用法
從《Android code style guidelines》中得悉:

  • @Override: @Override注解必須使用在當重寫方法時候的聲明或實現父類時。例如,如果你使用 @inheritdocs文檔標簽,并且派生1個類(而不是1個接口),對重寫的父類方法你也必須使用 @Override注解。
  • @SuppressWarnings: @SuppressWarnings注解應當僅使用在不可能清除正告的情況下,如果1個正告通過了“不可能消除”測試, @SuppressWarnings注解必須使用,以便在代碼中確保所有的正告反應實際問題。
    有關注解指引的更多信息可以在這里找到。
  • 注解應當使用在可能需要的地方。例如,可以使用@Nullable注解已免出現屬性為空的情況。例如:
@Nullable TextView userNameText; private void getName(@Nullable String name) { }

2.2.10.2 Annotation style 注解樣式
利用在方法或類的注解應當總是在聲明中定義,并且每項只能1行:

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin @Annotation @AnotherAnnotation public class SomeClass { @SomeAnotation public String getMeAString() { } }

當在屬性上使用注解時,應確保注解與屬性在同1行,例如:

@Bind(R.id.layout_coordinator) CoordinatorLayout mCoordinatorLayout; @Inject MainPresenter mMainPresenter;

它會使得聲明瀏覽起來更加容易。例如,在聲明 ‘@Inject SomeComponent mSomeName’ 可讀為’inject this component with this name’(利用這個名字注入組件)。

2.2.11 Limit variable scope 限制變量的作用域

  • 局部變量的作用域應保持在最低限度(《Effective Java》第29條建議)。這樣做的話,將會提高代碼的可讀性和可保護性,同時減少出錯的可能性。
  • 所有要使用的每個變量都應當在語句塊中聲明。
    局部變量應當在其第1次使用途聲明。幾近每個局部變量的聲明都應當包括1個初始化。如果你還沒有足夠的信息來公道地初始化變量,你應當推延聲明直到你需要的時候。

2.2.12 Unused elements 無用的元素

  • 所有沒有用的屬性、導入、方法和類應當從代碼中移除,除非有特殊的用處保存這些。

2.2.13 Order Import Statements 導入聲明
由于我們使用的是Android Studio,因此導入都是自動的按序導入。但是,在1些情況下并不是如此,因此應依照下面的順序導入:

  • 1.Android imports
  • 2.Imports from third parties
  • 3.java and javax imports
  • 4.Imports from the current Project

注意:
- 1.每一個組的導入應依照字母的順序排列,大寫字母排在小寫字母之前(Z排在a之前)
- 2.在各個組之間應當空1行(android, com, JUnit, net, org, java, javax)
2.2.14 Logging 日志
日志通常在開發進程中用于記錄有用的毛病消息或其他可能有用的信息。

//create by 逆流的魚yuiop on 2016/9/21
//blog地址:http://blog.csdn.net/hejjunlin

Log Reason
Log.v(String tag, String message) verbose (詳細)
Log.d(String tag, String message) debug(調試)
Log.i(String tag, String message) information(普通info)
Log.w(String tag, String message) warning(正告)
Log.e(String tag, String message) error (毛病)

我們做日志記錄時可以設置1個標示,這個TAG是1個靜態的final屬性,放置在類的頂部,例如:
private static final String TAG = MyActivity.class.getName();
所有的調試日志不應當出現在發布的版本中,另外一方面,信息、正告和毛病日志只有在需要的時候保持開啟。

//create by 逆流的魚yuiop on 2016/9/21 //blog地址:http://blog.csdn.net/hejjunlin if (BuildConfig.DEBUG) { Log.d(TAG, "Here's a log message"); }

第1時間取得博客更新提示,和更多android干貨,源碼分析,歡迎關注我的微信公眾號,掃1掃下方2維碼或長按辨認2維碼,便可關注。

這里寫圖片描述

如果你覺得好,隨手點贊,也是對筆者的肯定,也能夠分享此公眾號給你更多的人,原創不容易

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 1000部精品久久久久久久久 | 亚洲片在线| 天堂mv亚洲mv在线播放9蜜 | 18videosex性欧美68 | www日韩免费高清视频 | 国产精品自在线拍国产 | 伊人网络 | 成人五月网 | 第一福利在线观看永久视频 | 自拍偷拍第3页 | 欧美xxxvideo| 国产精品揄拍100视频 | 亚洲成人黄色在线观看 | 亚洲 校园 春色 另类 激情 | 国产成人亚洲毛片 | 美国特级成人毛片 | 亚洲社区 | 在线看片欧美 | 日本视频中文字幕一区二区 | 欧美性受xxxx喷水视频 | 特黄的欧美毛片 | 国产乱辈通伦影片在线播放 | 欧美日韩一区二区三区免费不卡 | 久久www免费人成看国产片 | 亚洲欧洲久久久精品 | 欧美ucjizz免费播放器 | 欧美成人一区二区三区不卡视频 | 欧美色另类 | 无夜精品久久久久久 | 依人在线免费视频 | 国产性夜夜春夜夜爽 | 欧美成人在线免费 | 欧美成人亚洲欧美成人 | 亚洲人成伊人成综合网久久 | 中文字幕在线免费观看 | 久久精品国产99久久久 | 黄色网址免费 | 成人αv | 性欧美video超清 | 奇奇网免费影视片 | 国产成人综合亚洲一区 |