發表文章

目前顯示的是 2021的文章

系統設計

https://github.com/checkcheckzz/system-design-interview https://www.interviewbit.com/courses/system-design/ https://ithelp.ithome.com.tw/articles/10235277 需求  CAP原則 規模估算 儲存量估算 頻寬估算 Data sharding APIs 技術: load balancer cache db 兩種pagination的方式 offset base cursor base 取決於內容是靜態還是動態 Pull model又稱為Fan-out on load Push model又稱為Fan-out on write hybrid model 對於follower不多的人 使用Push model 對於follower多的人 使用Pull model SELECT * FROM products OFFSET 0 LIMIT 50; 效能隨著table大小變差 LRU https://josephjsf2.github.io/data/structure/and/algorithm/2020/05/09/LRU.html Access pattern? Write back(有空的話Write through, write around, write back都要知道什麼意思 利弊) Latency Numbers Every Programmer Should Know https://gist.github.com/jboner/2841832 https://www.youtube.com/watch?v=-W9F__D3oY4 http://ninefu.github.io/blog/Harvard_CS75_Notes/ http://highscalability.com/blog/2016/1/11/a-beginners-guide-to-scaling-to-11-million-users-on-amazons.html http://www.aosabook.org/en/distsys.html https://github.com/checkcheckzz/system-design-in

面試技術

https://blog.csdn.net/jackfrued/article/details/44921941 https://wiki.jikexueyuan.com/project/java-collection/hashset-and-hashmap.html https://yubin551.gitbook.io/java-note/basic_java_programming/datatype/primitivedatatypes 1. 面向对象的特征有哪些方面? 2. 單精度 雙精度 單精度是這樣的格式,1位符號,8位指數,23位小數。 雙精度是1位符號,11位指數,52位小數。 Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean; 7. int和Integer有什么区别? wrapper class 原始类型: boolean,char,byte,short,int,long,float,double 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double 8. HashCode 23. 抽象类(abstract class)和接口(interface)有什么异同? 创建对象时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。 多線程 等待池 鎖池 https://blog.csdn.net/weixin_42504145/article/details/85329386 資料庫 排他鎖 序列化 java https://matthung0807.blogspot.com/2019/01/java-serializedeserialize.html InputStream OutputStream writer reader https://blog.csdn.net/qq_31617121/article/details/79110699 XML文档定义分为DTD和Schema两种形式 事務 Statement和PreparedStatement 事务的ACID 首先需要知道的是,只有存在并发数据访问时才需要事务。当多个事务访问同一数据时,可能会存在5类问题,包括3

面試

http https ssl憑證 自己先用 OpenSSL產生 CSR(憑證簽署要求 )和私鑰給CA,CA返回公鑰和憑證 tls 1.0 1.1 1.2 1.3 SSL 1.0、2.0和3.0 solid  grasp data structure algorithm design pattern SOA和微服务架构的区别? 提出 MicroService 概念的Martin Fowler 也说过,“我们应该把 SOA 看作微服务的超集”,也就是说微服务是 SOA 的子集。 https://www.zhihu.com/question/37808426/answer/536875376 容器编排、APM、CI/CD(持续集成/持续交付)、自动化测试等 APM = application performance monitoring 三向交握 (1)用戶端發送一個帶SYN標誌的TCP報文到伺服器。這是三向交握過程中的報文1。 (2) 伺服器端回應用戶端的,這是三向交握中的第2個報文,這個報文同時帶ACK標誌和SYN標誌。因此它表示對剛才用戶端SYN報文的回應;同時又標誌SYN給用戶端, 詢問用戶端是否準備好進行資料通訊。 (3) 客戶必須再次回應服務段一個ACK報文,這是報文段3。 註:因為TCP是全雙工系統的,其實正常的時候,是需要雙方通道都要測試是否開啟成功才行,然而因為在第二次握手的時候,伺服器不僅發送了確認報文,而且還發送了要與用戶端相關的報文SYN,詢問用戶端是否準備資料通訊,這樣就省了一個報文的發送。  四次揮手 (1) TCP用戶端發送一個FIN,用來關閉客戶到伺服器的資料傳送(報文段4)。 (2) 伺服器收到這個FIN,它發回一個ACK,確認序號為收到的序號加1(報文段5)。和SYN一樣,一個FIN將佔用一個序號。 (3) 伺服器關閉用戶端的串連,發送一個FIN給用戶端(報文段6)。 (4) 客戶段發回ACK報文確認,並將確認序號設定為收到序號加1(報文段7)。  https://topic.alibabacloud.com/tc/a/interview-frequently-questions-tcp-three-times-handshake-and-four-times-handshake_8_8_20192249.html 全雙工(full-d

