テニスはシングルスまたはダブルスでプレーされます。 「プレーヤー」はダブルスを考慮に入れないため、テニススコアリングモデルのロジックがその命名全体を通じて「チーム」を参照するようにすることを検討しました。ただし、両方のモードに対応するためにコード全体でteamOne
とteamTwo
を確認しても、1人のチームは意味をなさず、スポーツは通常シングルとしてプレーされるため、扱いにくいようです。
これを調整する良い方法は何でしょうか?私は Swift API設計ガイドライン を使用しようとしているので、それを遵守しようとします。たぶん私はバイクシェディングで、teamOne
とteamTwo
は不正確でもいいのですが?
プレーヤーは、チームを構成する人数に関係なく、プレーヤーです。片側に複数のプレーヤーがいる場合、チームはチームです。名前として「サイド」を使用できますが、ここでは抽象化が欠落していると思います。シングルまたはダブルのスコアリングは同じですが、ゲームプレイとサイドごとのプレーヤー数に若干の違いがあります。これは、ロジックとデータの両方の違いにつながります。継承の素晴らしい例のように聞こえます。
TennisMatch抽象親クラスと2つの具象サブクラス(SinglesMatchとDoublesMatch)が必要です。
これにより、物事をそのまま命名するために必要な分割が得られます。 SinglesMatchには2つのサイドがありますが、サイドごとに1人のプレーヤーのみです。 DoublesMatchには、それぞれ2人のプレーヤーで構成される2つの側面もあります。
抽象化を適切に識別したので、これがキーです。物事に適切な名前を付けることができます。
まず第一に、xxxOne
とxxxTwo
を避けることを強くお勧めします。代わりに array を使用してください。これにより、エラーが発生しやすい条件をたくさん使わなくても、適切なプレーヤーとの作業が容易になります。
var players = [Player]();
...
for player in players { // for-in loop
player.doSomething();
}
player[1]; // access to a specific player
次に、ネーミング自体について説明します。個人としてplayer
をもっと見る場合、チームを1人で構成できることに本当に同意しない場合は、participant
のようなより中立的な用語を選択することができます。参加者は1人または複数のメンバーを持つことができます。
これは、Participant
クラスをサブクラス化することを除外するものではなく、さらに特定の動作またはプロパティが必要な場合は、Player
およびTeam
がそれから継承するようにします。反対側(ただし、ここではそうではないと思います)で、共通性があまり見られない場合は、Participant
をPlayer
によって実装されるプロトコルとして見ることもできます。 Team
。
通常、私の提案は公式ルールを確認することです。これらは実際にコード化されるものです。ただし、テニスの場合、ダブルスは少々後付けとして扱われるようです。 「プレーヤー」は一般的に使用され、ダブルスの場合は「プレーヤーまたはチーム」が使用されます。
正確に何を書いているかに応じて、2つのゲームクラスを名前空間に完全に分離したくなるでしょう。
Tennis.Singles.Player
そして
Tennis.Doubles.Team
Tennis.Doubles.Player
等
私はテニスのルールを完全に理解していないので、2つのバージョンのゲーム間でクラスを再利用できない可能性があるトーナメントルールをあいまいにすることに注意します。