SlideShare a Scribd company logo
1 of 32
系統架構設計 - Android
By Sino
好維護的系統架構—以我的觀點
● 命名的藝術
●MVC 架構
●Route/Stage
●Base Object
命名的藝術
工程師的眼睛和腦袋很重要 , 不要再互相殘害了
命名的藝術
嗯…這是另一個很長的故事了
最重要的重點
基礎的物件和資料庫 table 一定只有一個英文單字
不可以有重覆或模擬容易誤會的物件名稱
後續的衍生物才不會有問題
命名的藝術
Member 就叫 Member
在程式中不會命名為 MemberObject
Member member = new Member();
MemberObject memberObject = new MemberObject();
在資料庫中不會命名為 MemberTable/MemberData
正確範例
MemberMemberDetail
錯誤範例
MemberDataMemberDataDetail?MemberDetailData?
其他範例
IncomeChangesX
IncomeO
CurrencyRateX
Currency--O
MVC 架構
你的 MVC 分離的夠乾淨有邏輯嗎 ?
*Controller 控制邏輯
*Model 處理資料
*View 顯示內容
MVC 關係圖 ?
Model
View
Controller
Manager Handler
Db Api
Route
Callback Stage
Include Template
MVC 架構
MVC 的核心是 Controller
我的想法— MVC 三個字母雖然一起念
但是 MVC 是不對等的
Model 和 View 是 Controller 的小弟
Model/View 負責處理 Controller 交辦的事項
ControllerModel
View
MVC 關係圖比較像這樣
處理資料的邏輯
處理顯示的邏輯
MVC 架構
Controller
* 控制 Route
* 控制 Model
* 控制 View
MVC 架構
Model 負責的事情
*Database 的存取
*API 呼叫
*Global/Singleton 變數的存取
MVC 架構
View 負責的事情
* 顯示內容
* 回到 Route
何時產生 / 不產生物件
Programming Objects/Storage/ORM  O
Api Request/Response  X
MVC- 避免過度物件化 / 封裝
* 手上最可怕的案子物件封裝了 6 層以上
Base Objects
所有 MVC 物件都必須繼承 Base 系列物件
然後環環相扣的繼承
例如
UserController 繼承 BaseController 繼承 Base
Base Objects
非程式語言基礎原件與第三方物件必須封裝後使用
例如
宣告 FacebookManager
實做 login/logout
當 facebook 強制升級 SDK 版本直接修改 FacebookManager 即可
不需要找出所有用到 facebook 的 class 去修改
除了 Log 還是 Log
Log 是程式語言的核心
因為 Log 掌握 Debug/ 維護的速度
所有可以協助開發事件都可以做 Log
除了 Log 還是 Log
除了 deamon/crontab 長駐型程式因為 log 太大需慎選 log 內容
Log 越詳細程式邏輯和除錯越清楚
除了 Log 還是 Log
ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
Log Level 的建議
* 正式環境 Log Level 沒有 debug
* 開發環境 Log Level 全部
Debug Level Info/Debug?
何時用 info 何時用 debug
Info( 用戶 / 系統事件 ) 記錄
( 使用者登入 / 登出 ), 新增物件如 ( 新增聯絡人 )
debugmethod 呼叫 , 變數變化 , 一般邏輯判斷 ,db 存取
Log Tips
善用 reflection codecopy/past 減少輸入
Public string tag=“Downloader”
private void startDownload() {
Log.v(tag,”on function ”+ new Object(){}.
getClass().getEnclosingMethod().getName());
………………………..
}
Base Objects
Base
Log Exception
Log
Level
Exception
Handling
Global include condition
Exception Handling
Base 物件重要的一環 , 因為比較複雜只能大概說明
Base 物件的 exception 中斷流程分 2 種架構
一 . 集權式管理 (framework)
二 . 分權式管理 (framework)
一 . 集權式管理
Exception 發生由 Base 物件處理後 , 中止相關流程 , 拋出例外錯誤
二 . 分權式管理
Exception 發生由 controller 自行管理 , 中止相關流程 , 拋出例外錯誤
Base Objects
Base
BaseView BaseController
BaseModel BaseEtc
Views Controllers Models
初始化
初始化必須與 Route/Stage 分離 , 切換流程時就
不會有變數 / 流程亂跑的問題
流程開始前
initParam()
initLayout()
流程開始後
switchStage()
初始化
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
initParam();
initLayout();
}
@Override
public void onResume() {
super.onResume();
switchStage();
}
系統架構設計— Route/Stage
Route/Stage 提供程式流程的追蹤與維護的統一
入口
(Web 有 framework 通常沒這個問題 )
所有流程都經過 Route/Stage
維護時才不會找不到程式碼到底在哪裡
也不會有程式碼到底執行到哪的疑惑
系統架構設計— Route/Stage
所有流程的起點
public void switchStage(){
switch (stage) {
case HfInstallerStage.INIT:
setStageInit();
break;
case HfInstallerStage.INIT_DOWNLOAD:
setStageInitDownload();
break;
case HfInstallerStage.DOWNLOAD_COMPLETE:
setStageDownloadComplete();
break;
…..
default:
break;
}
}
系統架構設計— Controller 範例
private void setStageInit(){
resetLayout();
installerLayout.infoTextView.setText(“ 開始下載檔案 ");
installerLayout.downloadButton.setOnClickListener(new
OnClickListener() {
@Override
public void onClick(View arg0) {
switchStage(HfInstallerStage.INIT_DOWNLOAD);
}
});
installerLayout.settingButton.setOnClickListener(new
OnClickListener() {
@Override
public void onClick(View arg0) {
switchStage(HfInstallerStage.INIT_SETTING);
}
});
}
App Stage Control
Fragment
switchStage(FragmentStageA.B.C)
setStage(FragmentStageA.B.C)
Activity
switchStage (ActivityStageA.B.C)
setStage(ActivityStageA.B.C)
Stages Implement………
UI/Methods Implement………
Call switchSate/setStage
UI/Methods Impletment………
Call switchSate/setStage
onStart()/onStop
onStart()/onSto
Stages Implement………
多層 Route/Controller
如何設計好的共用 sync command 原件—利用 callback
private Runnable createDownloadRunnable(final HfInstallerCallback insterllerCallback){
Runnable runnable = new Runnable(){
@Override
public void run() {
URL url;
InputStream input = null;
FileOutputStream output = null;
try {
url = new URL(apkUrl);
String outputName = "friDay_play.apk";
input = url.openConnection().getInputStream();
output = context.openFileOutput(outputName, Context.MODE_PRIVATE);
int read;
byte[] data = new byte[1024];
while ((read = input.read(data)) != -1)
output.write(data, 0, read);
} catch (Exception e) {
}
insterllerCallback.callback();
}
};
return runnable;
}
如何設計好的共用 sync command 原件—利用 callback
HfInstallerCallback insterllerCallback = new
HfInstallerCallback() {
@Override
public void callback() {
stopDownload();
switchStage(HfInstallerStage.DOWNLOAD_COMPLETE);
runOnUiThread (new Thread(new Runnable() {
public void run() {
switchStage(HfInstallerStage.DOWNLOAD_COMPLETE);
}
}));
}
};
createDownloadRunnable(insterllerCallback).run();
結束

More Related Content

What's hot

Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典yiditushe
 
Struts学习笔记
Struts学习笔记Struts学习笔记
Struts学习笔记yiditushe
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing江華 奚
 
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 SpringSpring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 SpringJustin Lin
 
用Jquery实现拖拽层
用Jquery实现拖拽层用Jquery实现拖拽层
用Jquery实现拖拽层yiditushe
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文Guo Albert
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非Tony Deng
 
由一个简单的程序谈起--之四
由一个简单的程序谈起--之四由一个简单的程序谈起--之四
由一个简单的程序谈起--之四yiditushe
 
Spring 2.0 技術手冊第十章 - 專案:線上書籤
Spring 2.0 技術手冊第十章 - 專案:線上書籤Spring 2.0 技術手冊第十章 - 專案:線上書籤
Spring 2.0 技術手冊第十章 - 專案:線上書籤Justin Lin
 
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合Justin Lin
 
jQuery介绍@disandu.com
jQuery介绍@disandu.comjQuery介绍@disandu.com
jQuery介绍@disandu.comThink hy
 

What's hot (12)

Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典
 
并发控制
并发控制并发控制
并发控制
 
Struts学习笔记
Struts学习笔记Struts学习笔记
Struts学习笔记
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
 
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 SpringSpring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
 
用Jquery实现拖拽层
用Jquery实现拖拽层用Jquery实现拖拽层
用Jquery实现拖拽层
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非
 
由一个简单的程序谈起--之四
由一个简单的程序谈起--之四由一个简单的程序谈起--之四
由一个简单的程序谈起--之四
 
Spring 2.0 技術手冊第十章 - 專案:線上書籤
Spring 2.0 技術手冊第十章 - 專案:線上書籤Spring 2.0 技術手冊第十章 - 專案:線上書籤
Spring 2.0 技術手冊第十章 - 專案:線上書籤
 
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
 
jQuery介绍@disandu.com
jQuery介绍@disandu.comjQuery介绍@disandu.com
jQuery介绍@disandu.com
 

Similar to 系統架構設計 Android

由一个简单的程序谈起――之二
由一个简单的程序谈起――之二由一个简单的程序谈起――之二
由一个简单的程序谈起――之二yiditushe
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 
前端基础知识回顾
前端基础知识回顾前端基础知识回顾
前端基础知识回顾Wu tianhao
 
D2-ETao-show
D2-ETao-showD2-ETao-show
D2-ETao-showleneli
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Wade Huang
 
大型互联网应用架构设计
大型互联网应用架构设计大型互联网应用架构设计
大型互联网应用架构设计thinkinlamp
 
Flex 4.5 action custom component development
Flex 4.5 action custom component developmentFlex 4.5 action custom component development
Flex 4.5 action custom component developmentjexchan
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程yiditushe
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程appollo0312
 
Script with engine
Script with engineScript with engine
Script with engineWebrebuild
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识yiditushe
 
C++工程实践
C++工程实践C++工程实践
C++工程实践Shuo Chen
 
MobileWebAppFramework_V5_design
MobileWebAppFramework_V5_designMobileWebAppFramework_V5_design
MobileWebAppFramework_V5_designJackson Tian
 
物件導向程式設計課程講義(98 ges hi版)
物件導向程式設計課程講義(98 ges hi版)物件導向程式設計課程講義(98 ges hi版)
物件導向程式設計課程講義(98 ges hi版)Hui-Shih Leng
 
Web前端标准在各浏览器中的实现差异
Web前端标准在各浏览器中的实现差异Web前端标准在各浏览器中的实现差异
Web前端标准在各浏览器中的实现差异cleverpig
 
JdonFramework中文
JdonFramework中文JdonFramework中文
JdonFramework中文banq jdon
 

Similar to 系統架構設計 Android (20)

由一个简单的程序谈起――之二
由一个简单的程序谈起――之二由一个简单的程序谈起――之二
由一个简单的程序谈起――之二
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 
前端基础知识回顾
前端基础知识回顾前端基础知识回顾
前端基础知识回顾
 
D2-ETao-show
D2-ETao-showD2-ETao-show
D2-ETao-show
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
大型互联网应用架构设计
大型互联网应用架构设计大型互联网应用架构设计
大型互联网应用架构设计
 
Flex 4.5 action custom component development
Flex 4.5 action custom component developmentFlex 4.5 action custom component development
Flex 4.5 action custom component development
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸
 
前端测试
前端测试前端测试
前端测试
 
前端测试
前端测试前端测试
前端测试
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Script with engine
Script with engineScript with engine
Script with engine
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
 
C++工程实践
C++工程实践C++工程实践
C++工程实践
 
MobileWebAppFramework_V5_design
MobileWebAppFramework_V5_designMobileWebAppFramework_V5_design
MobileWebAppFramework_V5_design
 
物件導向程式設計課程講義(98 ges hi版)
物件導向程式設計課程講義(98 ges hi版)物件導向程式設計課程講義(98 ges hi版)
物件導向程式設計課程講義(98 ges hi版)
 
Web前端标准在各浏览器中的实现差异
Web前端标准在各浏览器中的实现差异Web前端标准在各浏览器中的实现差异
Web前端标准在各浏览器中的实现差异
 
JdonFramework中文
JdonFramework中文JdonFramework中文
JdonFramework中文
 
Js dom
Js domJs dom
Js dom
 

系統架構設計 Android