ドメイン駆動型アプリケーションの生文字列は、バグを防ぎ、タイプの安全性を改善するために、値オブジェクトに置き換える必要があります。 1.生の文字列を使用すると、互換性のある文字列タイプが引數(shù)のスワッピングなどの微妙なバグを引き起こす可能性がある原始的な強迫観念につながります。 2。emailAddressなどの値オブジェクトは、検証、不変性、意味のあるセマンティクスを備えたドメイン固有の文字列をカプセル化します。 3。利點には、タイプの安全性、集中検証、記録による不変性、より良い発見可能性、一貫したフォーマットが含まれます。 4。IsCorporateのようなヘルパーメソッドは、ドメインロジックに追加できます。 5. C#レコードのような現(xiàn)代言語の機能は、ボイラープレートを減らしますが、EFコアのようなORMの暗黙的な演算子とバリュー変換はシームレスなインターナップをサポートします。 6.正規(guī)化により、一貫したフォーマットが保証され、シリアル化ライブラリはカスタムコンバーターを介してこれらのタイプを処理できます。 7.ソースジェネレーターは繰り返しコードを自動化して、採用を容易にすることができます。 8.電子メールやPhoneNumberなどの重要なタイプで小規(guī)模で開始することは、明確さ、正確性、保守性に明確な利點を示し、ドメイン固有の文字列が専用の種類に値することを証明します。
ドメイン駆動型アプリケーションで文字列を使用する場合、変數(shù)、パラメーター、およびデータベースフィールドの間で自由に割り當てる生の互換性のある値として簡単に扱うことができます。しかし、これは微妙なバグ、タイプの安全性の低さ、そして推論するのが難しいコードにつながります。最新のより堅牢なアプローチは、ドメイン固有の文字列を値オブジェクトとして扱うことです。

電子メールアドレス、電話番號、IDなどにstring
を直接使用する代わりに、専用のタイプでラップします。これにより、正確性、明確さ、制御が向上します。
生の文字列が問題になる理由
どこでも普通の文字列を使用することは無害に見えるかもしれませんが、これを考慮してください。

string userid = "jane.doe@example.com"; 文字列email = "12345"; sendemail(email、userid);
待ってください - 私たちは議論を交換しましたか?コンパイラはこれをキャッチしません。どちらもstring
であるため、非常に異なる概念を表していても、それらは交換可能です。
これは原始的な強迫観念コードの匂いです。ドメインの概念をモデリングする代わりに、組み込みの型に依存することです。

