LoginSignup
2
0

More than 1 year has passed since last update.

メソッドチェーンの改行をどこに入れるか

Posted at
$o = new FooBarObject();
$o->setFoo('foo');
$o->setBar('bar');

こういうのを Fluent setter/getter でメソッドチェーンして複数行で書くときどう書くか、コーディング規約で決まってないので、人によって改行位置が違ってきて関係ない diff が発生するのがよくあります。こういう指針でどうかなと思ってるのをまとめました。

class FluentObject
{
    private string $foo, $bar, $baz;

    public function setFoo($v): self { $this->foo = $v; return $this; }
    public function setBar($v): self { $this->bar = $v; return $this; }
    public function setBaz($v): self { $this->baz = $v; return $this; }

    public function getFooBarBaz(): string { return $this->foo . $this->bar . $this->baz; }
}

// 複数行でどう書く?

セッター呼び出しのみの場合、最初の要素開始と最後のセミコロンの前につねに改行。順序が変わったり任意の場所にメソッドが挿入されたりするので、セミコロンや先頭行との影響をなるべく減らし、純粋な行差分にしたいです。データレコードのフィールド初期化などに多いパターン。

$o = (new FluentObject())
    // 最初に setBaz を挿入するかもしれないので改行してから
    ->setFoo('foo')
    ->setBar('bar')
    // 最後に setBaz を挿入するかもしれないのでセミコロンを次の行に
;

最後のメソッドが別の型を返す場合、最後のメソッドはセミコロンと同じ行に。必要ないのにセミコロンだけ浮いてる行はやっぱり無駄なので。クエリビルダなどに多いバターン。

$s = (new FluentObject())
    ->setFoo('foo')
    ->setBar('bar')
    ->getFooBarBaz();
    // getFooBarBaz の次になにか挿入される可能性はないのでセミコロンとセット

最初のメソッドがお約束で決まっている場合、可変な要素が出てくるまではなるべく改行しない。$this->createMockBuilder(...) でおなじみのパターン。

class FluentObjectFactory
{
    public function create(): FluentObject{ return new FluentObject(); }
}

$o = (new FluentObjectFactory())->create()
    // create の前になにか挿入される可能性はないので改行なし
    ->setFoo('foo')
    ->setBar('bar')
;

結論: 構文では決まらないよね。セマンティックだよね。

いかがだったでしょうか? ご意見はコメントでどうぞ。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0