2017年7月1日 星期六

一為全 全為一

資料庫如果面臨 資料具有狀態及歷程特性 且 需要因特定狀況下取消/復原狀態 或 差異比對

每次狀態變更 都新增一筆全新的紀錄 或許 比重複修改狀態欄位 來得簡單

這其實就是 前端 單向資料流 的概念嘛

2017年6月13日 星期二

Javascript 用雙波浪號 ~~ 來 屌炸天 轉型整數前請三思

Javascript 用雙波浪號 ~~ 來 屌炸天 轉型整數前請三思

tl;dr

曾幾何時看到別人 JS 寫雙波浪號 來把 string 轉型成 number 而且是整數

http://qa.helplib.com/84467

例如 ~~'123.456' = 123

其實效果跟 Math.floor('123.456') 一樣

某些瀏覽器可能用雙波浪寫法會快上一些

https://jsperf.com/tilde-vs-floor

然而 Number.MAX_SAFE_INTEGER 是 9007199254740991

照理來說 只要不超過這個數字 應該就沒事吧

事實上 只有 -2147483648 ~ 2147483648 範圍的值有作用

Bitwise operators treat their operands as a sequence of 32 bits (zeroes and ones), rather than as decimal, hexadecimal, or octal numbers. For example, the decimal number nine has a binary representation of 1001. Bitwise operators perform their operations on such binary representations, but they return standard JavaScript numerical values.
The numbers -2147483648 and 2147483647 are the minimum and the maximum integers representable through a 32bit signed number.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

簡單來說只要值超過 2147483648 就 GG 啦

我已經不知多少專案用了這個寫法 祈禱他們都只會小於 2147483648

如果有不幸 我相信接手的人都足夠機智 可以突破盲腸

2015年2月25日 星期三

關於 Linq To Xml 抓不到 XElement 的問題

Linq To Xml 很強大 用來處理 XML 十分方便

但是下面這個 RSS feed 卻無法順利抓到 XElement

http://www.google.com.tw/alerts/feeds/09781140062556884779/15827306603345874523





說穿了沒什麼 就是它的 XName 實際上叫 "{http://www.w3.org/2005/Atom}entry" 而非 瀏覽器上看到的 "entry"

但是第一次遇到的當下肯定覺得

X! 之前這樣寫明明就可以抓到 怎麼現在不行

著實惱人

stackoverflow





參考寫法:

2015年1月1日 星期四

搞專案就是在打牌 改需求就是在變魔術

搞專案就是在打牌 改需求就是在變魔術

剋扈 : 給我把梅花 3 搓成 黑桃ㄟ死

PM : 對呀對呀

PG : 好的 您的 黑桃ㄟ死

剋扈 : 誰跟你要黑桃ㄟ死了 現在要同花順

PM : 對呀對呀

PG : 可是只有一張牌

剋扈 : 那是你家的事

PM : 對呀對呀

PG : ...

2014年8月17日 星期日

一秒看破 C# Attribute

他...我們絕非從未謀面

他...總是悄悄的守候在我們身旁

他...默默犧牲奉獻幫我們做了許多事

他是我們 最熟悉的陌生人

~ C# Attribute ~





此屬性 (Attribute) 非彼屬性 (Property)

對岸管他叫 "特性"

這裡還是叫他 Attribute 吧

M$ 的說明:

C# 提供了一個定義宣告式標記 (Tag) 的機制,此宣告標記稱為屬性 (Attribute),可以讓您在原始程式碼中放置一些實體,來指定額外的資訊。屬性所包含的資訊可以在 Run Time 時透過反映來擷取。您可以使用預先定義屬性 (Attribute)或者您可以定義自己的自訂屬性 http://msdn.microsoft.com/zh-tw/library/aa288059(v=vs.71).aspx





我們無時無刻都能瞥見 Attribute 的身影

加上 Attribute 我們的程式就被賦予了超能力

但是...Why?

為什麼明明我們什麼都沒做 只是加上 Attribute 程式就會多出一些能力呢?





答案顯而易見 自然是冥冥之中有股神秘的力量 Framework 幫我們完成了這些事

在 C# 物件導向 裡面通常都是靠 [繼承] 承接或擴充功能

但是[繼承]是一種垂直鏈狀的概念

當[繼承]深度越深的時候[可維護性]相對的就會變低(因為太多層了)

