この概念を別の出発点から見る必要があると思います。データベース設計者の観点から見てみましょう。最初の例で渡された型は、便利な方法は言うまでもなく、独自の方法でパラメーターを定義するものではありません。
public void bookTicket(
String name,
String firstName,
String film,
int count,
String cinema);
チケットを予約している実際の顧客を指定するには、2つのパラメーターが必要です。同じ名前の2つの異なる映画(リメイクなど)、同じ名前の異なる映画(翻訳など)がある場合があります。例えば、あなたが使用している(映画館の特定のチェーンは異なる支店を持っているかもしれないので、どのように文字列の中で一貫性のある方法でそれに対処しようとしている$chain ($city)
か$chain in $city
、あるいは何か他のものとどのようにあなたはこれがあることを確認してくださいしようとしています最悪の場合、実際には2つのパラメーターを使用して顧客を指定します。名と姓の両方が指定されているという事実は、有効な顧客を保証するものではありません(2つを区別できませんJohn Doe
)。
これに対する答えは型を宣言することですが、上記で示したように、これらはめったに薄いラッパーにはなりません。ほとんどの場合、それらはデータストレージとして機能するか、何らかのデータベースと結合されます。そのため、Cinema
オブジェクトには名前、場所などが含まれる可能性があり、そのようにしてあいまいさを取り除きます。それらが薄いラッパーである場合、それらは偶然によるものです。
だから、私見ブログの投稿は「正しい型を渡すようにしてください」と言っているだけで、その作者は特に基本的なデータ型を選ぶために過度に制約された選択をしただけです(間違ったメッセージです)。
提案された代替案の方が優れています。
public void bookTicket(
Name name,
FirstName firstName,
Film film,
Count count,
Cinema cinema);
その一方で、私はブログの投稿がすべてを包み込むには行き過ぎだと思います。Count
汎用性が高すぎるため、リンゴやオレンジを数え、それらを追加しても、型システムで無意味な操作を行うことができる状況があります。もちろん、ブログと同じロジックを適用して、タイプCountOfOranges
などを定義することもできますが、それは単純な愚かでもあります。
それが価値があるもののために、私は実際に次のようなものを書くだろう
public Ticket bookTicket(
Person patron,
Film film,
int numberOfTickets,
Cinema cinema);
簡単に言えば、無意味な変数を渡すべきではありません。実際のオブジェクトを決定しない値でオブジェクトを実際に指定するのは、クエリを実行するpublic Collection<Film> findFilmsWithTitle(String title)
とき(例:)または概念実証をまとめるときだけです。あなたのタイプのシステムは、清潔に保つので、あまりにも一般的であるタイプ(Aで表される例えば映画を使用していないString
)、または厳しすぎる/特定/不自然(例えばCount
代わりにint
)。可能かつ実行可能な場合は常に、オブジェクトを一意かつ明確に定義する型を使用してください。
編集:さらに短い要約。小規模なアプリケーション(概念実証など)の場合:なぜ複雑な設計に煩わされるのですか?String
またはint
を使用して、それを使用してください。
大規模なアプリケーションの場合:基本的なデータ型を持つ単一のフィールドで構成されるクラスがたくさんある可能性は本当にありますか?そのようなクラスがほとんどない場合は、「通常の」オブジェクトだけがあり、そこには特別なことは何もありません。
文字列をカプセル化するという考えは、不完全な設計に過ぎないと感じています。小さなアプリケーションでは非常に複雑であり、大きなアプリケーションでは十分ではありません。