主頁 > 軟體設計 > 戲說領域驅動設計(二十)——值物件

戲說領域驅動設計(二十)——值物件

2022-04-03 07:51:45 軟體設計

  值物件這個東西在DDD里算是比較抽象的,好多人學了半天也學不明白,我這種聰明人也費了好大勁,總算苦心人天不負,現在也能用個有模有樣了,戰術模式中不論是領域服務、物件工廠還是資源庫,基本上您能聽懂是什么意思,在BO層中所承擔的角色也比較明確,唯獨這個值物件有點坑爹,遙想當年我在使用C#的時候,里面有一個值型別,與別人討論的時候經常會把這個東西搞混,就我現在寫東西還下意識把“值物件”寫成“值型別”呢,《實作領域驅動設計》書中針對值物件給了大概8類特性概括,如下圖所示,不過要我說,也就那么有限幾點值得注意的,如果從編程的角度來看,所謂的值物件其實也很普通,所以讓我們以白話的形式盤盤它,

一、特性

  以我來看,最難的地方就是值物件與物體型別在建模時候的決擇,有些物件可以是物體,也可以是值物件,反正你怎么想都有理,很多初學者包括我自己也時常搞迷惑,之所以出現這種問題以我現在的經歷來看有三個原因:一是在建模的時候偏離了領域驅動的約束而以資料庫為參照,畢竟我們在上學的時候學習編程都是從資料庫驅動開始的,資料庫要求每一個表都應該有個主鍵,而有的時候值物件需要單獨存在一個表中,這種情況就容易造成把值物件看成物體,其實開始設計的時候是想著圍繞著領域來搞的,不過做著做著就跑偏了,這是由于潛意識造成的偏差,第二、很多程式員您別看一說理論的時候都能夠口吐芬芳,但并沒有真正搞明白到底值物件是干什么的,它的本質到底是什么,為什么DDD先驅要特意提出這樣一個概念,沒有理論基礎在實踐中走彎路很正常;最后一個原因是程式員在設計的時候目光過于片面,只關注于眼前的需求,有些模型從當前的需求點上去看的確是值物件,如果轉而從大業務流程的角度去觀察,從全域的角度去考慮,事情就會有變化,這涉及到作業方式的變更,我感覺沒有解只能靠自己去悟了,對了,經常有人問上面的圖是怎么畫的:PPT,還湊合吧?

二、詳解

  廢話不多說,讓我們先從值物件的特征搞起,首先先說這東西的主要作用是什么,您不要一看上圖那一堆的圓圈就頭暈,是我在公司內部講解PPT時用的,主要以唬人為主,在這里就不能這么玩兒了,咱們得是小胡同里趕豬——直來直去,“構成某物——我認為這是值物件最為重要的特性,這么說吧,90%的情況下是由于這個原因才把一個模型設計為值物件的,既然是構成,他就會依附于所構成的目標物件,比如電商購物網站的訂單,一般會包含價格資訊、付款資訊、識訓資訊,如下代碼所示,

public class Order extends EntityModel<Long> {
    private string 編號;
    private string 收件人姓名;
    private string 收件人電話;
    private string 收件人所在區;
    private string 收件人所在街道;
    private string 收件人所在街道;
    private BigDecimal 總價;
    private BigDecimal 優惠價;
    private Integer 支付方式;
    private BigDecimal 支付金額;
}

  上面的代碼把所有的屬性都定義為原始型別,這樣設計物體其實也沒有什么問題,還挺直觀的,不過有些面向物件專家就感覺非常的不爽:這種設計缺少抽象能力和面向物件精神,他看著別扭,而且呢,這樣的設計會造成其所屬物件比如這里的“Order”所承受的責任有點重,假如我想知道一個訂單的待支付價格(待支付價是在總價與優惠價中選擇一個小的),就需要把這個方法寫到“Order”里,如果抽象出一個價格資訊物件呢?就可以讓它來負責處理本條業務,那“Order”物件的責任也自然就減輕了,我性子急,既然專家認為上述代碼不理想,就讓我們跟隨面向物件專家的思路,把一些相對內聚的元素組合起來成為單獨的類,比如價格資訊、支付資訊和客戶資訊等,

