《純靠北開發日誌》改善文章內容的彙整
今天正在開發 v4.0 發現舊版本一個很有趣的地方,版友們會到純靠北工程師平台上發表文章,發表文章之後會透過審核系統審核,最後發表到各大社群平台當中,但每個社群平台所能容忍的文字數量各自不同,像是 Facebook 就沒甚麼文字限制,而 Twitter 就有英文 280 字或是中文 140 字的限制,而 Plurk 則是 360 字,這個在之前發表文章的方法中就有註記這個訊息。
1234567/** * 注意: Plurk 的內容如果超過中英文 360 字的話,多餘的內容將會被 Plurk 自動忽略。 *//** * 注意: Twitter 的內容如果超過英文 280 字或是中文 140 字的話,多餘的內容將會被 Twitter 自動忽略。 */
所以為了讓文章發表到 Facebook 的時候,文章內容可以用比較可控的方式來彙整,我寫了一個 buildContent 的方法,只需要把版友的文章內容丟進去,然後一些需要設定的參數丟進去,這個方法就會回傳我所想要的內文給我。
12345678910111213/** * @param string $content * @return s ...
《純靠北開發日誌》將專案砍掉重練有甚麼意義?
接下來會有一大段時間完全投入在純靠北工程師上,所以稍微紀錄一下 v4.0 的一些方向與構思,之後每當值得討論的議題到一定的量,就會將議題稍加整理並撰寫成文章發表。
第四次砍掉重寫相信大多數人都並不曉得我純靠北版號第一個數字代表的是甚麼意思,甚至連純靠北其實有版本號這件事情都不知道,在軟體版本號命名風格當中,第一個數字意味著軟體經過了重大更新,而我不一樣,因為這是 Side Project,所以要重大更新就砍掉重練吧!不過這招也僅限使用於 Side Project,你可以在 Side Project 實踐你各種大膽的想法,如果發生了甚麼意想不到的錯誤,你就只需要趕快修一修就好了,或者摸摸鼻子趕快回去上一個版本,但在商案上就可能不太適用了,因為商案的使用者是有付錢給公司的,你會很難給使用者一個交代。
為什麼要近乎砍掉重寫呢?如果一份專案它全部都是由你來寫的,而它已經營運了幾年,你現在回過頭來看它,儘管它目前正常營運當中,但你會有種「我好像可以寫得更好」的想法,因為你的能力可能在這幾年當中又進步了,可是又會想到如果重寫這個,那個也要跟著重寫,而這種東修一塊、西修一塊的做法,我認為很容易產生 ...
PHP Intval 的 8、7 運算 8、7 問題
欸欸、乾太,你 php 小數計算會使用套件嗎?還是使用原生的方法進行運算?因為我遇到一個問題,我有 $a = 0.1 與 $b = 0.7 這兩個變數,把他們相加乘以 10 之後,應該得出的答案是 8 沒錯吧?但我 intval 之後他給我 7 欸。
intval 這個是獲得變數其整數的方法,因此先來看個 php.net 官方文件。
intval12345678910111213141516171819202122232425262728<?phpfunction intval ($var, $base = null) {}Get the integer value of a variableintvalGet the integer value of a variable<?phpfunction intval($var, $base = 10) { }@param mixed $var — The scalar value being converted to an integer@param int $b ...
【PHP 設計模式】模板方法 Template Method
模板方法 Template Method模板方法,是一種如果這包水泥我有、你也有,就連喬瑟夫都有,那我們就應該把這八百包水泥抽離出來的設計模式,是設計模式中很簡單的模式,在模板(Template)裡頭會定義需要實作的方法,並且由繼承物件去實作或複寫,這個設計模式適用於不同物件有多處相似功能的時候,可以減少物件的耦合性過高問題。
UML
實作首先我們會需要建立一個抽象的模板,並且提供大頭菜無論健康的、壞掉的都擁有的方法,像是獲得鈴錢價格(getPrice)、獲得數量(getCount)以及計算總計鈴錢價格(calculatePrice),而有些方法需要繼承物件去實作的,例如設定鈴錢價格(setPrice),我們就需要以抽象方法的方式去定義,讓繼承物件必須去實作。
TurnipsTemplate.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566/** * Abstract Turnips ...
【PHP 設計模式】策略模式 Strategy Pattern
策略模式 Strategy Pattern策略模式,可以讓物件在運作時更改其行為或算法,你可以透過切換策略物件來改變計有的功能,你需要實作一個介面來代表這個策略物件,然後在主要類別當中去引入這個策略物件,在需要變更時來切換策略物件,來達成不同狀況下所需要的功能,就像是大頭菜的鈴錢有兩種模式,一種是原本的鈴錢,另一種則是過期後歸零,這個鈴錢運算的模式就可以抽離出來作為策略物件。
UML
實作首先我們要定義策略的介面,這個介面我們會希望策略物件必須要實作鈴錢運算(calculatePrice)的方法。
Strategy.php
12345678910/** * Interface Strategy. */interface Strategy{ /** * @return int */ public function calculatePrice(int $price, int $count): int;}
再來要實踐大頭菜的策略模式,首先是正常狀況下的大頭菜,會直接拿鈴錢價格、總數相成後即是鈴錢總價,並且將其回傳。
TurnipsStrat ...
【PHP 設計模式】狀態模式 State Pattern
狀態模式 State Pattern狀態模式,讓物件的狀態改變時,一同改變物件的行為模式,就像是大頭菜(Turnips)這個物件,有沒有壞掉只是一個狀態(State)來辨別,但如果壞掉了,那麼會因為狀態改變的關係,而讓大頭菜計算鈴錢價格的方式也跟著改變。
UML
實作因為要讓大頭菜(Turnips)掛載狀態物件,所以我們要先來定義狀態,會需要提供進入到下個狀態的方法,以及 toString 來查看當前的狀態是什麼。
State.php
123456789101112131415/** * Interface State. */interface State{ /** * @param Turnips $turnips */ public function proceedToNext(Turnips $turnips); /** * @return string */ public function toString(): string;}
首先是大頭菜剛建立出來的狀態,而大頭菜下個狀態是壞掉的狀態,所以在 p ...
【PHP 設計模式】規格模式 Specification Pattern
規格模式 Specification Pattern規格模式,將邏輯條件給抽離出來,獨立成一個模組,而不是在物件內透過邏輯判斷來撰寫複雜的程式碼,簡化物件所需要實踐的邏輯,物件可以套用一個規則,也可以套用多種規則,就像大頭菜本身的價格運算是一種規格,過期後的價格運算又是另一種規格,可以把這個價格運算的邏輯抽離出來獨立成模組。
UML
實作首當其中我們需要把大頭菜物件給建立出來,具有價格(price)以及數量(count)的記錄、讀取功能,原本會提供計算鈴錢總計(calculatePrice)的功能,但這部分是運算邏輯,所以我們需要把這個功能抽離出來放到規格模組(Specification)當中。
Turnips.php
12345678910111213141516171819202122232425262728293031323334353637383940414243/** * Class Turnips. */class Turnips{ /** * @var int */ protected int $price = 0; /** ...
【PHP 設計模式】觀察者模式 Observer Pattern
觀察者模式 Observer Pattern觀察者模式,一種現在全中國都知道你來了的模式,就有點像是收音機,打開收音機就開始自動接收廣播,關掉收音機就停止接收,就有點像是動森的連線模式,你跟朋友在同一座島遊玩時,如果有其他朋友來玩,那你們通通都會收到這個通知,然後開始看渡渡鳥航空飛起來的動畫。
UML
實作這次我們要實作有一座島嶼(Island)讓玩家(Player)加入,當有玩家加入島嶼時,島嶼上其他的玩家會收到系統通知,所以會需要讓島嶼(Island)去繼承 SplSubject 這個類別,讓島嶼可以把玩家加入島嶼當中、讓玩家離開島嶼,實作這些時也順便通知其他玩家事件的產生,最後提供一個 sendMessages 的方法來通知當前所有加入觀察者名單的玩家。
Island.php
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364/** * Class Island. */class Island ...
【PHP 設計模式】空物件模式 Null Object Pattern
空物件模式 Null Object Pattern空物件模式,一種以非 Null 的空白物件去取代 Null 的模式,其空白物件並不是拿來比對資料是否為 Null,而是讓原本應該做些事情的物件,因為空白物件而不做任何事,或是去執行預設的動作,打個比喻來說,遊戲裡面購買、販賣大頭菜是要找不同 NPC 的,如果要購買大頭菜,那就必須找曹賣(Daisy Mae)來購買,如果要販賣大頭菜則是找豆狸粒狸(Mamekichi and Tsubukichi)來販賣。
UML
實作玩家要購買、販賣大頭菜會跟 NPC 進行這些動作,所以我們要先定義 NPC 所能提供的功能有哪些,因此會有購買大頭菜、販賣大頭菜這兩個方法被定義出來,如果繼承了 NPC 這個介面就要去實作這兩個方法。
NPC.php
1234567891011121314151617/** * Interface NPC. */interface NPC{ /** * @param int $price * @param int $count */ public function buyTurn ...
【PHP 設計模式】備忘錄模式 Memento Pattern
備忘錄模式 Memento Pattern備忘錄模式,在不破壞封裝物件的前提之下,提供物件一個「皇后殺手 第三爆彈:敗者成塵」的能力,物件在極度絕望的狀態下,把當前物件炸光光,並令時間往前倒退至上一個時空紀錄點的設計模式,跟吉良吉影的不同點在於命運會跟著被改變,被破壞的東西會恢復原狀。
UML
實作為了讓大頭菜有爆掉並往前倒退至上一個時空紀錄點的功能,這次我們要先實作備忘錄模式,用來儲存大頭菜的時空狀態,好讓大頭菜可以回到過去。
大頭菜:「キラークイーン、バイツ・ザ・ダスト!」
Memento.php
12345678910111213141516171819202122232425262728293031323334353637383940414243/** * Class Memento. */class Memento{ /** * @var int */ protected int $price; /** * @var int */ protected int $count; /** * Memen ...