所以有句口訣叫做 多用合成 少用繼承

設法把不同功能拆分成 單一職責(Single Responsibility Principle)的小類別

再合體成模組級別的大類別 (怎麼合體自然也有一堆花招 EX:DI、IOC etc)

但是這僅止於 設計類別時內部自嗨的層面

有的時候需求來自是外部的





例如有個[顧客]類別有其自身的屬性方法

另外還有[店家]類別

[店家]類別自然無權干涉[顧客]類別的內部行為

理所當然[店家]對[顧客]提供服務

即便[店家]對外宣稱:我們無分男女、宗教、種族、階級、黨派,在服務上一律平等

但是用膝蓋骨想就知道那肯定是ㄊㄇ唬爛的

所以[店家]類別需要針對不同的[顧客]提供不同等級的服務

或許有人覺得那就給[顧客]一個叫做[顧客等級]的 Property 就能解決了

事實上的確可行 但是卻不是很合理

因為 Property 是屬於類別內部擁有的資訊 由類別決定如何提供給外界使用

如果[顧客]可以任意決定自身的[顧客等級]那未免也太可笑

這個時候應該使用 Attribute

Attribute 主要是給外部使用的資訊 LIKE 設定 貼標籤 註解 表述

以便[店家](外部)在使用[顧客](貼 Attribute 的類別)的時候能夠達成[提供不同等級的服務]的需求





講了那麼多 我想還是沒人懂 Attribute 到底在玩什麼把戲 (因為這就是 Attribute 的魅力特色呀 <3)

馬上來玩玩就對了





首先有兩個頁面 External 跟 Internal

分別使用 ExternalBulletin 跟 InternalBulletin

共用的部分繼承抽象類 Bulletin

Bulletin 在建構子 會使用 ArticlesFactory 來產生文章

Articles POPO 類 單純 DTO

如今響應個資法 需要 Articles 裡面的人名都改成 OO

這是一個外部因素帶來的改變 實際上 Articles 的本質不應該被改變 只是呈現的時候 人名必須要變成 OO

所以這裡設計一個 SilencerAttribute

裡面有個 SilencerMode 用來決定模式

現在可以給 ExternalBulletin 或 InternalBulletin 掛上 Attribute 了

基本上要掛哪個都可以(水平特性)

只是情境上是 外部的 Bulletin 需要保密

而內部的 Bulletin 則需要看到原始 Articles

只是掛上 Attribute 會怎樣嗎? 會有什麼事發生嗎??

用肋骨想就知道 當然不會怎麼樣 什麼鬼事也不會發生(鬼月的話就不敢保證)

Attribute 只是掛好看的標籤 自然是需要冥冥之的股神秘力量額外的類別來看這些 Attribute 做對應的變化 才會有效果

聰明的看官想必也早知道謎底了 就是 ArticlesFactory 要來幹這件事(因為[工廠]就是要[黑箱]作業呀)

這裡就能看到 ArticlesFactory 透過神奇的演算法(?) 巧妙的過濾人名 改成OO

結果顯而易見 就是 Articles 被改成OO 沒啥好講的





現在就能明白什麼是[水平擴充]了

水平層面上的 [類別] 或 [方法] 都能任意的掛上 Attribute 來擴充功能

抽換 Attribute 都不會影響該 [類別] 或 [方法] 內部的運作

但是對於 外部(會來看這些 Attribute 的 [類別] 或 [方法])來說 又能 [提供不同等級的服務]





這貨很神呀 根本可以 單排上金 的感覺 沒有缺點嗎?





缺點自然是有的

使用 Attribute 難以偵錯 因為你可能不知道 到底是誰在使用這些 Attribute

像是這個範例 是由 ArticlesFactory 來使用 Attribute 做判斷

如果並不清楚 ArticlesFactory 會使用 Attribute 的情況下

得到的 Articles 就會不如預期

可能就無法得知 到底為什麼 人名變成 OO 了

明明 CODE (垂直) 裡面都沒有寫到這段功能

這個情況在 分別開發的時候 會更顯著





那什麼時候適合使用 Attribute 呢?

.NET MVC 就是很好的示範了

Authorize HttpPost AllowHtml OutputCache

這些不影響 Controller 內部邏輯的功能 就能抽出來變成 Attribute 交由第三方 (Framework) 完成實作





最後 Attribute 還有個屌炸天的應用

極度推薦!