亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
為什么原弦有問題
價值對物體救援
特定領域字符串類型的好處
常見模式和優(yōu)化
框架和生態(tài)系統(tǒng)支持
最后的想法
首頁 后端開發(fā) php教程 字符串作為價值對象:一種現(xiàn)代的特定領域字符串類型的方法

字符串作為價值對象:一種現(xiàn)代的特定領域字符串類型的方法

Aug 01, 2025 am 07:48 AM
PHP Strings

應用價值對象代替域驅動的應用程序中的原始字符串,以防止錯誤并提高類型安全性; 1。使用原始字符串會導致原始癡迷,其中可互換的字符串類型會導致諸如參數(shù)交換之類的微妙錯誤; 2。諸如EmailAddress之類的值對象封裝了特定于域特定的字符串,并具有驗證,不變性和有意義的語義; 3。福利包括類型安全,集中驗證,通過記錄的不變性,更好的可發(fā)現(xiàn)性和一致的格式; 4??梢詾橛蜻壿嬏砑又T如ISCorporate之類的輔助方法; 5。諸如C#記錄之類的現(xiàn)代語言功能減少了樣板,而隱式運算符和在EF核心支持無縫互動的ORM中的價值轉換; 6。標準化確保一致的格式,序列化庫可以通過自定義轉換器處理這些類型; 7.源生成器可以自動化重復代碼,從而使采用更加容易; 8.從電子郵件或Phonenumber等關鍵類型開始,在清晰,正確性和可維護性方面表現(xiàn)出明顯的好處,證明特定于域特異性的字符串應獲得專用類型。

字符串作為價值對象:一種現(xiàn)代的特定領域字符串類型的方法

在域驅動的應用程序中使用字符串時,很容易將它們視為原始的,可互換的值 - 在變量,參數(shù)和數(shù)據庫字段之間自由分配。但這導致了細微的錯誤,類型安全性差和難以推斷的代碼。一種現(xiàn)代,更強大的方法是將特定于領域的字符串視為價值對象。

字符串作為價值對象:一種現(xiàn)代的特定領域字符串類型的方法

我們沒有將string直接用于電子郵件地址,電話號碼或ID之類的內容,而是將其包裝在專用類型中。這為我們提供了更好的正確性,清晰度和控制。


為什么原弦有問題

到處使用普通字符串似乎無害,但請考慮一下:

字符串作為價值對象:一種現(xiàn)代的特定領域字符串類型的方法
字符串userId =“ jane.doe@example.com”;
字符串電子郵件=“ 12345”;
sendemail(電子郵件,用戶ID);

等等 - 我們只是互換了論點嗎?編譯器不會抓住這個。兩者都是string ,因此它們可以互換,即使它們代表了非常不同的概念。

這是原始的癡迷代碼氣味:在內置類型上過度融合而不是建模域概念。

字符串作為價值對象:一種現(xiàn)代的特定領域字符串類型的方法

價值對物體救援

值對象表示由其值而不是身份定義的有意義的域數(shù)據。對于字符串,這意味著將它們包裹在強制執(zhí)行規(guī)則的輕巧,不變的類型中。

例如, EmailAddress值對象:

公共記錄電子郵件address(字符串值)
{
    公共靜態(tài)bool tryparse(字符串輸入,out emailaddress?電子郵件)
    {
        電子郵件= null;
        if(string.isnullorwhitespace(input))返回false;

        嘗試
        {
            var addr = new system.net.mail.mailaddress(input);
            if(addr.address ==輸入)
            {
                email = new emailAddress(input.trim());
                返回true;
            }
        }
        抓住 { }

        返回false;
    }

    公共覆蓋字符串toString()=> value;
}

現(xiàn)在,而不是:

 void sendemail(字符串到,字符串,從)

我們有:

 void sendemail(電子郵件address to,emailaddress from)

現(xiàn)在,功能簽名意味著一些。您不能意外地通過預期電子郵件的用戶ID。


