搜尋

搜尋結果

Lambda 表達式之可讀性
科技新知
MacauYeah・2023-11-24

Java作為一個真OOP物件導向的程式,在設計和編寫上是很嚴謹,什至是囉嗦的程度。近年很多Programmer因為各種原因,都放棄Java跳船去其他語言。 Javascript是其中一個很多人的選擇,因為Javascript有nodejs的加持,在Web世界下,可以同時走frontend、backend路線。而Javacript亦有一個很明顯的特性,就是大部份的library都以callback的型式出現。另外,Javascript也讓很多人覺得很簡潔,這除了是因為它沒有強型態的規限外,另一個原因也是因為有callback的大量使用。 Function Pointer 其實callback,籠統一點講就是在一個function A傳入另一個function pointer B。而編寫function A的作者,並初期並不知道function pointer B的實際操作會是什麼。A作者只是強調在特別定時候,它就會使用這個function pointer B。而這種把function pointer 傳來傳去的做法,就可以看成是Functional Programming的基礎。 Functional Programming除了把function pointer 當成是一等公民以外,還有很多附加要求,例如: Pure Function: 它只會使用到自己的Local Variable本地變數,這樣它的作用域就鎖死在Function內部,就不會有副作用。 傳統的OOP,Class中不少變數會以Class Attribute型式存在,雖然它們可能是private attribute,但還是獨立於Function外,這樣各Function的操作,都要靠作者好好地記著Class Attribute的狀態。 Nested Functions: 與普通程式語言類似,很多情況下都需要local variable,而Function Programming要足夠好用的話,就需要彈性地在function裏定義local function pointer。 Java Lambda 表達式 其實從Java 8開始,就有提供Lambda表達式,這是一個可以制作匿名function pointer的方法。所以硬要講,Java也可以做Functional Programming。 但必需要盡早強調的是,Java經常性地使用class attribute,它們很多時候都會引申請狀態的概念。即是在它們必需經過特定步驟後,class attribute才會有特定的意義。也就是Lambda表達式想保持Pure Function的特性,它可以使用的時期就有很大限制。 但我們還有必要使用Lambda嗎? 以筆者的經驗來講,它還是有作用的,特別在於它可以改善Class Function的閱讀性。 例如下面一個Java Class。它是一個工廠,提供一個服務可以生產一堆車。那些車而需要經過特定檢測,才能推出。 public class Factory { // ex1 public static List generateListOfCarByForLoop() { List tempCars = new ArrayList(); // many other logic // many other logic // many other logic List passTestCars = new ArrayList(); for (Car car : tempCars) { if (car.getWheels().size() == 4) { // many other check logics // many other check logics // many other check logics passTestCars.add(car); } } return passTestCars; } } 中間的for loop可以用lambda來改寫。 // ex2 public static List generateListOfCarByLamda() { List cars = new ArrayList(); // many other logic // many other logic // many other logic cars = cars.stream().filter((car) -> { if (car.getWheels().size() == 4) { // many other check logics // many other check logics // many other check logics return true; } return false; }).toList(); return cars; } 有人會說,上述ex2只是形式上改變了,沒有特別易讀。就像ex3這樣,把特定邏輯抽成獨立function,才是真正的易讀,對嗎? // ex3 public static List generateListOfCarByForLoopFunction() { List tempCars = new ArrayList(); // many other logic // many other logic // many other logic List passTestCars = filterCarsByWheelsSize(tempCars, 4); return passTestCars; } private static List filterCarsByWheelsSize(List originalList, int targetSize) { List passTestCars = new ArrayList(); for (Car car : originalList) { if (car.getWheels().size() == targetSize) { // many other check logics // many other check logics // many other check logics passTestCars.add(car); } } return passTestCars; } 上述ex3是一個有效的改進。如果大家不計較傳入參數的先後順序及交互影響的話,就已經很足夠。 但如果大家對於多參數的解讀又怎樣? private static List someotherfunction(List cars, List wheels) 大家又會不會突然停住,想想到底是cars影響wheels,還是wheels影響cars? 對於多參數的function來講,相互影響就會越來越多,但使用Lambda的話,可以針對性地表達這是一個Predicate Lambda。 // ex4 public static List generateListOfCarByLamdaComposition() { List cars = new ArrayList(); // many other logic // many other logic // many other logic List wheels = new ArrayList(4); cars = cars.stream().filter( filterCarByWheelSizePredicate(wheels) ).toList(); return cars; } private static Predicate filterCarByWheelSizePredicate(List wheels){ return (car) -> { if (car.getWheels().size() == wheels.size()) { // many other check logics // many other check logics // many other check logics return true; } return false; }; } 就最後的ex4版本,可以很明確的知道是cars被Predicate所作用。 如果大家還有其他使用Lambda的明顯好處,也可以一起來Github分享大家的Code

Japanican 東京、長野超狂復興優惠券!最強勁減83%!
激安優惠
OHChance 旅遊誌・2020-01-14

下載 OHChance 手機 APP, 特價資訊直送你手!   Japanican(e路東瀛)推出東京及長野縣復興優惠券,訂酒店依不同人數,最高減20000日元! 東京都酒店(限入住日期為即日起至2月28日):.滿12,000日元減10,000日元(優惠碼碼:TOKYO10) (限2位成人一間房且入住一晚).滿18,000日元減15,000日元(優惠碼碼:TOKYO15) (限4位成人一間房且入住一晚).滿24,000日元減20,000日元(優惠碼:TOKYO20) (限4位成人一間房且入住一晚) 長野縣酒店(限入住日期為即日起至2月28日):.滿12,000日元減6,000日元(優惠碼碼:NAGANO6) (限2位成人一間房且入住一晚).滿18,000日元減9,000日元(優惠碼碼:NAGANO9) (限3位成人一間房且入住一晚).滿20,000日元減10,000日元(優惠碼碼:NAGANO10) (限2位成人一間房且入住一晚).滿24,000日元減12,000日元(優惠碼碼:NAGANO12) (限4位成人一間房且入住一晚).滿30,000日元減15,000日元(優惠碼碼:NAGANO15) (限3位成人一間房且入住一晚).滿40,000日元減20,000日元(優惠碼碼:NAGANO20) (限2位成人一間房且入住一晚)  優惠碼使用方法是在填個人資料的頁面,旁邊的折扣碼空格中輸入優惠碼即可。注意只能訂一晚,而且每個折扣碼數量有限,用完即止。  【促銷公司】Japanican【折扣代碼】請參閱內文【預訂時限】折扣碼用完即止【預訂方式】Japanican 網頁【預訂網址】https://ohchance.info/ref/japanican   [價錢 Sample – 使用 TOKYO10 優惠碼] === 想搵平機票去玩,即上 OH!Chance!澳燦旅行資訊 https://ohchance.info/ 去日本旅行買咩 JR Pass好?即上 OH!Note!小燦的旅行筆記做功課 https://ohnote.info/ 唔知間航空公司好唔好坐?馬上 Subscribe OH Chance Youtube 睇睇佢:https://youtube.com/c/OHChanceTravel 睇埋 Facebook 專頁 https://fb.com/ohchance 第一時間獲得最新旅遊資訊!

測試驅動開發 | 系統邊界Mock
科技新知
MacauYeah・2024-04-23

好一段日子之前,筆者就介紹了一些寫Test Case的大方向 。對於大部份情況來說,有分隔的開發環境,有整個配套,測試起來是順暢的,想做單元測試可以,做整合測試也可以。但如果沒有,我們其實也要想辦法寫Mock。 Mock這個概念,對於寫前端程式的朋友應該比較熟悉,因為前端開發者總不能等後端準備好之後,才開始慢慢設計。前端很早期就要模擬一些情況,做介面設計,做各種思考。而且這個Mock不是指在運行單元測試時,才使用的臨時修改隨機數據。而是針對開發時,自行模擬的後端或外部環境。不過因為前端介面涉及很多主觀設計,很多元素冇辦法做固定的自動測試,所以前端的測試通常要人幫測試。 而後端開發,邊界Mock這一概念也很有用。在外部環境不足的情況下,為自己系統的邊界部份自建一個Stub / Dummy 等的模疑數據,是很有幫助的。不論我們對外部環境的掌控度有多少,我們走測試驅動開發(Test Driven Development),好好地定義這個外部環境的期待行為是很重要的。 例如,你有個功能,需要存入數據,但資料庫未準備好,也沒有所謂的In Memory資料庫可以用。這時,自己架空寫一個什麼都不做或回傳固定結果的函數作為中轉接口,然後在你的Test Case可以規劃你的想要結果。 也許你會說,這個函數就是存下資料,我不會需要它的回傳結果,但我們其實還是可以在Test case 中定義一些錯誤檢測,確保這個函數沒有Throw Exception 。再進一步想,我們主程式是否真的不負任何儲存失敗的責任?要定義其他回傳變數,方便寫Log讓追蹤?或者我們至少要知道成功後的Primary Key ?若然業務上真的不在乎儲存結果的有效性,我們不存入數據也是可以的? 所以歸根究底,我們還是在乎儲存的成功與否。還是有必要去驗證驗寫入是否成功。 上述例子,因為資料庫不存在,開發途中可能Test Case 有好長一段時間也通過不了,但至少當資料庫完備後,可以直接驗證,不用人手手工測試。 舉另外一個例子,我們要從某個地方,例如API或資料庫,讀取數據。我們也可以先寫中轉接口,並為它寫Test Case定義應有的行為。雖然明明就只是讀取,我們沒法控制太多。但在接口做好異常狀態處理,是很重要的。例如Handle exception、檢查某些重要業務值會不會是空、確保後續部份可以正常使用,這是因為我們不能被外部系統的失誤而導致自身系統癱瘓。 其實測試驅動,本質上就是強逼大家想多一點,好好定義預期的行為,不論內部條件怎樣變化,都有一自動的檢收標準。

【澳門優惠情報】吃貨們的福音!Visa卡簽賬著數優惠全公開,特選餐廳最低8
激安優惠
Cheers!・2020-09-24

在澳門出街食飯想食得抵,除了周圍比較格價之外,最簡單又快捷的方法當然是用 Visa 卡找數。由即日起至2020年12月31日,到指定特選餐廳食飯,除了有折扣優惠,還會提供 Visa 卡用戶獨有的禮遇,最低餐飲優惠更享有8折。馬上為大家介紹去澳門邊間餐廳食飯碌 Visa 卡有著數優惠啦! 一廳咖啡 ONE & ONLY Cafe Kitchen 在澳門開業四年的「一廳咖啡」主打混合式新派主題扒房特色西餐廳。好味菜式款式多,而且食材來自世界各地,十分國際化。現在到「一廳咖啡」結賬時使用 Visa 卡,總單享有88折優惠。香港持卡人,則享有85折優惠。 優惠:使用有效 Visa 卡簽賬,享總單88折優惠。香港持卡人,使用有效 Visa 卡簽賬,總單享有85折優惠。 地址:澳門黑沙環中街海天居地下UV舖 營業時間:週一至週日 上午 8 時至午夜 12 時 電話:+853 6613 3399 瘋堂新派料理 Fantasia Kitchen 充滿歐陸建築特色的西餐廳「瘋堂新派料理」位於澳門著名景點大三巴牌坊和婆仔屋之間的小巷內。以義大利食物為基礎,並在菜式內加入世界不同風格及口味,配合紅酒、白酒及手工啤等,這就是所謂的「美酒佳餚」。如果入座時出示有效的 Visa 卡,更可獲贈餐前小食一份,此優惠只得 Visa 卡持有者所有。 優惠:使用有效 Visa 卡簽賬,每桌獲贈餐前小食一份。 地址:澳門美珊枝街6A地下 營業時間:週二至週日 中午 12 時至晚上 11 時,週一休息 電話:+853 2835 8835 婆仔屋 ALBERGUE 1601 位於澳門婆仔屋內的「ALBERGUE 1601」,環境不但充滿葡萄牙建築風格,而且也是不少喜歡食傳統葡萄牙菜式的人士必到之處。現在消費滿澳門幣800元,就可以獲贈主菜一份,好味又抵食。 優惠:使用有效 Visa 卡簽賬,消費滿800澳門元(不含10%服務費),每桌可獲贈主菜一份。 地址:澳門瘋堂斜巷8號 營業時間:週一至週日 中午 12 時至下午 3 時,晚上 6 時至 10 時 30 分 電話:+853 2836 1601 英皇娛樂酒店 - 皇廷閣 Grand Emperor Court 來到位於澳門南灣區的「皇廷閣」,除了有以珍貴海味及海鮮為主的廣東菜式之外,更備有各種上等香茗。顧客到店後出示有效 Visa 卡並簽賬,就可以獲得9折優惠,還會贈送開胃菜,記得在預約 ”任何特殊要求” 欄內,提及 “Visa Offer” 呀! 優惠:使用有效 Visa 卡簽賬,午餐單點或晚餐單點(贈送開胃菜)享9折優惠。 地址:澳門商業大馬路288號英皇娛樂酒店9樓 營業時間: 週一至週六 上午 11 時至下午 3 時,晚上 6 時至 11 時; 週日及公眾假日 上午 10 時至下午 3 時,晚上 6 時至 11 時 電話:+853 2838 3322 英皇娛樂酒店 - 貴族炉端燒 Royal Robatayaki 同樣是位於英皇娛樂酒店內的「貴族炉端燒」,最擅長為食客帶來新穎日式燒烤美食。看著大廚以熟練技巧即場炮製日本地道料理,大飽眼福之餘,更加提升對食的慾望。想享受放題九折優惠,就記得碌有效的 Visa 卡,一星期七日都有優惠呀! 優惠:使用有效 Visa 卡簽賬,享週一至週五和風午餐定食及週末節假日午餐放題9折優惠;每日晚餐放題享9折優惠並贈送開胃菜。 地址:澳門商業大馬路288號英皇娛樂酒店大廳 營業時間:週一至週日 中午 12 時至下午 2 時 30 分,晚上 6 時至 11 時 電話:+853 2888 9918 英皇娛樂酒店 - 御廚 Royal Kitchen 想食自助餐的朋友,機會來啦!英皇娛樂酒店「御廚」集合了中西式美食,以及多款健康小吃及甜品,令人滋味無窮。現在用 Visa 卡付款,不但有九折優惠,而且還送您飲品。 優惠:使用有效 Visa 卡簽賬,自助午餐及自助晚餐(贈送飲品)享9折優惠。 地址:澳門商業大馬路288號英皇娛樂酒店9樓 營業時間:週一至週日 早上 7 時至 10 時 30 分,中午 12 時至下午 2 時 30 分,晚上 6 時至 10 時 電話:+853 2838 9988 有間咖啡廳 La Caffetteria 想一邊嘆美食,一邊欣賞澳門南灣湖畔的湖景?「有間咖啡廳」一定是心水之選。現在使用 Visa 卡簽賬,即時給您9折優惠。 優惠:使用有效 Visa 卡簽賬,享消費總單9折優惠。 地址:澳門商業大馬路89L及K南灣半島地下K及L舖 營業時間:週一至週日 上午 11 時至晚上 11 時 電話:+853 2871 8694 西洋菜餐館 Seek Your Choice Bistro 在澳門開業至今已經有8年的「西洋菜餐館」,運用西式烹調技巧,把澳門本地傳統及獨有的食材及風味呈現出來。如果出示有效 Visa 卡並用來結賬,即刻送您一份「西洋菜餐館」精選甜品。 優惠:使用有效 Visa 卡簽賬,每桌獲贈精選甜品一份。 地址:澳門南灣湖景大馬路雅文湖畔S8舖 營業時間:週一至週日 中午 12 時至晚上 10 時 30 分 電話:+853 2871 4150 品咖啡 Blooom 鍾意嘆咖啡的朋友,不妨來到「品咖啡」,品嚐最新鮮烘焙出來的咖啡。現在用 Visa 卡購物滿澳門幣200元,就送您單品咖啡掛耳包一份。 優惠:使用有效 Visa 卡簽賬,消費滿任何咖啡產品(飲品/咖啡豆/咖啡掛耳包)滿澳門幣200元,即可獲贈單品咖啡掛耳包一份。 地址:澳門中區雀仔園柯高街5號 營業時間: 週一至週五 上午 8 時 30 分至晚上 7 時 30 分 週六日 上午 11 時至晚上 7 時 電話:+853 6665 0584 地址:澳門國際機場第10-00-0028號商鋪(離境禁區1號登機閘口) 營業時間:週一至週日 約上午 6 時 30 分至凌晨 2 時 電話:+853 6252 7360 Goa Nights 在氹仔舊城區、由印度人開設的「Goa Nights」是不少白領人士放工後,和朋友摸酒杯底的好地方。由印度人手上調配出來的創意雞尾酒,配合印度菜式口味,每晚盡情享受 Happy Hour!享受完 Happy Hour,一於碌 Visa 卡,就可獲85折優惠。 優惠:使用有效 Visa 卡簽賬,享總單85折優惠。 地址:澳門氹仔告利雅施利華街118號 營業時間:週一至週日 中午 12 時至下午 3 時,晚上 6 時凌晨 1 時 電話:+853 2856 7819 澳門十六浦索菲特酒店 - 雅聚廊大堂吧 Rendez Vous Lobby Bar 走法國風為主的「雅聚廊大堂吧」無論格局或食物都別樹一格。早餐、下午茶及黃昏時段均會推出特式悠閑輕食,再來嚐一口由調酒師調配出來的獨特雞尾酒,甚麼煩惱都可以拋諸腦後。結賬時 Visa 卡,更帶給您所有餐點及飲品消費85折優惠。 優惠:使用有效 Visa 卡簽賬,享所有餐點及飲品消費85折優惠。 地址:澳門十六浦索菲特酒店1樓 營業時間:週一至週日 中午 12 時至凌晨 2 時 電話:+853 8861 7213 澳門十六浦索菲特酒店 - 派意舫 Privé 同樣是走法式路線的「派意舫」主要以法式烹飪為主,每個季節都會帶來不同驚喜體驗,最適合小型私人晚宴。用 Visa 卡付有關 ”派意舫海鮮之旅” 菜單費用,即可享85折優惠,好抵食。 優惠:使用有效 Visa 卡簽賬,享 “派意舫海鮮之旅” 共享菜單85折優惠。 地址:澳門十六浦索菲特酒店6樓 營業時間:週二至週六 晚上 6 時至晚上 10 時,週日及週一休息 電話:+853 8861 7213 澳門十六浦索菲特酒店 - 海風餐廳 Mistral Restaurant 以環球海鮮自助餐而聞名的「海風餐廳」,除了可容納高達 188 人之外,客人還可以選擇到池畔古雅露天平台。一邊欣賞澳門內港風貌,一邊品嚐美食,用 Visa 簽賬更可獲所有餐點及飲品消費8折優惠。 優惠:使用有效 Visa 卡簽賬,享所有餐點及飲品消費8折優惠。 地址:澳門十六浦索菲特酒店6樓 營業時間: 早餐:週一至週五 上午 7 時至上午 10 時 30 分,週六日 上午 7 時至 11 時 午餐:週一至週日 中午 12 時至下午 2 時 30 分 晚餐:週一至週日 晚上 6 時至晚上 9 時 30 分 電話:+853 8861 7210 澳門十六浦索菲特酒店 - 樂軒華粵菜餐廳 Le Chinois Cantonese Restaurant 邊食粵菜,邊欣賞澳門全景那個地方可以做得到?答案是「樂軒華粵菜餐廳」。餐廳內可容納 148 人,而且菜式均是以正宗粵菜,再配以法式來演繹,為客人帶來嶄新飲食體驗。同樣用 Visa 結賬,可獲得最低8折餐點優惠。 優惠:使用有效 Visa 卡簽賬,所有餐點消費8折優惠。 地址:澳門十六浦索菲特酒店18樓 營業時間:週一至週日 上午 9 時至下午 3 時,晚上 6 時至晚上 10 時 30 分 電話:+853 8861 1001

Switch / Steam Deck / Mobile 使用體驗大比拼 (三)
手機‧電玩
MacauYeah・2023-12-14

上兩期,筆者從機身重量、續航性兩方面,對於遊戲機身便攜性的影響,今期最後一期,就從穩定性方面去討論,最後再做一個綜合影響。 沒有對比也就沒有傷害 - Mobile - Smart Phone 筆者所講的穩定性,其實就是正常運行一個遊戲,不會出現閃退的情況,讓你可以正正常常玩完一款遊戲。但因為Mobile原本是多用途機器,你玩著玩著,可以就要跳出遊戲回覆信息,但再次回到遊戲後,能不能正常運行的不知道。 大部份iOS遊戲,因為舊iphone機能限制,基本上跳出去後,都因為不夠RAM,回來後遊戲會重置。除非你打死不切換,否則一款遊戲沒有頻繁auto save功能,根本玩不下去。Android可能會好一點,有不同機型可以選擇,多一點RAM總是安全一點。 強行地用Linux運行Windows的黑科技 - Steam Deck 老實說,Windows已經不夠穩定,用Linux運行Windows Game,會比較穩定嗎?不過最幸運的是,Steam Deck有技術支援,更有社群支援,各遊戲經過Steam官方驗證,連續遊玩下閃退情況都很少。不穩定的原因,反而是Steam Deck主機本身。 在筆者遊玩的經驗中,待機後再打開,有一定機會率會整個遊戲閃退。這些問題在遊玩大作,特別是3A大作,會引來一個很不愉快的體驗。因為它們的auto save位置點一般都是以情節點來做考量,而以上班族來講,三步一待機的使用情境也很常見,那麼觸發閃退的機會率就很高。某次啟動會隨機引起閃退遊戲,真的欲哭無淚。 筆者也翻查過網上的資料,一年多前就有這個問題存在,而官方亦無法根治。筆者在寫稿的途中,還在測試坊間一些可能的補救方式,但因為時間不長,不敢說這問題是可以解決的。 穩定發揮 - Switch Switch在穩定性真的無可挑剔,多次待機後都沒有太多問題。完全貼合它的市場定位:在家可以隨時在電視玩,出外也可以四處走。隨時隨地停,隨時隨地再開。最多最多都是遊玩實體卡帶時,因為接觸不良而閃退。但這些不可避免的,因為實體卡始終是物理型態存在,跟著Switch四處奔波,難免會出問題。但下載數位版,存放於SD卡就不會有閃退。至少SD卡不會像實體卡會經常替換,所以出問題的機會也較少。 綜合體驗 其實討論了幾個方面,筆者都從是省心遊玩的角度出發去討論。 Mobile在裝備上會最少煩惱,想最輕鬆出問,這個是不二選擇,但考慮玩非課金類遊戲就最沒有保障。 Steam Deck優點是移動堡壘,若你玩的是高性能需求的遊戲,你只能選它。但想隨時玩就未必做得到。 Switch 在重量和穩定性上面最有優勢,考量延續性體驗,這個是首選。