發表文章

目前顯示的是 1月, 2021的文章

面試題

Difference between socket and websocket? Difference between subroutine , co-routine , function and thread? interface 和 abstract class static 關鍵字 javascript 閉包 let const var 變數提升 mysql left join right join inner join

java leetcode 小技巧

http://hilite.me/ ===========  return new int[] { i, j }; 可以直接產生結果。 ========== StringBuilder res = new StringBuilder() String Builder可以創建動態長度的string,並可以串接不同型態的變數,都會轉成字串。 toString 轉成 String 型態。 ========== String a = "aa"; a.charAt(0) 可以從字串拿值。 ========== 給int x; char str[] = Integer . toString(x) . toCharArray(); 可以把數字轉成 str array。 ========== int  m = (l + r) >>  1 ; 等價於 int  m = (l + r) / 2; ========== 二維陣列動態規劃起手式 // 宣告array長度的dp boolean [][] dp = new boolean [ arr . length ][ arr . length ]; // 將對角線初始化 for ( int a = 0 ; a < arr . length ; a ++) { dp [ a ][ a ] = true ; } // 產生不同間隔 // length = 5 /* 間隔1 0 1 1 2 2 3 3 4 間隔2 0 2 1 3 2 4 間隔3 0 3 1 4 間隔4 0 4 */ for ( int a = 0 ; a < arr . length ; a ++) { for ( int b = 0 ; b < arr . length - a - 1 ; b ++) { int diff = b + a + 1 ; } }

MVC理解

https://stackoverflow.com/questions/5863870/how-should-a-model-be-structured-in-mvc/5864000#5864000 https://stackoverflow.com/questions/16356420/mvc-for-advanced-php-developers/16356866#16356866 https://nikic.github.io/2011/12/27/Dont-be-STUPID-GRASP-SOLID.html  MVC為一個設計模式,Model為一個層,不是一個物件或是一個class,包含業務邏輯跟資料存取,Controller為一個交互層,只負責接收進來的資料,傳到Model做處理,所以Controller只是薄薄的一層,View為顯示介面,不包含計算邏輯。 Model包含三個部分: Domain Objects:      表示業務邏輯的物件。 Data Mappers:      資料持久化,不管來源從哪邊來,可能是DB、API、檔案。 Services:      Domain Objects和Data Mappers的交互層,可以避免一些Domain Object的業務邏輯進入Controller。

物件導向

圖片
抽象 只提供基本資訊,隱藏不必要的資訊。 降低設計的難度 封裝 隱藏實作細節 裡面的數據不提供給外部對象使用 外部對象只能通過接口溝通 繼承 被繼承的類叫基類,繼承的類叫子類。 基類應為一個抽象概念,為一個抽象類,代表不應直接實例化基類。 子類有基類的功能跟數據,減少重複。 多型 子類代替父類。 傳入參數定義成父類,傳入子類達到不同功能。 父類為抽象,符合針對抽象編程。 類的關係 aggregation association dependency composition inheritance (generalization) implementation (Realization) association 為 has a 的關係,A has a B 代表,A class 有一個成員變數為 B。 程式碼為 : class A {     B b; } dependency 為 A references B (use a) 的關係,A references B 代表 A 在某個 function 內有用到 B,A 使用 B 的操作,但卻不擁有 B,可能是: 通過參數傳入 直接 new  返回值 靜態function 全域對象、變數、function 程式碼為 : 參數傳入 class A {     function t1(B b) {      } } 或直接 new class A {     function t1() {          B b = new b();      } } 或返回值 class A {     function t1() {         return new B();     } } aggregation 也是 has a (own a) 的關係,為 association 的子集,為較弱的 association ,A 聚合 B 代表,A 擁有 B,但是 B 可以獨立運作。 程式碼為 : class A {     B b; } 或 class A {     Array<B> b; } composition 是 has-a (part-of) 的關係,為 association 的子集,為較強的 association,A 組成 B 代表,A 擁有 B,B 是 A的一部份,A 被刪除之後,B 也跟著被刪除

物件導向名詞

base class: 基類 = super class 被繼承的類。 derived class: 派生類  = sub class 繼承別人的類。 繼承的類是被繼承類的特殊類型。 private: 只有類可見。 public: 類跟子類跟類的使用者可見。 protected: 只有類和子類可見。