架構名詞

關鍵字: controller model view data object interaction context event ddd dci use case domain service domain object domain application service domain event bounded context context map aggregate modules 不同的bounded context可視為不同的團隊 統一模型並不是很好,因為用一個模型來統治它們是一個壞主意,我們清楚地明白我們需要有不同的背景,通過擁有不同的背景,模型 可以生活在上下文中並自由進化 驗證在哪邊做,分成兩種,一個是服務外,一個是服務內,誰擁有資料誰就做驗證,如果是牽涉到資料庫查詢確認id是否存在要在服務外,若是服務內參數則在服務內。

git commit 類型

features. 功能 fix 修正 style 代碼格式 refactor 重構 docs 文件 perf 效能 chore  其他不重要的 extend 擴展

mysql

 https://www.zhihu.com/question/24696366

DDD

 https://stackoverflow.com/questions/52977040/bounded-context-in-food-delivery-use-case https://zhuanlan.zhihu.com/p/31985410?fbclid=IwAR3Z6cZZtjkI-kLD_f8oJyonx3BlvqLBvu4_LCWn578oflQS_iicqJpSwKk https://docs.microsoft.com/zh-tw/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/apply-simplified-microservice-cqrs-ddd-patterns https://www.jdon.com/44604 https://zhuanlan.zhihu.com/p/40089542 https://medium.com/nick-tune-tech-strategy-blog/bounded-context-canvas-recipe-use-case-swimlanes-11ca647175d3 https://zhuanlan.zhihu.com/p/368736746 https://zhuanlan.zhihu.com/p/368098015 https://www.zhihu.com/topic/19826540/hot https://developer.aliyun.com/article/59498 https://cloud.tencent.com/developer/article/1054076 https://cloud.tencent.com/developer/article/1054055?from=article.detail.1054076 https://cloud.tencent.com/developer/article/1161492?from=article.detail.1054076 1個系統 多個subdomain  1個subdomain 1個bounded context bounded context多個use case 多個modules bounded context 視為可獨立運作,若需

常用的後綴

Builder Writer Reader Handler Container Service Action Repository Context Helper Proxy Entity Job Strategy Factory Provider Collection Converter Info Manager Option Array List Editor Adapter Translator  Transformer Transiter Transfer Toggler Logger Loader Dispatcher Purifier Generator Searcher Calculator Combiner Filter Bridge Composite Decorator Facade Proxy Command Iterator Mediator Observer State Template Visitor Resolver invoker Decoder Encoder

關鍵字

 https://blog.csdn.net/significantfrank/article/details/98087611 https://blog.csdn.net/Nyiragongo/article/details/103755632 https://blog.csdn.net/significantfrank/article/details/93173386?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control 流程引擎 整洁面向对象分层架构 领域建模

