2022年10月23日 星期日

面試紀錄

雲海岸
---------
問get post的差異-其中有說明post在資安上是比較安全
使用 GET 的時候我們直接將要傳送的資料以 Query String(一種Key / Vaule的編碼方式)加在我們要寄送的地址( URL )後面,然後交給郵差傳送。使用 POST 的時候則是將寄送地址( URL )寫在信封上,另外將要傳送的資料寫在另一張信紙後,將信紙放到信封裡面,交給郵差傳送。
 POST 是將表單的內容放在 body 裡面,在不看封包的情況下似乎較為安全,此外在傳送檔案時會用到 multi-part 編碼,將檔案與其他表單一併放在 body 中傳送
https://medium.com/kurt/%E7%B6%B2%E9%A0%81get-%E8%88%87-post-%E5%B7%AE%E7%95%B0-%E7%A7%91%E6%99%AE%E5%A3%B9%E9%BB%9E%E9%80%9A-94cbaa666fdb

問spring IOC
主程式中所需要的輔助物件,並不是在自己的類別中建立,而是由外部控制的。建立好後,將其傳遞給主程式,這個動作稱為依賴注入(dependency injection,DI),是控制反轉的實現方式。
在Spring啟動時,這兩個類別會被建立成元件,存放在容器中。其中計算器使用了 @Autowired標記,因此框架會從容器中找出對應類別的元件,自動注入到計算器中。
一般來說,元件預設是「單例」的。意即在整個應用程式運行期間只會存在唯一一個。如此可避免產生不必要的重複物件。
Spring Boot透過容器,達到元件的控制反轉。而開發者透過用類別、介面甚至元件名稱來宣告輔助元件,讓容器得以完成依賴注入。在撰寫元件的程式碼時,我們可透過介面提供的方法來使用其他元件,以便在替換時,仍能保持一致的使用方式。而進行單元測試時,能夠自行傳遞不同屬性或實作類別的物件,提高了可測試性。
https://medium.com/chikuwa-tech-study/spring-boot%E8%88%87%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%89%E7%9A%84%E9%97%9C%E4%BF%82-ac1bd4b82ed5

在你專案中有用到什麼設計模式?
使用itext和POI的時候, 用Template樣板模式, 使其中重複用到的功能寫於抽象父類別, 而不同的generate report功能由各報表類別來實作, 合適的滿足開閉原則的要求

--------------
博彥
有考IOC AOP

AOP
AOP 的本質 — 改變程式碼的流程
以 Web Server 開發場景為例,我們經常會需要在很多 end-point API 的方法執行前先執行權限驗證,或者是在這些 end-point 執行 transaction 失敗時可以 rollback。

這些在程式碼中會重複出現,它們是重要但是不屬於我們核心業務的操作,如果要重複複製貼上到專案中的各處會造成難以維護的窘境。因此 AOP 試圖讓這些常被複用的邏輯獨立出來,用特殊的機制包裝起來,讓我們的業務邏輯不需要去看到任何相關的程式碼。

這件事本質上聽起來跟呼叫函式沒有太大的區別,然而 AOP 本質上是屬於一種 Meta Programming 。具體來說,實現 AOP 的工具處理的是程式碼本身(或 bytecode本身) 或是 class (或 object ) 的資訊,是用來改變程式碼的流程或織入( weaving ) 新的程式碼,而非只是單純地「執行一段程式」。

AOP 只是種指導編程模式的原則而已,在不同的語言和生態系中,類似的概念都有不同的實作方式,然而共通點都是藉由改變程式碼的流程讓核心邏輯不會受到額外的切面邏輯的影響。

在靜態語言中,程式的流程在編譯時期就會被寫死了,要穿插切面在程式碼各處會需要有額外的工具來支持。而在動態語言中,因為程式的流程並不是在編譯時期就被決定了,而是可以動態更改的,所以通常原生語法就支持了 AOP 功能。
https://tech-blog.cymetrics.io/posts/maxchiu/aop/



問: 有無使用TDD?

TDD(Test-Driven Development)是一種開發流程,中文是「測試驅動開發」。用一句白話形容,就是「先寫測試再開發」。先寫測試除了能確保測試程式的撰寫,還有一個好處:有助於在開發初期釐清程式介面如何設計。

程式介面,或是常說的 API 介面,是內部封裝細節和外部元件的溝通橋樑。在實作時,我們通常會希望程式介面維持穩定,越少改動越好。但在開發初期憑空定義出來的介面,常常在開發完成實際使用時才發現不好用,導致介面需要頻繁改動。

測試程式的作用是「模擬外部如何使用目標程式,驗證目標程式的行為是否符合預期」。換句話說,在寫測試時,會去了解目標程式如何被使用,比起憑空定義介面,更有助於在實作目標程式之前釐清適合的介面設計,減少後續變動的次數。

具體來說,TDD 流程可以分成五個步驟:

步驟一:選定一個功能,新增測試案例

  • 重點在於思考希望怎麼去使用目標程式,定義出更容易呼叫的 API 介面。
  • 這個步驟會寫好測試案例的程式,同時決定產品程式的 API 介面。
  • 但尚未實作 API 實際內容

步驟二:執行測試,得到 Failed(紅燈)

  • 由於還沒撰寫 API 實際內容,執行測試的結果自然是 failed。
  • 確保測試程式可執行,沒有語法錯誤等等。

步驟三:實作「夠用」的產品程式

  • 這個階段力求快速實作出功能邏輯,用「最低限度」通過測試案例即可。
  • 不求將程式碼優化一步到位。

步驟四:再次執行測試,得到 Passed(綠燈)

  • 確保產品程式的功能邏輯已經正確地得到實作。
  • 到此步驟,將完成一個可運作且正確的程式版本,包含產品程式和測試程式。

步驟五:重構程式

  • 優化程式碼,包含產品程式和測試程式(測試程式也是專案需維護的一部份)。
  • 提升程式的可讀性、可維護性、擴充性。
  • 同時確保每次修改後,執行測試皆能通過。

每個功能重複上述步驟,就是 TDD 的開發流程。

https://tw.alphacamp.co/blog/tdd-test-driven-development-example


問 Java 8 特性

https://www.796t.com/p/570214.html

https://blog.51cto.com/u_15236724/5368640


---------
匯誠
Array和List差異
Array需要先宣告陣列的大小,且是固定的無法再做更動,元素可透過"陣列名[索引index]=元素內容;"來進行新增的動作,再之後陣列名[索引index]就保有資料了,而常見的array型態也包括String型態。
ArrayList的大小可以變化,透過add來將元素新增至列表的末端,目前已有三筆資料(a、b、ccc),接著就看到其他常用的方法。
List是有序集合,是ArrayList的一個介面,但是只能夠使用List包含的方法,且不能實例化(Object),其他大部分都與ArrayList相像。

沒有留言:

張貼留言

[leetcode] [KMP] KMP

ABCDABD... ABCDABF... 簡單的說, 傳統解兩字串匹配部分 可能會來個雙迴圈, 哀個比對, 當不匹配的時候, 會將下方列再後移1位 然後不匹配再後移 然而 如果像上放已經有4個屬於匹配的字串, 她就應該直接往後移四位來匹配, 而不是只移動1位 隱藏的思維是, 當...