イミュータブルなコレクションクラスでのshiftやpop
Q&A
Closed
解決したいこと
イミュータブルなコレクションクラスにおいて、shift
やpop
などの「コレクションを変更しつつ1要素を取得する処理」をどのように実装するか。
例)
言語はPHP。
トランプのデッキを示すDeckクラス。
デッキはカードのコレクション。
デッキの一番上からカードを一枚取得するshift
メソッドを実装する。取得したカードはデッキから無くなる。
Deck.php
class CardCollection
{
/** @var Card[] */
protected array $cards;
}
class Deck extends CardCollection
{
}
自分で試したこと
案1.デッキの一番上を示すindexを持たせる
Deck.php
class Deck extends CardCollection
{
private int $topIndex;
public function shift(): Card
{
$topCard = $this->cards[$this->topIndex];
$this->topIndex++;
return $topCard;
}
}
問題点:count
などを実装する時にindexの考慮が必要になる。
案2.カードと新しいデッキを返す
Deck.php
class Deck extends CardCollection
{
public function shift(): array
{
$cards = $this->cards;
$topCard = array_shift($cards);
$newDeck = new self($cards);
return [$topCard, $newDeck];
}
}
問題点:複数の値を返すことになる。(Resultクラスを作れば解決できそう)
質問
「案2.カードと新しいデッキを返す」が良いと考えているのですが、いかがでしょうか?
理由:デッキのカードが減っていくのを表現しやすいので
また、他の解決方法があればご教授いただきたいです。
PHP以外の言語でも歓迎します。
何卒よろしくお願いします。
0