public class Order extends EntityModel<Long> {
    private string 編號;
    private Customer 客戶資訊;
    private Price 價格資訊;
    private Payment 支付資訊;
}

public class Customer {
    private Contact 聯系人資訊;
    private Address 地址資訊;
}

public class Contact {
    private string 收件人姓名;
    private string 收件人電話;
}

public class Address {
    private string 收件人所在區;
    private string 收件人所在街道;
    private string 收件人所在街道;
}

public class Payment {
    private Integer 支付方式;
    private BigDecimal 支付金額;
}

public class Price {
    private BigDecimal 總價;
    private BigDecimal 優惠價;
    
    public BigDecimal getFinalPrice() {
        return min(總價,優惠價);
    }
}

  這段代碼已經足夠OO了,如果想再追求極致可以把“價格”類中兩個屬性的型別從“BigDecimal”變為一個自定義型別比如“Money”,讓我們再看看“Order”的現狀,里面的大部分的屬性的型別已經從基本型別變成了自定義的類,實體化后當然就是物件了,DDD給這些物件一個新的名字:值物件,回過頭來再看本文最上面的圖,您會發現好多東西全是廢話,“構成某物”,這還用解釋?沒封裝成值物件前也是“Order”的構成要素,多封裝一層后本質也沒什么變化啊;“無識別符號”,廢話!原來也沒有啊,都是依附于訂單的,只要訂單有ID就行了,后面你完全可以根據訂單找到那些值物件;“概念整體”,有點腦子都知道啊?第二個版本的代碼就是通過把一些內聚的元素封裝為一個個值物件的,物件不是整體是什么?所以說學習值物件的時候你得去做一個像我這樣的推導,才會發現別看說得熱鬧,也不過如此,

  所謂的“修飾某物”,就是說值物件通常用于描述他所在的物體或值物件,一般會作目標物件的屬性而存在,并不會孤立的存于世上,比如上面的“價格”值物件,是用來修飾訂單的,脫離訂單談價格沒有意義,這個特性可讓幫助您在設計時決策一個物件是否應該被作為值物件看待,綜合“構成某物”特性,我們就會發現值物件在其生命周期中需要依附于某物且只屬于某物,不存在被共用的情況,拋開訂單談論“支付資訊”或“客戶資訊”我感覺就是在搞笑;一個客戶可能會下多個訂單,但每個訂單都包含一個獨立的客戶物件,它不會跨訂單共享,其實,通過這兩種特性,已經可以幫助您在99%的情況下決策一個物件到底是物體還是值物件了,說“決策”都夸張了點,應該是可以輕易的判別了,不過文章寫到這份肯定不行,不夠深入啊,我們還是要著重解釋值物件的“概念整體”特征,這個涉及值物件的本質,只有了解這些您才知道為什么在使用值物件的時候有許多的約束比如“不可變性”,也可以幫助你理解值物件的內涵并推匯出值物件的其它特征,

  通過前面的代碼案例可知我們通過把一些概念內聚的屬性組合在一起形成了值物件,這說明了什么?既然是有意的合并在一起,你就應該視值物件為一個整體!整體的意思就是不可分割(如果還能分割,您當初所做的合并就等于白干,作業自相矛盾),比如您去菜市場買龍蝦,你跟老板說只想買肉不買皮,你說他會不會砍你?有了“整體”概念或約束作為前提,你在值物件上的任何操作都必須以整體為導向,必須始終把它當成一個整體來看待,比如你想修改值物件的某個屬性值,就整另外一個值物件把原來的替換掉而不是單獨修改那個屬性,這叫整體替換,

  為什么要這樣?值物件也是一種領域模型,也要始終保持其內部業務規則的一致性(這個叫物件的不變性),為了達到這個目的,我們需要對物件的屬性做各種驗證,需要在執行某個方法時判斷此操作是否會打破規則限制,物體物件我們是這樣做的,非常麻煩,而引入值物件的一個初衷之是為了簡化物件的使用,反正我所有的方法都不會修改屬性,根本不需要做任何判斷,如果我放開修改限制,非常容易造成物件的變質,比如聯系人資訊,姓名“張三”+電話“123321”在我構建這個值物件時已經驗證過是合法的,如果允許修改單個的屬性,您把電話變成了“ABC”,造成了人是張三但電話是李四的,小心人家投訴你打騷擾,假如只有少量的物體和值物件,您并不會從此受多大的益,一個系統中數以百計的物件,我都不多說比如100個,其中90個是值物件,這個比例比較合理,由于值物件先天的不可變性,您寫代碼時不用那么多的約束判斷,這得省多大事兒?這么說吧,值物件越多,你受益越大,

  我們其實也可以把值物件想成一個Java中的Long型別的資料,您總不可能在修改它的時候只修改高32或低32位吧?要不就不修改,要修改就全部修改,好了,有了這樣一個概念作為前提,那么我們就可以推匯出以下四點,

  • 在設計值物件的時候不應該有“setter”方法來支持部分屬性值的修改,只能通過建構式進行全屬性賦值;
  • 判等的時候,應該是每個屬性值都相等才能算兩個值物件是相等的,你可以把值物件想象成由幾個原始型別屬性組成的,判等肯定要比較每一個屬性;
  • 值物件可以包含豐富的業務方法包括命令型的,但業務方法不應該修改值物件的某個屬性值;
  • 修改屬性時只能通過整體替換,

  上述四點正好可以對應開篇圖中所說的“不可變性”、“屬性判斷”、“無負作用”和“替換性”,

  寫到此,我們做一下總結:“構成某物”和“修飾某物”兩個性質幫助我們決策一個物件是物體還是值物件;“概念整體”決定了值物件在設計和操作時所要遵循的規范(參考上一段所論述的四點),至于無識別符號,這個沒什么可談的,值物件需要依附于某個物體而不能獨立存在,所以你給他識別符號也沒個卵用,要追蹤某個值物件只要通過其所屬的物體,在總結了值物件的特性后,我們來說一下使用值物件到底有哪些好處,

  好處一:簡單;由于您不能單獨修改值物件的某個屬性,也就不用加上那么多的約束和驗證,反正只有查詢操作怎么玩也不會壞的,驗證的責任在物體物件構造的時候都處理過了,我們就不用再費二次的力氣處理這些;好處二:更符合面向物件精神,通過把業務方法拆到值物件中能減少物體設計的復雜度并讓代碼看起來更加符合單一責任原則 ,下面我寫了兩段代碼,您看看哪個更好,