javascript 非框架組織程式碼

https://addyosmani.com/resources/essentialjsdesignpatterns/book/ https://learn.jquery.com/code-organization/concepts/ Object-Pattern and Module-Pattern Revealing Module Pattern https://medium.com/@Rahulx1/revealing-module-pattern-tips-e3442d4e352 Component-Based JavaScript Architecture https://www.seancdavis.com/blog/component-based-js-architecture/ https://medium.com/@smarth55/web-component-based-architecture-8837052b9e50

類與類的關係

圖片
https://learnku.com/articles/789/laravel-learning-notes-the-magic-of-the-service-container  https://javarevisited.blogspot.com/2014/02/ifference-between-association-vs-composition-vs-aggregation.html#axzz6kCg1UitW OOP 注意事項: 系統質量: https://en.wikipedia.org/wiki/List_of_system_quality_attributes 原則: solid、grasp https://dzone.com/articles/solid-grasp-and-other-basic-principles-of-object-o 封裝變化: 假設類不能改變 關注分離 將動作延遲到子類 面向對象編程: 接口 類  對象 一個類必須要遵守其實現的接口;對象則是一個類實例化後的產物,稱其為一個實例。 類的關係: is a: 繼承、實作 has a: 關聯 has a: 聚合 use a: 依賴 part of: 組合 UML 箭頭: association: 關聯 inheritance: 繼承 implementation: 實作 dependency: 依賴 aggregation: 聚合 composition: 組合

工廠方法模式

 沒有靜態屬性,可以被繼承,子類會分擔創建的職責。 組成: 抽象工廠類 具體工廠類 抽象產品 具體產品 簡述: 客戶使用工廠類產生具體產品,通過傳入的參數取得想產生的具體產品,工廠類將返回抽象產品的類型。 類圖: 分析:

簡單工廠模式

圖片
 又稱靜態工廠模式。 組成: 工廠類 抽象產品 具體產品 簡述: 客戶使用工廠類產生具體產品,通過傳入的參數取得想產生的具體產品,工廠類將返回抽象產品的類型。 類圖: 分析: 可以把創建產品的任務分離到工廠類,使用上只要引入工廠類傳入參數就可以取得要的實例。 工廠類有所有創建的職責,工廠類會膨脹。 增加新項目需修改工廠類,違反OCP。 若是有其他種類的物件需要產生,就需要其他的工廠類。 工廠類為靜態類別,使用上方便。

php

https://www.jianshu.com/p/5187a3506bd3 https://blog.csdn.net/huyixiong/article/details/84556255 https://stackoverflow.com/questions/37431413/why-cannot-apache-handle-multiple-requests-at-the-same-time 進程為運行起來的程式,包含 cpu 和內存資源,指令集和系統資源,指令集就是代碼。 php 被訪問時至少會有一個進程跟一個線程。 php 使用 pcntl 管理多進程。 php 使用 pthreads 管理多線程。 要了解網站運作就要先了解 apache 和 nginx。 進程可以產生子進程,都是進程只是子進程會繼承父進程部分屬性。 apache 最核心的功能為 MPM,為了操作系統的資源,對進程和線程池進行管理。 MPM有 prefork、worker 和 event 三種模式,預設為 prefork。 prefork: 一個父進程負責產生子進程,父進程綁定80端口。 子進程負責處理請求並響應。

GRASP Design Principles

 https://home.cs.colorado.edu/~kena/classes/5448/f12/presentation-materials/rao.pdf https://krzysztof-kwiecinski.medium.com/grasp-design-principles-de98cae2196c Creator 問題:有一個物件需要被創造,誰有職責創造物件。 解法:被包含的物件要被包含他的物件創造。 Expert 問題:有一個物件,需要決定這個物件能什麼職責。 解法:擁有資料的人有解決問題的職責。 Low Coupling 問題:兩個物件的聯繫強度應該要多強。 Coupling: 一個物件聚合或組合於其他物件。 一個物件實作或繼承於其他物件。 聚合:     子物件可以獨立於父物件 運作,如圖書館、書架、書。 組合:      子物件不可獨立於父物件,如人、手、腳。 Controller 處理 ui 層到 domain 層的請求。 其他情況: 物件代表整個系統。 物件代表use case。 肥大的controller代表: 問題:controller有太多職責,解法:開更多的controller。 問題:controller做太多的任務,解法:委託給其他的class。 High Cohesion 問題:元素和功能如何關聯 解法:相關職責包在同一個單元裡。 Polymorphism 多型提供解決方式處理相同類型但會變化的物件。 Pure Fabrication 把相關的但有牽扯到其他操作的分開到其他的 class,例如資料庫操作。 Indirection 問題:如何避免兩個元素直接耦合。 解法:加一個元素在兩個元素中間,避免直接耦合。 ex: Adapter, Facade, Obserever

