静的型システムは、データの不正使用を防止することについてすべてです。
これを行うタイプの明らかな例があります。
- UUIDの月を取得できません
- 2つの文字列を乗算することはできません。
さらに微妙な例があります
- あなたは机の長さを使って何かにお金を払うことはできません
- 誰かの名前をURLとして使用してHTTPリクエストを行うことはできません。
double
価格と長さの両方に使用したい場合やstring
、名前とURLの両方に使用したい場合があります。しかし、それを行うと、すばらしい型システムが破壊され、これらの誤用が言語の静的チェックに合格することができます。
ポンド秒をニュートン秒と混同すると、実行時の結果が悪くなる可能性があります。
これは特に文字列の問題です。これらは頻繁に「ユニバーサルデータタイプ」になります。
私たちは主にコンピューターとのテキストインターフェイスに慣れており、これらのヒューマンインターフェイス(UI)をプログラミングインターフェイス(API)に拡張することがよくあります。34.25を文字34.25と見なします。日付は、文字05-03-2015と見なされます。UUIDは、文字75e945ee-f1e9-11e4-b9b2-1697f925ec7bと見なされます。
しかし、このメンタルモデルはAPIの抽象化に悪影響を及ぼします。
言葉や言語は、書かれたり話されたりするので、私の思考メカニズムに何の役割も果たしていないようです。
アルバート・アインシュタイン
同様に、テキスト表現は、タイプとAPIの設計に何の役割も果たさないはずです。に注意してstring
ください!(および他の過度に一般的な「プリミティブ」タイプ)
タイプは「操作が意味をなすもの」を伝えます。
たとえば、私はかつてHTTP REST APIのクライアントに取り組んでいました。RESTは適切に行われ、ハイパーメディアエンティティを使用します。これには、関連するエンティティを指すハイパーリンクがあります。このクライアントでは、エンティティ(たとえば、ユーザー、アカウント、サブスクリプション)が入力されただけでなく、それらのエンティティへのリンクも入力されました(UserLink、AccountLink、SubscriptionLink)。リンクはの単なるラッパーにすぎませんでしたUri
が、別のタイプではAccountLinkを使用してユーザーを取得しようとすることができませんでした。すべてが単純なものでUri
あった場合、さらに悪いことに、string
これらの間違いは実行時にのみ発見されます。
同様に、あなたの状況では、1つの目的のみに使用されるデータがありますOperation
。それを他の何かに使用すべきではありません。また、Operation
作成したランダムな文字列でs を識別しようとすべきではありません。別のクラスを作成すると、コードに読みやすさと安全性が追加されます。
もちろん、良いものはすべて過剰に使用できます。検討する
それがあなたのコードにどれだけ明確になるか
使用頻度
(抽象的な意味での)データの「タイプ」が、明確な目的のために、およびコードインターフェイス間で頻繁に使用される場合、冗長性を犠牲にして、別個のクラスになる非常に良い候補です。