//訂單狀態
public class Status {
    WAITING_PAY, PAIED, COMPLETED;
    
    public boolean canPay() {
        return this == Status.WAITING_PAY;
    } 
}

public class OrderA extends EntityModel<Long> {
    private Status status;
    
    public boolean canPay() {
        return status == Status.WAITING_PAY;
    }
}

public class OrderB extends EntityModel<Long> {
    private Status status;
    
    public boolean canPay() {
        return status.canPay();
    }
}

  我把“訂單狀態”封裝為一個物體物件“Status”,方法“canPay”在實作時:類“OrderA”中實作了具體的邏輯;類“OrderB”中由“Status”來代理,如果邏輯很簡單或狀態列舉很少,這兩種寫法沒有區別,就怕訂單狀態列舉特別多的時候,由值物件自已完成相應的邏輯更優雅,復用度也會更高,這叫“知識專家”原則,即哪個物件擁有完成一個業務邏輯所需的知識就把責任放在哪個物件上面,

  關于值物件的修改,這里有一個小技巧分享,當需要修改某個值物件的時候,最好別讓客戶直接以“New”的方式來構建值物件再傳入到方法里;相反,您可以將這個值物件所需要的屬性以引數的形式傳入到方法中,在方法內部包裝成值物件后再將原值物件替換掉,這樣可以隱藏值物件的創建程序,如下代碼片段所示,