laravel難題

 服務容器 https://learnku.com/articles/6158/laravel-container-container-understand-below Form request 原理 https://www.linkedin.com/pulse/how-formrequest-validation-works-laravel-taukeer-liaqat/

php 難題

 https://www.cnblogs.com/qiye5757/category/1260984.html https://kunststube.net/static/ cookie vs session cookie儲存在客戶端,session儲存在伺服器端。 cookie有大小數量限制,session沒有。 cookie只能 ASCII 字符串,session可以存任意資料結構。 cookie可以設置期限,session關掉瀏覽器則消失。 cookie對伺服器負擔小,session負擔大。 $a++ vs ++$a $a++ 先return 在 ++ ++$a 先++在return bitwise operator http://easyonlineconverter.com/converters/bitwise-calculator.html https://kknews.cc/zh-tw/code/qbbp9er.html https://kknews.cc/zh-tw/code/gm5zy4e.html 對一個請求給一個進程,一個進程只會有一個線程,php-fpm維護進程池。 Output Buffering Control  https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/239381/ 優化 echo比print快 for之前決定最大值 單引號>雙引號 正則表達式慢 switch case > if else self vs static vs $this https://blog.csdn.net/lamp_yang_3533/article/details/79912453

class

https://ithelp.ithome.com.tw/articles/10216645?sc=pt abstract class: 不能被實例化 可以有construct 有抽象的function跟具體的function 需被子類別繼承 interface: 為契約 需要被implement 只能包含function聲明 不能包含function實作 不能被實例化 類別: 尚未被實例化的class,為一種設計。 物件: 已經被實例化的class,值會隨著邏輯改變。 封裝: 隱藏實作細節,只開放應該要開放的屬性和方法,可以任意修改內部細節,而不影響外部使用者。 繼承: 子類別繼承父類別,就代表子類別擁有父類別的屬性和方法,子類別會擴充父類別,子類別is a 父類別。 多型: 同一個操作作用在不同類別上,會有不同的行為。 SOLID Grasp 設計pattern Analysis Pattern Software Architecture Pattern Design Pattern HCI Pattern (Human, Computer Interface) Implementation Pattern Refactoring 設計: 所有的數據都應該隱藏在類的內部。 類的使用者必須依賴類的公有接口,類不能依賴類的使用者。 盡量減少類的公有接口。 不要把實現細節放到公有接口。 不要把無用的東西放到公有接口。 導出耦合: 一個類用到另一個類的公有接口,類與類之間應該只有導出耦合的關係。 類只表示一個關鍵抽象(key abstraction) 相關行為和數據放到同一個類。 不相關的訊息放到另一個類。

refactoring

Extract Method 問題:有很多代碼片段集中在一個function。 解決:可以個別抽出為一個function。 Replace Temp with Query 問題:把計算表達式存在變數。 解決:把表達式放到function。 好處:代碼可讀性,表達式比function難懂。 可以刪除重複公式的地方。 Replace Method with Method Object 問題:大量相關的變數宣告在一個function裡。 解決:一起放在一個class裡。 Inline Method 問題:代碼跟function名稱一樣清晰,不需再包一個function。 解決:直接使用代碼。 Split Temporary Variable 問題:一個變量在整個function內不斷被重複使用。 解決:一個變量應該只承擔一個職責。 Substitute Algorithm 直接替換 function 主體。 Extract Variable 問題:有表達式難以辨識。 解決:  用顯而易見的變數名稱去命名。 Inline Temp 不必要的臨時變數。 Remove Assignments to Parameters 將參數存入變數裡,而不是直接使用參數。