救助にオブジェクトを大切にします
値オブジェクトは、アイデンティティではなく、その値によって定義される意味のあるドメインデータを表します。文字列の場合、これは、ルールを強制する軽量で不変のタイプでそれらを包むことを意味します。
たとえば、 EmailAddress
値オブジェクト:
公共記録emailAddress(文字列値) { public static bool tryparse(文字列入力、emailAddress?電子メール) { email = null; if(string.isnullorwhiteSpace(input))falseを返します。 試す { var addr = new System.net.mail.mailaddress(input); if(addr.Address ==入力) { email = new EmailAddress(input.trim()); trueを返します。 } } キャッチ{} falseを返します。 } パブリックオーバーライドstring toString()=> value; }
今、代わりに:
void sendemail(string to、stringから)
我々は持っています:
void sendemail(emailAddress to、emailAddressから)
関數(shù)の署名は、現(xiàn)在何かを意味します。メールが予想される場合は、誤ってユーザーIDを渡すことはできません。
ドメイン固有の文字列タイプの利點
- タイプの安全性:コンパイラは、さまざまな種類の文字列の混合を防ぎます。
- カプセル化:検証ロジックは、1つの場所(値オブジェクト)に存在します。
- 不変性:レコード(C#)または同様のコンストラクトにより、値が変更されないようにします。
- 発見可能性:IDESは、
PhoneNumber
、SSN
などを提案することができ、APIを正しく使いやすくすることができます。 - 一貫性:すべてのインスタンスは同じルール(フォーマット、正規(guī)化など)に従います。
ヘルパーを追加することもできます。
public bool iscorporate()=> value.endswith( "@company.com"、stringcomparison.ordinalignorecase);
一般的なパターンと最適化
文字列ごとに新しいタイプを作成することは冗長感を感じるかもしれませんが、現(xiàn)代の言語はオーバーヘッドを減らします:
- C#レコードは、
Equals
、GetHashCode
、および無料で不変性を提供します。 - 暗黙的/明示的な演算子(控えめに使用)は、互換性を容易にすることができます:
public static Implict operator String(emailAddress email)=> email.value;
しかし、注意してください - 暗黙的な変換は、使いすぎると元の問題を取り戻すことができます。
または、必要な場合に.Value
(シリアル化の場合)。ドメインモデルを厳格に保つ。
正規(guī)化も考慮してください。
パブリックレコードユーザー名(文字列値) { public username():this( "guest"){} public username(string value):this(value?.trim()。tolowerinvariant()?? "guest"){} }
これにより、システム全體で一貫したフォーマットが保証されます。
フレームワークとエコシステムのサポート
最新のORM(EF Coreなど)は、値オブジェクトをデータベース列にマッピングするための値変換をサポートします。
modelbuilder.entity <user>() .property(u => u.email) .hasconversion(e => e.value、s => emailaddress.parse(s));
シリアル化ライブラリ(System.text.json、Newtonsoft)は、コンバーターを介してこれらのタイプを処理するように教えることもできます。
また、ソースジェネレーターまたはRoslynアナライザーを使用すると、一般的なパターン(たとえば、 NonEmptyString
ベースタイプ)のために自動生成ボイラープレートを使用することもできます。
最終的な考え
ドメイン固有の文字列をバリューオブジェクトとして扱うだけでなく、バグを防ぎ、メンテナビリティを改善し、コードの意図を明確にします。
スモールを開始します:1つの重要な文字列( Email
やPhoneNumber
ような)を選択して包みます。より少ないバグ、より明確なAPI、自己文書化コードなどの利點がわかったら、なぜあなたはそれを早くやらなかったのだろうと思います。
文字列を排除することではありません。それは彼らに意味を與えることです。
基本的に、文字列がドメイン內の概念を表す場合、タイプに値します。
以上がバリューオブジェクトとしての文字列:ドメイン固有の文字列タイプへの最新のアプローチの詳細內容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

sprintfとvsprintfは、PHPで高度な文字列フォーマット関數(shù)を提供します。回答は次のとおりです。1。浮動小數(shù)點精度と%dは%.2fを介して制御でき、dで整數(shù)型を確保でき、dでゼロパディングを実現(xiàn)できます。 2.変數(shù)位置は、%1 $ sや%2 $ dなどの位置的プレースホルダーを使用して修正できます。これは、國際化に便利です。 3.左アライメントと]右アライメントは、テーブルまたはログ出力に適した%-10Sで達成できます。 4。VSPRINTFは、SQLまたはメッセージテンプレートの動的生成を容易にするアレイパラメーターをサポートします。 5.元の名前のプレースホルダーはありませんが、{name}構文は通常のコールバック関數(shù)を介してシミュレートできます。または、extract()と組み合わせて連想配列を使用できます。 6。Substr_Co

nullbytes(\ 0)cancaunextectedbehaviorinphpの場合、interfacingsostensionsustentionSystemcallsbecausectreats \ 0asaStringSarebinary-safeand-preseverfullent.2.infileoperations、infileoperations、infeNamesconteainingnullbyteslike "

PHPのPCRE関數(shù)は、高度な通常の機能をサポートしています。 2。ポジティブ/ネガティブな先制のアサーション(?=)および(??。─瑜影k行後のアサーション(???)および発行後のアサーション(??

PHPのネイティブシリアル化は、JSONよりもPHPの內部データストレージと送信により適しています1。完全なデータ型(int、float、boolなど)を保持できるため。 2。プライベートおよび保護されたオブジェクトプロパティをサポートします。 3.再帰的な參照を安全に処理できます。 4.脫介入中に手動タイプの変換は必要ありません。 5.通常、パフォーマンスはJSONよりも優(yōu)れています。ただし、言語間のシナリオで使用するべきではなく、リモートコード実行攻撃のトリガーを避けるために、信頼されていない入力のためにUnserialize()を呼び出さないでください。 PHP環(huán)境に限定されており、高忠実度データが必要な場合に使用することをお勧めします。

文字levelStringManipulationCanSeverelyImpactPerformanceinimMutable-stringlanguagesdueTorepeatedalocationsandCopying;

ProcessLargeFilesline-by-lineorinchunksusingfgets()orfread()deritsofloadingEntirefilesIntomEmorywithfile()orfile_get_contents()。

PHPのpack()およびunpack()関數(shù)は、PHP変數(shù)とバイナリデータ間の変換に使用されます。 1.Pack()パッケージ整數(shù)や文字列などの変數(shù)はバイナリデータになり、Unpack()はバイナリデータをPHP変數(shù)に解凍します。どちらもフォーマット文字列に依存して、変換ルールを指定します。 2。一般的な形式コードには、C/C(/unsigned文字を含む8ビット)、S/S(16ビットショート整數(shù))、L/L/V/N(32ビットの長い整數(shù)、異なるエンドアンネスに対応)、F/D(フローティングポイント/ダブル精度)、A/A(塗りつぶし文字列)、X(null bute)などが含まれます。大規(guī)模なエンディアン(ネットワーク標準)。 vは、プラットフォーム間で通信するときに最初に使用する必要があります。