public class Order extends EntityModel<Long> {
    private PaymentDetail paymentDetail;
    
    public void pay(String payer, BigDecimal payment) {
        this.paymentDetail = new PaymentDetail(payer, Money.of(payment));
    }
}

final public class PaymentDetail extends ValueModel {
    private String payer;
    private Money payment;
}

   文章寫至這份兒上您應該明白了為什么有人說在DDD落地代碼時,大部分的物件都最好設計成值物件了吧?也明白為什么在設計物件的時候能使用值物件就不使用物體了吧?最起碼的好處是代碼更清晰、量更少、維護性更高,看起來顯得專業,人人都夸你心靈手兒巧,

三、存盤

  值物件的存盤其實也沒什么可講的,主要是太簡單了,無怪乎是兩種:1)把值物件的值和物體放在同一張表中;2)把值物件放在單獨的表中,方式一相對簡單,就是把值物件內的各個屬性映射成和物體表在一起的欄位,如下圖所示,

 

  方式二,把值物件放到單獨一個表中,如下示例所示,需要注意的是示例中“審批環節”物件在存盤到資料庫后有了一個ID屬性,這其實不影響我們的設計,莫慌,在領域模型中值物件遵守了其設計規范,沒有標識;落到了資料庫中那就是資料層面的事兒了,在關系資料庫中每個表都有個ID這是資料庫本身的約束,再說了,有就有了唄,您又不用,不過說到這塊,我突然想起了一個特別典型的案例,下面的案例您應該能看出來審批單和審批環節的關聯關系,我們以審批單ID為“A0001”的資料為例,在經過某些業務后,需要把審批環節表中ID為“N0001”行的狀態從“1”變成“2”,這怎么搞?您在加載審批單物件的時候肯定要把兩個審批環節資訊一同加載,加載后審批環節是個值物件,它都沒有ID的屬性,更別提“N0001”了,此種情況要怎么解?把值物件變成物體?

  兩種思路:一是在更新審批環節前,把資料庫中存在的資料拿出來和待持久化的資訊做對比,有變化的就是要變更的,自然就可以獲取到ID屬性了,這種方法有點扯,麻煩不說有時候甚至是不好靠譜,也就是說你根本比不了,比如上面的案例就不行,再假如在審批環節表中再加一個欄位“meta”,里面存盤了JSON格式的審批元資料,現在我把JSON中的某個節點的值改變了,你怎么比?字串比較,別鬧……JOSN格式啊大哥,兩個節點的順序不同,但節點名和值都相同,您說他是不是相等的?什么什么?排序后再比較?我……算了吧,我們還是說方式二吧,有圖有真像,

  直接把舊值物件對應的資料洗掉,再插入新的,感覺世界一下子清凈了,還費那個勁比較每個屬性,太不專業了,當然,上面例子僅出于演示作用,其實并不嚴謹,你還是需要提供一些關鍵屬性(比如審批環節+審批人ID)來幫助物體識別出待修改的值物件,這個關鍵屬性可不一定非得是ID,也就是完全不需要使用物體來替換原來的設計,

  存盤的時候,你的系統中如果有NoSQL資料庫也可以考慮去用一用,我在幾年前做過一個業務,當時設計了一組關系挺復雜的物件,持久化的時候使用了MySQL,其實當時也沒得選,按理放到MongoDB中最佳,這沒辦法,你也不能和運維去哭訴啊,加個中間件運維就需要投入更多的人力,結果,存盤特別費勁,其實如果只是花費點精力也還好,查詢才坑爹,這個案例不太好講,總之呢如果以列的方式存盤物件屬性,不知道有多少列合適,因為物件屬性的數量是動態的,即使能做也會有好多的列為空值;如果按行存,查詢支撐不了,這個事情后來也沒辦法,只能是把復雜的搜索需求取消掉了,所以舉這個案例其實是想強調我們在存盤物體的時候要靈活一點,別只認識MySQL,那東西也不是萬能的,平常多積累一些知識,關鍵時刻只有你應用的漂亮、得體,妥妥職場上最靚的仔,大家都崇拜強者,尤其是姑娘們,努力吧兄弟!

