工作中,少不了要定義各種介面,系統整合要定義介面,前後臺掉呼叫也要定義介面。介面定義一定程度上能反應程式設計師的程式設計功底。列舉一下工作中我發現大家容易出現的問題:
1. 返回格式不統一
同一個介面,有時候返回陣列,有時候返回單個;成功的時候返回物件,失敗的時候返回錯誤資訊字串。工作中有個系統整合就是這樣定義的介面,真是辣眼睛。這個對應程式碼上,返回的型別是map,json,object,都是不應該的。實際工作中,我們會定義一個統一的格式,就是ResultBean,分頁的有另外一個PageResultBean
錯誤
範例:
//返回map可讀性不好,儘量不要
@
PostMapping
(
“/delete”
)
public
Map
<
String
,
Object
>
delete
(
long
id
,
String
lang
)
{
}
// 成功返回boolean,失敗返回string,大忌
@
PostMapping
(
“/delete”
)
public
Object
delete
(
long
id
,
String
lang
)
{
try
{
boolean
result
=
configService
。
delete
(
id
,
local
);
return
result
;
}
catch
(
Exception
e
)
{
log
。
error
(
e
);
return
e
。
toString
();
}
}
2. 沒有考慮失敗情況
一開始只考慮成功場景,等後面測試發現有錯誤情況,怎麼辦,改介面唄,前後臺都改,勞民傷財無用功。
錯誤
範例:
//不返回任何資料,沒有考慮失敗場景,容易返工
@
PostMapping
(
“/update”
)
public
void
update
(
long
id
,
xxx
)
{
}
3. 出現和業務無關的輸入引數
如lang語言,當前使用者資訊 都不應該出現引數裡面,應該從當前會話裡面獲取。後面講ThreadLocal會說到怎麼樣去掉。除了程式碼可讀性不好問題外,尤其是引數出現當前使用者資訊的,這是個嚴重問題。
錯誤
範例:
// (當前使用者刪除資料)引數出現lang和userid,尤其是userid,大忌
@
PostMapping
(
“/delete”
)
public
Map
<
String
,
Object
>
delete
(
long
id
,
String
lang
,
String
userId
)
{
}
4. 出現複雜的輸入引數
一般情況下,不允許出現例如json字串這樣的引數,這種引數可讀性極差。應該定義對應的bean。
錯誤
範例:
// 引數出現json格式,可讀性不好,程式碼也難看
@
PostMapping
(
“/update”
)
public
Map
<
String
,
Object
>
update
(
long
id
,
String
jsonStr
)
{
}
5. 沒有返回應該返回的資料
例如,新增介面一般情況下應該返回新物件的id標識,
這需要程式設計經驗
。新手定義的時候因為前臺沒有用就不返回資料或者只返回true,這都是不恰當的。別人要不要是別人的事情,你該返回的還是應該返回。
錯誤
範例:
// 約定俗成,新建應該返回新物件的資訊,只返回boolean容易導致返工
@
PostMapping
(
“/add”
)
public
boolean
add
(
xxx
)
{
//xxx
return
configService
。
add
();
}
很多人看了我的這篇文章 程式設計師你為什麼這麼累?,都覺得裡面的技術也很簡單,沒有什麼特別的地方,但是,實現這個程式碼框架之前,就是要你的介面的統一的格式ResultBean,aop才好做。有些人誤解了,我那篇文章說的都不是技術,重點說的是編碼習慣工作方式,如果你重點還是放在什麼技術上,那我也幫不了你了。同樣,如果我後面的關於習慣和規範的帖子,你重點還是放在技術上的話,那是丟了西瓜撿芝麻,有很多貼還是沒有任何技術點呢。
附上ResultBean,沒有任何技術含量:
@
Data
public
class
ResultBean
<
T
>
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
public
static
final
int
SUCCESS
=
0
;
public
static
final
int
FAIL
=
1
;
public
static
final
int
NO_PERMISSION
=
2
;
private
String
msg
=
“success”
;
private
int
code
=
SUCCESS
;
private
T
data
;
public
ResultBean
()
{
super
();
}
public
ResultBean
(
T
data
)
{
super
();
this
。
data
=
data
;
}
public
ResultBean
(
Throwable
e
)
{
super
();
this
。
msg
=
e
。
toString
();
this
。
code
=
FAIL
;
}
}
統一的介面規範,能幫忙規避很多無用的返工修改和可能出現的問題。能使程式碼可讀性更加好,利於進行aop和自動化測試這些額外工作。大家一定要重視。
下一篇講controller的規範,還有用到ResultBean,敬請留意。覺得有用請點贊加關注?
====================GITHUB地址======================
所有的程式碼細節都在已經上了github了,地址
xwjie/PLMCodeTemplate,歡迎加星。有問題歡迎提出。