laravel code style

 單文件 <?php namespace App\Modules\Blog\Action; use App\Http\Controllers\Controller; class CreateBlog extends Controller { } 1. namespace 上下空一行 2. use 關鍵字上下空一行 3. class 的 { 需換行 4. class 的 } 後面需換行 <?php if ( $a === 1 ) { } 5. if 跟 ( 間要有空格 6. ) 跟 { 要有空格 7. { 不需換行 8. 比較符號左右都需有空格 <?php class a { public function b () { } public function b () { } } 9. 兩個 function 之間需要空一行 <?php $a = 1 ; 10. 變數跟 = 之間左右要空一個 <?php for ( $a = 1 ; $a < 10 ; ++ $a ) { } 11. for 迴圈如上,使用++$a 取代 $a++ <?php class Spinach extends Vegetable { public $cooked = false ; public function __construct () { parent :: __construct ( true , 'green' ); } public function cook_it () { $this -> cooked = true ; } public function generateRandomString ( $length = 10 ) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ; $ch

laravel 面向接口

物件導向原則 solid grasp 針對街口編程 laravel的入口是action action 會經過 request 參數驗證(丟出422 exception) 和 service 驗證(丟出404 403 exception)。 request 經過 放入dto 規格化,不再是array,總是有設定dto的動作。 把dto 丟入 service 層,service只接受dto,service層會互相引用,interface 會描述service是什麼,能做什麼,或是提供一個可替換策略。 crud service 分開成 readService(r) 和 Alter(mutate)Service(cud)。 區分查詢跟改變的function 一個function只能做查詢或改變系統狀態 cqrs  進到repo前會有data processing 將資料轉成array repo只接受array 連collect都不行 repo不帶有業務邏輯 原則 如何最簡單的達成任務 只在有需要的時候創建功能 而不是用預見 簡單不是沒東西可以加 而是沒東西可以減少 不要重複 做為一個維護者 而不是開發者 不要讓下一個接手的人思考這個是啥 最小驚訝原則 Do not talk to strangers 不暴露更多細節

mssql win10對外連線

圖片
1. 啟用sql server agent  2. sql Native Client 的 TCP / IP 設成 已啟用 3. Sql server網路組態 的 TCP / IP 設成 已啟用 4. sql server management 伺服器屬性裡面的連線設定為允許遠端連線 5. 防火牆開啟1433 port  控制台 > 防火牆 > 進階設定 > 輸入規則 > 新增規則 > 選連接埠 > 填1433 > 填名稱 > 完成 進階設定 新增規則 連接埠 TCP 1433 6 開啟sql server browser 一開始是關閉的 也沒辦法直接開啟  要從服務裡面開啟 右鍵選擇內容 啟動類型改成自動 服務裡面對sql server browser右鍵選擇開啟 7. 重啟 sql server 和 sql browser

laravel application layers

action : 可以接service, 不能接repo 可以產dto vaildate : 可以接repo, 本身是service service : 可以接 service 注意環狀依賴 可以接repo 主要功能是被委託 data processing :  處理進入repo的資料 可以產po unit of work 工作單元模式 協調多個table操作 一起成功 一起失敗 try catch repo 無邏輯 僅寫入資料庫

vue 組件設計

前言 對於component到底需要設計到多小,沒有一定的標準,根據開發情境決定。 component設計: 可以分成設計面跟程式面,其實兩個是差不多的規則。 設計面可以參考原子設計裡面的5個部分: 原子,分子,組織,模板,頁面。 原子: UI的最小單位。一個button、一個input或少數div組成的文字框,可以在整個網頁不斷覆用。 分子: 少數原子組合起來,例如表單裡面的label + input。 組織: 由分子和原子組合起來,例如一個form或是一個card。 模板: 由以上分子和原子和組織組合起來,一個頁面的版型。 頁面: 這裡的頁面不同於模板,而是實際套用資料的結果頁面,例如: 一個產品模板會給很多的產品資料套用,不同的產品資料套用到同一個模板,就是不同的頁面。 程式面從一個組件該做什麼事,如何覆用和組件分類為主要參考。 vue組件分類: vue 組件分成幾類: page 組件 一般可覆用組件 最小單位組件 業務組件 page 組件放在 view資料夾內,每一個在router引用的view組件都是一個page,沒有覆用可能,用來協調業務組件,類似controller。 一般可覆用組件放在components資料夾內,由最小單元組件組成,通常只為了一個目標,為了增 加覆用性,提供可以配置的參數,在可覆用組件內沒有會造成副作用的功能,如call 第三方api,有的話也是通過把網址傳入達到不同的效果,跟function一樣只接收參數跟返回參數。 最小單位組件: 組件的設計就是要盡量小,然後自底而上建構複雜的組件,最小單位組件就是原子組件,通常提供默認樣式、功能和配置樣式、功能。 業務組件通常比較難覆用(除非剛好有一樣的操作邏輯),因為可能包含特定的業務邏輯和從第三方取得資料(call api)的操作,拉出組件的目的主要是為了減少和優化在page組件上的程式碼,不然都塞在page組件也是可以運作。 現有組件庫 element ui: 現在的組件庫都會強調不用寫css,他們也包含了最小單位組件跟可覆用組件。 這邊只討論組件,不討論layout或是一些內建的排版class。 最小單位組件 以input來看 <el-input v-model="input" placeholder="请输入内容"></el-

vue 父子通訊

通訊方式: 參數父傳子: 參數子傳父: 參數孫傳父: 參數父傳孫: 函數父call子: 函數父call子: 函數子call父: 函數孫call父: props / emits Event Bus $emit $on $off provide / inject $listener router parameter $attrs $refs cookie localstorage sessionstorage $parent

vue 錯誤處理

crud 前端後端 命名規範

前端規範 bread browse = 抓全部 read  = 抓取一個 edit = 編輯 add = 新增 delete  = 刪除 後端規範 laravel controller resource index  = 抓全部 show = 抓一筆 create  = get 取得填單頁面 (api 沒有) store  = post 送出填單資料 update  = 更新 destory = 刪除 repository 規範crud create = 新增 read = 抓取 find = 抓取一筆 update = 更新 delete = 刪除 API規範 GET = 抓取 POST =新增 PUT = 更新 DELETE = 刪除 User module 跟 self  抓取user相關的用user 抓取跟當下使用者相關的用self 包含新增跟更新的功能 upsert

laravel + vue js 基本開發項目

vue js  多語言 權限控制 路由 (RBAC) 權限控制 button (RBAC) input填入錯誤偵測 API全域錯誤控制 response攔截器 表格 關鍵字篩選  排序 多項目篩選 分頁 laravel logging rbac api exception

動態規劃設計步驟

https://ithelp.ithome.com.tw/articles/10231119 名詞: 多階段決策 最優子結構 自下而上 自上而下 重疊子問題 狀態轉移方程 題目: 解码方法 最长回文子串 最长和谐子序列  最大子序和 不同路径 最长递增子序列 1. 定義dp 定義dp[i]的意義 2. 定義邊界條件 dp[i]在最簡單的狀態,應該是有直接的解答。 3. 初始化 根據邊界條件,初始化dp 4. 定義狀態轉移方程 dp[i] 怎麼推論到 dp[i+1] 5. 找出解答 找出最後要輸出的答案 分類 自底而上:動態規劃 自頂而下:記憶化搜索 二維解法 一維解法 固定數量的變數

物件導向書單

 設計模式之禪 clean code系列 UML模式和應用 重構 反模式 大話設計模式 研磨設計模式 OOD啟思路 clean architecture 敏捷軟體開發:原則、樣式及實務 網站 https://www.runoob.com/design-pattern/ https://refactoring.guru/

設計模式

https://blog.csdn.net/ShuSheng0007/article/details/115980889 建造者模式 建構表示分離 隱藏並封裝建構過程 Telescoping Constructor Pattern (伸縮建構式) 條列的建構子 鍊式調用setter 桥接模式 缺點: 需要正確辨識獨立维度,增加複雜度。 外观模式 子系統 統一操作介面,隱藏模塊細節。 優: 降低複雜度。 缺: 子系統改變,需要跟著變。

物件導向設計

1. 分離關注 2. 看看是否違反單一職責 3. 如何測試 4. 封裝是否有直接被使用到的數據 5. 封裝變化的部分 6. 尋找其他可能出現的類 7. rdd 誰應該被分配什麼職責 8. 接口編程 9. solid 單一職責 開閉原則 接口隔離 里氏替換 依賴倒置 10. grasp 職責分配原則  * Information Expert * Creator * Controller * Low Coupling * High Cohesion * Indirection * Polymorphism * Pure Fabrication * Protected Variations 11. 設計一個function 先考慮怎麼使用這個function比較方便 12. 不要相信前端數據 後端應該要隨時驗證資料是否合法 13. interface 即服務 14. 面向接口 https://www.gushiciku.cn/pl/g2Y6/zh-hk https://learnku.com/articles/30034 https://ithelp.ithome.com.tw/articles/10254804 於封裝也稱為信息的隱藏,體現的最淋漓盡致的地方就是來定義接口了,在接口中我們沒有任何功能的實現,只是定義了一系列抽象的方法聲明。在Java中接口是體現封裝最常用的方法 封裝的好處 : 1、實現專業的分工 2、減少代碼的耦合 二、繼承 : 所謂繼承是Java中面向對象最顯著的一個特徵,繼承是從已有的類中派生出新的類,新的類可以吸收已有的屬性、行為,並擴展新的能力。在Java中不支持多繼承,單繼承使Java的繼承關係很簡單,一個類只能有一個父類,這樣易於我們的管理,同時父類也是子類的抽象化,而子類反過來就是父類的具體化 三、多態 : 多態是三大特性中最後出現也是最重要的特性,前面的封裝和繼承都是為多態來服務的。 多態 :多態是同一個行為具有多個不同表現形式或形態的能力  ADP 無環依賴原則 在元件的依賴關係圖中不允許出現環 SDP 穩定依賴原則 朝著穩定方向進行依賴 SAP 穩定抽象原則 元件的抽象程度應該與元件的穩定程度一致   好的架構幫助你拖延決定 尖叫架構

GRASP 模式

leetcode 演算法

 Kadane's Algorithm 動態規劃常常適用於有重疊子問題和最佳子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。 重疊子問題 https://magiclen.org/dynamic-programming-basic/ 記憶法(Memoization)與製表法(Tabulation) Top-down:記憶法(Memoization) 通常用遞迴 Bottom-up:製表法(Tabulation) 通常用for 從 0 到 n 最優子結構: https://www.youtube.com/watch?v=JWTqsNvtwP4&ab_channel=GeeksforGeeks

系統奇怪狀況紀錄

1. 有一個折扣列表,分為前台可見跟後台可見,兩個地方看到的折扣列表不一樣須在資料庫設定visible欄位用1、0區分,需要兩種query撈資料。 2. laravel 返回到 view 的東西,array、object 混雜。 3. 需要去大量的table撈資料,還需整合第3方來源的資料。 4. function 有多種可能的返回格式。

面試題

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 將參數存入變數裡,而不是直接使用參數。