四、案例

  為了能把知識講透了,我這顆不安的心強烈要求我再多舉一些例子,它的建議我接受了,咱們不管干貨稀貨索性就多整點,以后園子里評什么敬業獎的時候,感覺得有一份歸我,其實也不是給我,是給我那顆敬業的心,Let's go……

  1、訂單與訂單項:最常見的案例,必須安排,訂單項肯定是值物件,你想看買了什么東西就必須通過訂單進行導航,脫離了訂單的訂單項就是一個沒媽的孤兒,找不到存在的理由,可憐吶!

 

   2、賬戶與實名資訊:太簡單了,不解釋,

 

   3、電商系統中的地址管理:引功能用于管理登錄賬號的不同送貨地址,地址物件在訂單中屬于值物件;在本場景中是物體,不買東西您還不讓我管理我的送貨地址?又沒吃你家大米!

 

  4、微博:必須是物體啊,要不然別人怎么參考?

 

 

  5、論壇中的貼子與評論:你猜呢?我覺得評論算是一種特殊的帖子,他關聯了被評論的物件而貼子則不需要,本質上都是一種“被發布的內容”,另外,修改貼子的時候不需要把評論一同編輯了;修改評論也不會影響貼子的狀態,兩者是一種弱關聯,表面上看洗掉了貼子其對應的評論也不復存在(此外應該用被隱藏更為合適),但帖子并沒有被一并洗掉,我們在看評論的時候其實都是通過貼子導航過去的,這個案例中僅僅是由于貼子被洗掉而失去了導航點,并不代表貼子與評論具有相同的生命周期,所以我猜這兩個都是物體,再說了,我還能針對評論再給出新的評論呢,你不把它當成物體合適嗎?

  6、角色與權限:兩物體唄,權限可以屬于多個角色,角色也包含多個權限,多對多的關系,多對多的時候,兩邊肯定都是物體,下面的圖只畫了一個方向的多重關聯,因為那是設計模型,設計模型中不應該存在多對多的情況,

 

總結

  這章字寫得有點多,本來一個沒什么可講的東西我都能給它整出花樣來,你能不服?不管怎么著,有了這些知識,我相信您應該知道何為值物件以及怎么使用了吧?等你寫面向物件的代碼多了,就會發現其實值物件真的在所有的物件中占了大多數,9:1都不夸張,再提醒一句:務必把值物件當成整體來看,從這個角度理解您會通透很多,

  寫完今天的這篇已經二十章了,可累壞了,不過好處也是大大的,能把自已所學與別人分享,這個程序讓人快樂與滿足,讓我們繼承往前行……對了,螢屏前的你也要多多努力啊,去成全自己的夢想,

附:

  在走查本文的時候,發現了一個細節沒有重點說明:值物件除了不能有識別符號(ID)和不能修改屬性外,其實和物體是一樣的,是可以有業務方法的,您可千萬別把值物件當成DTO來用,這也是一個充血模型呢,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/455440.html

標籤:領域驅動設計

上一篇:如何使用css制作材料ui芯片洗掉白色的svg圖示

下一篇:設計模式學習筆記(十一)外觀模式及其應用場景

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more