iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0
自我挑戰組

這些年,我玩Pokémon Go學到的兩三事系列 第 18

[Day 18]『method chain』 VS 『query syntax』設計檢索功能

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20200905/20109107scbC9Gmf8v.png

社群日將至,有必要跟大家介紹一下Pokémon Go檢索系統/images/emoticon/emoticon08.gif

// 假設 Pokemon.query(condition)為一可以找出符合『condition』的寶可夢方法

【Linq:Language Integrated Query (method chain)】

在Linq中,上述在Darwin0616的寶可夢中檢索4星超夢,透過 method chain

IEnumerable<Pokemon> mc4query = darwin0616Pokemons.
                                Where(p => p.query("4*&超夢"));

嗯,乾淨俐落。不過不熟 Linq 的一定會問:
『Where這個方法找出的是Darwin0616的寶可夢中的什麼東西?有API參考嗎?/images/emoticon/emoticon19.gif

【Linq:Language Integrated Query (query syntax)】

在Linq中,上述在Darwin0616的寶可夢中檢索4星超夢,透過 query syntax

IEnumerable<Pokemon> qs4query = from p in darwin0616Pokemons
                                where p.query("4*&超夢")
                                select p;

似曾相識的SQL語法/images/emoticon/emoticon07.gif,白話就是:
從Darwin0616的寶可夢中
找出符合"4*&超夢"條件
的所有寶可夢。』

【method chain VS query syntax】

Microsoft官方說法:『Query syntax and method syntax are semantically identical, but many people find query syntax simpler and easier to read. 』
直接翻譯給大家聽聽:
Linq中,query syntaxmethod chain 是等價相同的,但是研究發現大多數的人覺得 query syntax 較容易閱讀及理解。』
為什麼 query syntax 較容易閱讀及理解/images/emoticon/emoticon19.gif

  • 我的理由ㄧ:
// 思考以下的 method chain
List<Pokemon> mc4query = darwin0616Pokemons.
                         methodA(...).
                         methodB(...).
                         ...
                         methodZ(...).
                         .ToList();

光看到這種methodA、methodB、...的方法命名,就不知道到底『看到了什麼』,每個方法的命名都很重要。藉由Functional Programming設計檢索功能,要能讓其他開發者能夠一目瞭然的讀懂檢索過程,並不是一件容易的事。/images/emoticon/emoticon13.gif
再來,method chain的長度越長,最後的輸出結果是否為List<Pokemon>就更讓人擔憂。
即使在沒有型態區分的javascript中,在那麼長的method chain後得到了一個true結果,你/妳真的確定這個true是預期的布林值,而不是被偷塞空白的true_字串嗎?/images/emoticon/emoticon17.gif

  • 我的理由二:懂SQL的人確實比會寫物件導向程式的人還多。

【Pokémon Go檢索系統】

https://ithelp.ithome.com.tw/upload/images/20200905/201091074atJR8yNry.jpg
在Pokémon Go中,不採用單一的檢索框來檢索寶可夢朋友道館,反而是獨立成三個
功能頁面。除了讓使用者更直覺地去檢索到要找的標的外,在ORM(Object-Relational Mapping)
的設計架構下,也較容易去與資料庫進行交易,因為標的的種類已經在各個功能頁面中固定了。

【總結】

檢索功能的設計,標的明確非常重要。用query syntax的寫作方式可幫助共同開發者不易迷失標的
另外,不要把所有的檢索標的塞在同一個檢索框或者檢索的頁面中進行檢索,使用者也能更直覺地檢索到他們要的東西。/images/emoticon/emoticon82.gif

本篇雖然用Linq來說明檢索時,用method chain較好還是用query syntax較好,
還提到ORM,不過以上都是個人在開發這些軟體功能時,自己主觀會採用的技術,並非N社
實際採用的方式,在此聲明一下。/images/emoticon/emoticon41.gif


上一篇
[Day 17] 任務系統--維羅博士的研究(2018新增)
下一篇
[Day 19] 社群日--行前教育
系列文
這些年,我玩Pokémon Go學到的兩三事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言