オブジェクト指向言語で、自分のインスタンス変数に値をセット/更新するメソッドを許せるか

<?php
class SearchClient
{
    public function execute()
    {
        setupParameters();
        $this->resultSet = /* どこから出てきたのかわからない値を使って処理をする */
    }

    private function setupParameters()
    {
        $this->params = /* なんかやばい処理 */;
    }
}

みたいなコードを許せるか?という話である。 例示したコードは前処理的な役目が強調されているが、それに限らずいろんなメソッドからいろんなプロパティがゴリゴリ更新されるパターン全般を指す。

最初は「必要なときもあるはずだからそのユースケースを考えよう」という記事にする予定だったが、書いてるうちに許せない気持ちになってきたのでそういう記事にする。 以下では、自分で思いついたこういう処理が必要なユースケースを述べ、さらにそれに対する反論を述べる形式で進める。

初期化時点では必要ないけど特定の処理を開始する時には必要な処理がある

それは責務が複数混じったタタリ神なので、これまで君臨してくれたことに感謝をしつつタタリの元を切り離そう。

初期化すべきプロパティがたくさんあるから仕方ない

そんなに抱え込んで、タタリ神でないといえるのか? いえるしても任意のタイミングで呼べてしまう関数で初期化するのはタタリ神の元だから全部コンストラクタでやって、その後プロパティは変更しない方が良い。

そうはいっても状態を管理しないといけないんだから仕方ない

うーん。 毎回新しいインスタンス作れよ、と漠然とは思うけど、それでワークする具体的なケースがイメージできない...。 他のプロダクトはどうしてるんだろう。 状態管理のプラクティスとかあるのかな。

あったわ。

nekogata.hatenablog.com

なるほど、デザパタね。不勉強がバレたけど、子要素のインスタンスを毎回生成して、そいつは決められたルールでOutputを返すから状態管理が楽になるよ、ってことか。