【數據的建立與更新】
數據有兩個重要屬性:
1.首先數據是基於時間的,數據是表達一段時間內一個邏輯爲真的事實。
2.另一個屬性是數據本質上是不可變的,由於和時間有關,咱們是不能回到過去改變數據的真實性。
這兩個屬性就意味着:對數據你其實只有兩個主要的操做:1) 讀取現有數據 2) (隨着時間)添加更多新的數據
也就是從傳統的 CRUD(增查改刪-一般稱爲增刪改查) 變動爲 CR(增Create,讀-Read)。
其實U(修改)和R(刪除)是不必的,由於修改對不可變數據是不起做用的(很是相似DDD中值對象不可變,不能修改,只能更換),而大部分刪除實質是建立新數據。好比:(Bob中止跟隨Mary,可是他們不能改變他曾經跟隨過他的事實。所以刪除個他不跟隨她的數據,其實是應該增長一個數據記錄,說他在某個時刻再也不跟隨她了。)
【狀態的變化 的原子性】
其實狀態變化有兩種思惟:一種是過程形式,一種是邏輯形式。
過去咱們的實體都是列出對其認識的內在屬性,當事件發生導致實體發生變化時,每每就是加鎖後逐一改變,或者事務方式(相似副本方式)。「逐一改變」就是過程式,具體詳細地描述變化過程,因而在並行的時候缺失原子性,爲了實現避免髒讀等問題,加鎖成了一種手段。固然,事務方式也解決了這樣的問題,這與非副本的不變值對象方式,是達到一樣目的的不一樣方式,同時這二者都屬於邏輯表達。之前我做過比較,在領域當中談論邏輯變化,我認爲後者較好。
值對象是實體狀態的一種落實,我過去提出過的觀點,這是源自於狀態變化的邏輯形式思惟。談論邏輯時,狀態遷移必須具備原子性,因此我在某個帖子說值對象不變性,能夠達到去鎖的目的。
注意:值對象不變性源自值,並不是由於實體狀態,是由於值對象具備值的不變性,因此才能成爲實體狀態的落實。
一些更深刻的認識:
存在狀態變化即存在反作用(side effect),因此實體是反作用存在的因。不少人認爲反作用是壞的,應該去掉,但這隻限於邏輯運算時。只要人們想得到信息,反作用就根本不能避免,最容易理解就是print。
可變的實體與不可變的狀態,正好就是反作用存在的分界線。實體之因此會存在,實際上是由於人們想獲取信息,因而值對象(值)載體便出現了——引用對象(即實體對象)。
狀態遷移,就是實體發生變化,它說明實體從一個狀態遷移到另外一個狀態。這裏面最小單元是狀態,也就是說咱們考慮的不是狀態的構成及其內在變化(逐一改變),而是計算出新狀態,而後以「替換」的手段來實現實體變化。這與咱們所說到的值對象不變性和事實是最小單元一模一樣。(因此「狀態遷移」是一種事實觀)
狀態是表達一段時間內一個邏輯爲真的事實,這句話很好說明了事實觀與實體觀的聯繫。
過去我思考「什麼是實體」,其實實體很簡單,就是一個KEY,是爲了區別與其餘存在的存在。而咱們寫類的時候,其中的id並不是實體KEY,而「類名+類id」纔是實體KEY。因此關係數據庫中表方式與類方式相似,並不徹底知足事實觀,而key-value數據庫能更好展示邏輯。關係數據庫的數據平鋪方式,使得查詢速度極快,同時實現了邏輯查詢,但這並不是從實現「產生事實的邏輯」角度出發的——事件的角度。
immutable is eveything,不可變是一切。
狀態變化是由事件引發的,從事件來劃分。
The immutability exists not for the sake of itself. Immutability is abstraction. It does not "exist" in nature. World is mutable, world is permanently changing.....
1、
其實這就是一種「連續」和「離散」思惟的區別,儘管世界在咱們感官中是連續的,但連續過程和中間的「切面狀態」不是咱們關注的,業務說的是規則,是邏輯的,正如咱們常常說的「業務邏輯」。在規則或者邏輯中,不存在所謂的切面狀態。例如「借書」這一個原子動做,有人會「借一半」,或者說「借一半」是咱們所關注的狀態?
2、
若果咱們一個個地改屬性,當改了第一個屬性值,沒改第二個屬性值時,這就存在了所謂的切面狀態。單線程時,由於順序執行,不會讀出切面狀態,變相成爲原子操做,但多線程併發時,讀出無效的切面狀態是可能的。解決的方式:
1)改的時候不能讀,就是咱們之前用得最多的鎖;
2)隨時可讀,改的時候必須「同一時間」徹底改完,而這就是不變性的總體替換;
3)固然後來又想到一種,讀與改不會同時進行,暫時感受比較複雜,沒有深刻,淺思考了下,感受實時相對較弱。
3、
還有一點,事務性和不變性,我的認爲二者很像,但又有點不一樣:
1.事務講究複製隔離,達到不相互影響,並且最後也須要替換。
2.不變性無需複製,由於其一開始就要求在邏輯運算期間是「不能改」。
二者類似點:
1)並行時都是相互不影響;
2)更新時都是替換手段。
不一樣點:
1)事務的參與邏輯是在邏輯執行前就複製好,獲得隔離性;事務包裝整個過程,實現原子性。
2)不變性方式的「結果對象」是在邏輯執行完後,根據各類條件建立的,其原子性體如今替換,並非包裝過程。
總的來講就是一前一後,事務有點像「平行世界」的概念。還有有趣的一點是,不變性先後兩個狀態不要求是同構的。不變性還有不少有趣的地方,這裏就不一一列舉了。而不變性也有缺點的,如要多對象同時改變時,須要機制來處理。
爲何有這樣大統一美妙大道至簡的現象呢?由於計算機軟件系統是自己是符號邏輯或者形式邏輯或分析邏輯的一種體現,而不變性是邏輯上的一個基礎概念(蒯因與引用透明),若是你學習了分析邏輯的這個基礎,你就找對了方向,可是若是你學習幾十年數據結構和算法基礎,你不必定能悟出其背後的邏輯真義。
VO相對的是RO(ReferenceObject),獨立於「狀態、實體」概念的,或者說是不一樣層次的。只是VO和RO出現相對較早,並且比較吻合「狀態、實體」概念。因此,值對象只是狀態的落實,或者說實現。
「實體狀態在某個時間點上狀態是靜止的」,瞬時的實體狀態映射到計算機就是不變的數據,在對象思惟中就是值對象。而實體則是RO,不過注意的是這個引用概念有點變化,並非引用地址,而是變成實體KEY。
值對象的不變性是源自於值概念的,試想爲啥非要叫作「值對象」,而不叫「不變對象」。算法