ブール-良い、悪いと醜い場所がない


Bool , Boolean ,すべての型を知っています.それは私が知っているすべてのプログラミング言語の原始的なタイプです.boolは2つの可能な値- trueとfalseを含む型です.それはboolが可能性の非常に小さいセットであることを意味します.Boolのこのプロパティは、それがそうでなければならないときにBOOLが使われるならば、その強さです、しかし、それがそれを間違っていることに使うとき、それは最大の弱さです.

私は、あなたがBoolによって州の部分を表す前に2回考えるべきであるとあなたに納得させようとします.
私たちがUserを持っていると言いましょう、私はtypescript記法を使用してユーザー契約を書きます.また、この記事のコード例はTSにあります.あなたが気にしないでください、そして、それは十分に読めるでしょう.
type User = {
  id: string
  name: string
}
OK、簡単なpeasy.現在、ビジネスは我々が他のユーザーの間で管理者を持っていると言っています、そして、それらのために異なる機能があります.AHAので、最も簡単な方法は、フラグを作成することです.この小さな変更でユーザー以下
type User = {
  id: string
  name: string
  isAdmin: boolean
}
ニース、今コードでは、それは簡単にチェックするユーザーが管理者かどうかです.チェックする関数を作成します
const isAdmin = (user:User) => user.isAdmin
あまり洗練されていませんが、続けてください.今私たちの異なる振る舞いをして、私たちのisAdminフラグを使用してかなり多くのコードが行われたと仮定することができます.そのビジネスの後、我々に来て、言います-我々は、モデレーターも持ちます.そして、モデレータは、通常のユーザーまたは管理者ユーザーからの異なる種類のユーザーです.Cap、我々は現在isAdmin旗で何をすることができますか.これらのbooleansを続けて、もう一つを作成しようとしましょう
type User = {
  id: string
  name: string
  isAdmin: boolean
  isModerator: boolean
}
いいけど、かなりではない.問題は、コードが状態プロパティ間の隠れた依存関係を導入したということです.どこどこ?したがって、ユーザーがモデレータと管理者であることができないので、依存はisAdminisModeratorの間です.ので、考慮すると、それは矛盾した状態が存在するように見えるので、私はその状態に対してアプリを守る必要があります.矛盾する状態は
isAdmin: true, isModerator: true
これは単に起こることができません、しかし、型はそうすることができないと言いません.タイプ展望から、それは全く有効な形です.このコードを修正し、異なる種類のユーザーを作成する関数を作成します.
/* ... - is not spread operator but just a placeholder, I just skip rest of the code */
const createNormalUser = (...) => ({.., isAdmin: false, isModerator: false})
const createModeratorUser = (...) => ({.., isAdmin: false, isModerator: true})
const createAdminUser = (...) => ({.., isAdmin: true, isModerator: false})
私たちは、保存されていますが、一時的な(のみ):保存されますが、一時的なだけです
isAdmin: true, isModerator: true, isManager: true
isAdmin: false, isModerator: true, isManager: true
isAdmin: true, isModerator: false, isManager: true
8つの組み合わせに対しては、4が不正な場合(true、true、true)(true、false、true)(false、true、true)(true、true、false)です.この時点では、これがどこに行くかを見る必要があります.次の要件は、16の組み合わせなどを与えます.このアプローチはその形では持続不可能である.代わりに何をすべきか

救助のためのカスタムタイプ.
Booleanの制限を取り除き、正しく状態を設計しましょう.現実は、ユーザーが異なるタイプを持つことができます.したがって、適切なモデルは
type User = {
  id: string
  name: string
  userType: UserType 
}
type UserType = 'Admin' | 'Normal' | 'Moderator' | 'Manager' 
/* Yes, UserType can be also represented as Enum type */
すごい!競合する状態はない.私たちは簡単にユーザーのタイプは何であるかを確認することができます
user.userType === 'Admin'
また、それは機能で抽象化されることができます
const isAdmin = (user: User) => user.userType === 'Admin'
ご覧の通り、そのチェックに反して、それはさらに明白です
!u.isAdmin && !u.isModerator && !u.isManager // it means it is normal user
以下のようにします.
u.userType === 'Normal'
スイート😉
OK、このアプローチで得たもの
✅ 拡張可能です
✅ 競合する状態の図形を削除する
✅ より明示的です
✅ 多くのboolフィールドをチェックする際に複雑さを取り除く
タイトルをブールに行きましょう-良い、悪い、そして何も本当に.boolはどちらか良いか悪い、唯一の2つのオプションが可能であることができますので、有名な西部(良い、悪いと醜い)の文字の定義はboolとして表現可能ではありません.カスタムタイプが再び必要です😁
type CharacterType = "Good" | "Bad" | "Ugly"
親愛なる読者は、次回はデフォルトとしてboolを選択しないでください.カスタムタイプの必要性があります.