特定領域字符串類型的好處

  • 類型安全:編譯器可防止混合不同種類的字符串。
  • 封裝:驗證邏輯生存在一個位置 - 值對象。
  • 不變性:記錄(在C#中)或類似構造確保值不會更改。
  • 可發(fā)現(xiàn)性:IDE可以建議PhoneNumber , SSN等,使API易于正確使用。
  • 一致性:所有實例都遵循相同的規(guī)則(格式化,歸一化等)。

您還可以添加幫助者:

 public bool iscorporate()=> value.endswith(“@company.com”,stringcomparison.ordinalignorecase);

常見模式和優(yōu)化

在創(chuàng)建每個字符串的新類型的同時,現(xiàn)代語言減少了開銷:

  • C#記錄免費提供Equals GetHashCode和不變性。
  • 隱式/顯式操作員(少見)可以輕松互動:
公共靜態(tài)隱式操作員字符串(emailAddress email)=> email.value;

但是要謹慎 - 如果過度使用,隱性轉換可以帶回原始問題。

或者,僅在需要時暴露.Value (例如,用于序列化),使域模型嚴格。

還考慮歸一化

公共記錄用戶名(字符串值)
{
    public用戶名():此(“ guest”){}
    public用戶名(字符串值):this(value?trim().tolowerInvariant()??“ guest”){}
}

這確保了整個系統(tǒng)的一致格式。


框架和生態(tài)系統(tǒng)支持

現(xiàn)代ORM(例如EF Core)支持值轉換以將值對象映射到數(shù)據庫列:

 ModelBuilder.entity <user>()
    .property(u => u.email)
    。

還可以教授序列化庫(System.Text.json,Newtonsoft)通過轉換器處理這些類型。

借助源生成器或羅斯林分析儀,您甚至可以自動生成的樣板(例如, NonEmptyString基本類型)。


最后的想法

將特定于領域的字符串視為價值對象不僅學術的對象 - 它可以防止錯誤,提高可維護性并使您的代碼明確意圖。

啟動?。哼x擇一個關鍵字符串(例如EmailPhoneNumber ),然后包裝。一旦看到了好處 - 更少的錯誤,清晰的API,自我紀錄的代碼 - 您會想知道為什么您不早點做。

這不是要消除字符串;這是關于給他們意義

基本上,如果字符串代表您的域中的概念,則應該得到類型。

以上是字符串作為價值對象:一種現(xiàn)代的特定領域字符串類型的方法的詳細內容。更多信息請關注PHP中文網其他相關文章!

本站聲明
本文內容由網友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
用零字節(jié)和PHP中的字符串終止解決常見的陷阱 用零字節(jié)和PHP中的字符串終止解決常見的陷阱 Jul 28, 2025 am 04:42 AM

nullbytes(\ 0)cancauseunexpectedBehaviorInphpWhenInterfacingWithCextensOsSySycallsBecaUsectReats \ 0asastringTermInator,EventHoughPhpStringSareBinary-SaftringsareBinary-SafeanDeandSafeanDeandPresserve.2.infileperations.2.infileperations,filenamecontakecontakecontablescontakecontabternallikebybybytartslikeplikebybytrikeplinebybytrikeplike'''''''';

帶有' sprintf”和' vsprintf”的高級字符串格式化技術 帶有' sprintf”和' vsprintf”的高級字符串格式化技術 Jul 27, 2025 am 04:29 AM

sprintf和vsprintf在PHP中提供高級字符串格式化功能,答案依次為:1.可通過%.2f控制浮點數(shù)精度、%d確保整數(shù)類型,并用d實現(xiàn)零填充;2.使用%1$s、%2$d等positional占位符可固定變量位置,便于國際化;3.通過%-10s實現(xiàn)左對齊、]右對齊,適用于表格或日志輸出;4.vsprintf支持數(shù)組傳參,便于動態(tài)生成SQL或消息模板;5.雖無原生命名占位符,但可通過正則回調函數(shù)模擬{name}語法,或結合extract()使用關聯(lián)數(shù)組;6.應通過substr_co

防御弦處理:防止XSS和PHP注射攻擊 防御弦處理:防止XSS和PHP注射攻擊 Jul 25, 2025 pm 06:03 PM

TodefendagainstXSSandinjectioninPHP:1.Alwaysescapeoutputusinghtmlspecialchars()forHTML,json_encode()forJavaScript,andurlencode()forURLs,dependingoncontext.2.Validateandsanitizeinputearlyusingfilter_var()withappropriatefilters,applywhitelistvalidation

與PHP的PCRE功能相匹配的高級模式 與PHP的PCRE功能相匹配的高級模式 Jul 28, 2025 am 04:41 AM

PHP的PCRE函數(shù)支持高級正則功能,1.使用捕獲組()和非捕獲組(?:)分離匹配內容并提升性能;2.利用正/負向先行斷言(?=)和(?!))及后發(fā)斷言(?

超越JSON:了解PHP的本地字符串序列化 超越JSON:了解PHP的本地字符串序列化 Jul 25, 2025 pm 05:58 PM

PHP的原生序列化比JSON更適合PHP內部數(shù)據存儲與傳輸,1.因為它能保留完整數(shù)據類型(如int、float、bool等);2.支持私有和受保護的對象屬性;3.可安全處理遞歸引用;4.反序列化時無需手動類型轉換;5.在性能上通常優(yōu)于JSON;但不應在跨語言場景使用,且絕不能對不可信輸入調用unserialize(),以免引發(fā)遠程代碼執(zhí)行攻擊,推薦在僅限PHP環(huán)境且需高保真數(shù)據時使用。

角色級的弦樂及其性能含義 角色級的弦樂及其性能含義 Jul 26, 2025 am 09:40 AM

角色級別的manipulationCanseverelyImpactperformanceInimmutable-stranguagesDuetorePeatEdeDallocations andCoppy; 1)避免使用repeatePeatedConcatenation = InvolyOps,而不是usemutablebufferslikelist''.join()inpythonorstringbuilderdringbuilderdercerinjava; 2)minimizizizizizin; 2)

導航PHP字符串編碼的迷宮:UTF-8及以后 導航PHP字符串編碼的迷宮:UTF-8及以后 Jul 26, 2025 am 09:44 AM

UTF-8處理在PHP中需手動管理,因PHP默認不支持Unicode;1.使用mbstring擴展提供多字節(jié)安全函數(shù)如mb_strlen、mb_substr并顯式指定UTF-8編碼;2.確保數(shù)據庫連接使用utf8mb4字符集;3.通過HTTP頭和HTML元標簽聲明UTF-8;4.文件讀寫時驗證并轉換編碼;5.JSON處理前確保數(shù)據為UTF-8;6.利用mb_detect_encoding和iconv進行編碼檢測與轉換;7.預防數(shù)據損壞優(yōu)于事后修復,需在所有層級強制使用UTF-8以避免亂碼問題。

PHP中的大型數(shù)據集的存儲效率字符串處理 PHP中的大型數(shù)據集的存儲效率字符串處理 Jul 26, 2025 am 09:42 AM

Processlargefilesline-by-lineorinchunksusingfgets()orfread()insteadofloadingentirefilesintomemorywithfile()orfile_get_contents().2.Minimizeunnecessarystringcopiesbyavoidingchainedstringfunctions,breakingdownoperations,andusingunset()onlargestringswhe

See all articles